230 likes | 424 Views
6.2.4 8255A 的应用举例. 例:键盘接口. 键盘 编码键盘 非编码键盘 一、键盘工作过程: 1 、键盘输入信息(按键识别、按键代码的产生) ( 1 )检测是否有键按下; ( 2 )查出按下的是哪一个键; ( 3 )转换成约定的代码。 2 、消去抖动 等按键稳定后才检测键信息 3 、防止串键(多键). 编码键盘:自动提供被按键的编码信息(如 ASCII 码),并能同时产生一个选通脉冲通知微处理器。第二、三步用硬件完成。 优点:使用方便,需较多的硬件,价格昂贵。 非编码键盘:由开关矩阵组成,全部工作靠程序来实现。
E N D
例:键盘接口 • 键盘 编码键盘 • 非编码键盘 • 一、键盘工作过程: • 1、键盘输入信息(按键识别、按键代码的产生) • (1)检测是否有键按下; • (2)查出按下的是哪一个键; • (3)转换成约定的代码。 • 2、消去抖动 • 等按键稳定后才检测键信息 • 3、防止串键(多键)
编码键盘:自动提供被按键的编码信息(如ASCII码),并能同时产生一个选通脉冲通知微处理器。第二、三步用硬件完成。编码键盘:自动提供被按键的编码信息(如ASCII码),并能同时产生一个选通脉冲通知微处理器。第二、三步用硬件完成。 • 优点:使用方便,需较多的硬件,价格昂贵。 • 非编码键盘:由开关矩阵组成,全部工作靠程序来实现。 • 优点:需硬件少,价格便宜。 • 硬件:非编码键盘接口电路如图6-19。 • 8255A的A口方式0,行输出,B口方式0,列输入。 • 按下键,与对应行列短接,通,为低电平。 • 软件:负责按键识别,按键代码的产生,用延时程序消除键的抖动等问题。
二、键的识别 • 按行和列线上的电平来识别闭合键,有两种方法: • 1、行扫描法 • 先令所有行同时接地,再检查是否有列线为低电平,若有,则说明有键按下,再用扫描法确定哪个键。 • 第0行,PA0=0,检查列线是否低电平,若是,则有键按下,处在相交位置上。找到“0”位对应的行列编号。 • …… • 第7行,PA7=0,检查列线是否低电平,若是,则有键按下,处在相交位置上。
程序如下: • PORTA EQU 0FFF8H • PORTB EQU 0FFFAH • PORTC EQU 0FFFCH • PORTCN EQU 0FFFEH • …… • JTAB DB ‘0123456789ABCDEF’ • …… • MOV DX,PORTCN ;初始化程序 • MOV AL,82H;A口出,B口入 • OUT DX,AL
WAITK: MOV DX,PORTA ;等待键闭合 • MOV AL,0 • OUT DX,AL • MOV DX,PORTB • IN AL,DX • CMP AL,0FFH • JZ WAITK • CALL DELAY ;延时20ms • ;再一次B口输入判断,去抖动 • ;确定按下的是哪个键:找到列线,保留数据,依 • ;次右移到进位位,判是否为低电平。 • ;工作单元:BL-键号,BH-行扫描值,CX-行数
MOV BL,0 • MOV BH,11111110B • MOV CX,8 ; • FNDROW: MOV AL,BH • MOV DX,PORTA • OUT DX,AL • ROL BH,1 • MOV DX,PORTB • IN AL,DX • CMP AL,0FFH;实验只2列, • JNZ FNDCOL ;与03H比较
ADD BL,8 ;实验只2列,用2 • LOOP FNDROW • JMP DONE • FNDCOL: ROR AL,1 • JNC RIGHT • INC BL • JMP FNDCOL • RIGHT: LEA SI,JTAB;产生代码 • MOV BH,0 • ADD BX,SI • MOV AL,[BX] • ;送显示或缓冲区等。
2、行反转法 • 先确定有键按下,即读入的列线值不为FFH。令 • 列线B口改为输出方式,输出刚读入的值; • 行线A口改为输入方式,读入行线值,则得到对应按下键的行列值。 • 例:9号键闭合,设为8*8 • 行线全0,读列值为11111101,再输出列线11111101后,第二次从行线上读得11111101得到列行值111111011111101B(FDFDH),对应键9。 • 每个键对应一个代码放在表中,程序通过查表确定按下哪个键。 • 实验中为8*2,则列值为00000001。
TABLE DW 0FEFEH,0FEFDH,0FEFBH • DW 0FEF7H,…… • CHAR DB ‘0123456789ABCDEF’ • 此法遇到重键时, 列值上的0超过一个,因此无对应的键代码,可判出是重键,再重新查找,解决重键问题。不必再一次B口输入判断,去抖动。 • 初始化程序,等待键闭合程序同行扫描法。其他程序如下: PUSH AX ;保存列值 • PUSH AX • CALL DELAY • MOV DX,PORTCN • MOV AL,90H; • MOV DX,AL
MOV DX,PORTB • POP AX • OUT DX,AL • MOV DX,PORTA • IN AL,DX • POP BX • MOV AH,BL;列值放AH中 • LEA SI,TABLE • LEA DI,CHAR • MOV CX,16 ;共16键 • LOOP1: CMP AX,[SI] • JZ KEYPRO
ADD SI,2 • INC DI • LOOP LOOP1 • JMP START • …… • KEYPRO: MOV DL,[DI] • MOV AH,2 • INT 21H
例: LED/开关接口 • 开关设置的二进制信息由8255A的PB口输入,经程序转换为对应的7段LED的段选码(字形码)后,通过PA口输出,由7段LED显示开关二进制状态值,试编制其控制程序。 7段LED显示器如图6-20,接口电路如图6-23。 • 分析: • (1)PA口输出后经驱动器连7段LED显示器。 • (2)8255A设置为方式工作,PA口输出,PB口输入。方式选择控制字:10000010B=82H • (3)用8086CPU,片内地址A2A1,A0空,取0。8255A端口地址为:0FFF8H, 0FFFAH, 0FFFCH, 0FFFEH。(只低字节不同)
(4)用指令XLAT实现转换。 • (5)控制程序: • DATA SEGMENT • SSEGCODE DB 0C0H,0F9H,0A4H, 0B0H • DB 99H,92H,82H,0F8H,80H • DB 98H,88H,83H,0C6H • DB 0A1H,86H,8EH • DATA ENDS • …… • MOV AX,DATA • MOV DS,AX
MOV DX,0FFFEH ;初始化8255 • MOV AL,82H • OUT DX,AL • RDPORTB:MOV DL,0FAH ;PB口输入 • IN AL,DX • AND AL,0FH ;取低4位 • MOV BX,OFFSET SSEGCODE • XLAT ;转换 • MOV DL,0F8H ;从PA口输出 • OUT DX,AL
MOV CX,56CH ;延时 • DELAY: DEC CX • JNZ DELAY • JMP RDPORTB ;重复 • (6)讨论 • 1)若驱动器为反相,则选码表全部求反。 • 2)若要循环显示0~F数字各5秒钟,且显示20遍。此时不用输入。 • 控制程序: MOV DX,0FFFEH ;初始化8255 • MOV AL,80H • OUT DX,AL
MOV BL,20 • DISPLOP:MOV DI,OFFSET SSEGCODE • MOV CX,16 • LOP: MOV AL,[DI] • MOV DL,0F8H • OUT DX,AL • CALL DELAY5S ;要编写子程序 • INC DI • LOOP LOP • DEC BL • JNZ DISPLOP • HLT
例:模拟交通灯 • 编写程序,以8255作为输出口,控制4个双色LED灯(可发红,绿,黄光),模拟十字路口交通灯管理。 • PC4~PC7连DR1~DR4,PC0~PC3连DG1~DG4。 • 红+ 绿- —— 红 • 红- 绿+ —— 绿 • 红+ 绿+ ——黄 • 1~4对应北西东南。 • 延时子程序的时长参数可通过BX传送。
状态: 设按图接法,全部反相,位置:南东西北 • 红+ 绿+ 东、南 • PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 西 北 • 0 ) 0 0 0 0 1 1 1 1 红 红 • 1) 1 0 0 1 0 1 1 0 红 绿 • 2) 1 0 0 1 1 1 1 1 红 闪 • 1 0 0 1 0 1 1 0 绿 • 0 0 0 00 1 1 0黄 • 3) 0 1 1 0 1 0 0 1 绿 红 • 4) 0 1 1 0 1 1 1 1 闪 红 • 0 1 1 0 1 0 0 1 绿 • 0 0 0 0 1 0 0 1 黄