1、第第8章章 单片机与显示器和键盘的接口单片机与显示器和键盘的接口 8.1 键盘接口键盘接口 键盘实际上是由排列成矩阵形式的一系列按键开关组成,用户通过键盘可以向CPU输入数据、地址和命令。键盘按其结构形式可分为:编码式键盘和非编码式键盘两类。单片机系统中普遍使用非编码式键盘,这类键盘主要解决以下几个问题:键的识别;如何消除键的抖动;键的保护。1.非编码式键盘工作原理非编码式键盘工作原理 非编码式键盘识别按键的方法有两种:一是行扫描法,二是线反转法。1)行扫描法 通过行线发出低电平信号,如果该行线所连接的键没有按下的话,则列线所接的端口得到的是全“1”信号,如果有键按下的话,则得到非全“1”信号
2、。为了防止双键或多键同时按下,往往从第 0 行一直扫描到最后 1 行,若只发现 1 个闭合键,则为有效键,否则全部作废。找到闭合键后,读入相应的键值,再转至相应的键处理程序。2)线反转法 线反转法也是识别闭合键的一种常用方法,该法比行扫描速度快,但在硬件上要求行线与列线外接上拉电阻。先将行线作为输出线,列线作为输入线,行线输出全“0”信号,读入列线的值,然后将行线和列线的输入输出关系互换,并且将刚才读到的列线值从列线所接的端口输出,再读取行线的输入值。那么在闭合键所在的行线上值必为 0。这样,当一个键被按下时,必定可读到一对唯一的行列值。2.键盘接口电路键盘接口电路 图 8.1 采用8155的
3、键盘接口电路 下面的程序是用行扫描法进行键扫描的程序,其中KS1 为判键闭合的子程序。有键闭合时(A)=0。DIR为数码显示器扫描显示子程序,执行一遍的时间约6 ms。程序执行后,若键闭合,键值存入A中,键值的计算公式是:键值=行号4+列号;若无键闭合,则A中存入标志FFH。KEY1:LCALL KS1 ;检查有无闭合键?JNZ LK1 ;(A)=0,有键闭合则转 LJMP LK8 ;无闭合键则返回 LK1:LCALL DIR ;延时 12 ms LCALL DIR ;清抖 LCALL LS1 ;再检查有键闭合否?JNZ LK2 ;有键闭合则转 LJMP LK8 ;无键闭合则返回 LK2:MO
4、V R3,00H ;行号初值送R3 MOV R2,FEH ;行扫描初值送R2LK3:MOV DPTR,0101H ;指向 8155 口A MOV A,R2 ;行扫描值送A MOVX DPTR,A ;扫描 1 行 INC DPTR INC DPTR ;指向 8155 口C MOVX A,DPTR ;读入列值 ANL A,0FH ;保留低 4 位 MOV R4,A ;暂存列值 CJNZ A,0FH,LK4 ;列值非全“1”则转 MOV A,R2 ;行扫描值送A JNB ACC.7,LK8 ;扫至最后一行则转RL A ;未扫完,则移至下一行MOV R2,A ;行值存入R2 中INC R3 ;行号加
5、1SJMP LK3 ;转至扫描下一行 LK4:MOV A,R3 ;行号送入A ADD A,R3 ;行号2 MOV R5,A ADD A,R5 ;行号4 MOV R5,A ;存入R5 中 MOV A,R4 ;列值送A LK5:RRC A ;右移一位 JNC LK6 ;该位为 0 则转 INC R5 ;列号加 1 SJMP LK5 ;列号未判完则继续LK6:MOV 20H,R5;存键值LK7:LCALL DIR ;扫描一遍显示器 LCALL KS1 ;发扫描信号 JNZ LK7 ;键未释放等待 LCALL DIR ;键已释放 LCALL DIR ;延时 12 ms,清抖 MOV A,20H ;键值
6、存入A中KND:RET LK8:MOV A,FFH ;无键标志FFH存入A中 RET KS1:MOV DPTR,0101H ;判键子程序 MOV A,00H ;全扫描信号 MOVX DPTR,A ;发全扫描信号 INC DPTR INC DPTR ;指向8155口C MOVX A,DPTR;读入列值 ANL A,0FH ;保留低4位 ORL A,F0H ;高4位取“1”CPL A ;取反,无键按下则全“0”RET 最简单的键盘、指示灯扩展法8.2 LED显示器接口显示器接口 1.LED显示器结构与原理显示器结构与原理 图 8.2 7段LED数码显示器 各段码位的对应关系如下:表 8.1十六进制
7、数及空白与P的显示段码 2.LED显示器接口电路显示器接口电路 图 8.3 6 位动态显示器接口 图 8.4 显示子程序流程图 程序清单如下:DIR:MOV R0,79H ;显示缓冲区首址送R0MOV R3,01H ;使显示器最右边位亮MOV A,R3LD0:MOV DPTR,0101H ;扫描值送PA口MOVX DPTR,AINC DPTR ;指向PB口MOV A,R0 ;取显示数据ADD A,12H ;加上偏移量MOVX A,A+PC ;取出字形MOVX DPTR,A ;送出显示 ACALL DL1;延时 INC R0;缓冲区地址加 1 MOV A,R3;JB ACC.5,LD1;扫到第
8、6 个显示位了吗?RL A;没有,R3 左环移一位,扫描下一个显示位 MOV R3,A AJMP LD0LD1:RETDSEG:DB 3FH,06H,5BH,4FH,66H,6DH ;显示段码表DSEG1:DB 7DH,07H,7FH,6FH,77H,7CH DSEG2:DB 39H,5EH,79H,71H,73H,3EHDSEG3:DB 31H,61H,1CH,23H,40H,03HDSEG4:DB 18H,00H,00H,00HDL1:MOV R7,02HDW;延时子程序DL:MOV R6,0FFHDL6:DJNZ R6,DL6 DJNZ R7,DL RET 8.3 键盘显示器接口键盘显示
9、器接口8279 8279 内部结构逻辑结构 DB0-DB7 RESET CLK IRQ内部数据总线 OUTA0-A3 SL0-SL3 RL0-RL3 SHIFT CNTL OUTB0-B3 数据缓冲器I/O控制FIFO/传感器RAM状态显示地址寄存器16 X 8显示RAM控制及定时寄存器键盘消抖及控制8x8 FIFO/传感器 RAM显示寄存器控制及定时扫描计数器回送缓冲RDWR0ABD内部模块数据缓冲数据缓冲:与DB相连控制与定时寄存器控制与定时寄存器:用于控制与寄存键盘与显示器的工作方式,锁存操作命令产生内部控制信号 定时器定时器:内部1个5位,对CLK输入进行分频,产生100kHz内部定时
10、信号,外输入信号周期不得小于500ns(8字符显示周期为5.1ms).扫描寄存器扫描寄存器:其状态以编码方式和译码方式输出回送缓冲回送缓冲+消抖控制消抖控制:锁存RL0-7输入。当某键按下,键盘数据以下列格式送FIFO/传感器 RAM 在传感器方式 RL7-RL0数据被直接送FIFO/传感器 RAMCNTLSHIFT扫描(闭合键行号)回送(闭合键列号)RL7RL6RL0内部模块 FIFO/传感器 RAM:双功能8x8RAM,在键盘或选通方式时,为FIFO RAM,其状态在对应的状态寄存器中。显示RAM:存储显示数据,在显示数据时,显示数据依此从这里输出。分为2组OUTA0-OUTA3,OUTB
11、0-OUTB3,可独立也可以联合使用。图 8.4 8279的引脚图 管脚(40个)DB0-DB7:双向缓冲数据总线-CPU RESET,Vcc,Vss A0:数据缓冲地址输入,=1,选命令或状态寄存器,=0,选数据寄存器 IRQ:中断申请,在键盘工作方式,当FIFO/传感器RAM有数据(有键闭合),变为高向CPU申请,当CPU读出后变低。若不为空,再变高,直到读完。在传感器工作方式,每当检测到传感器状态变化,变为高,申请中断。,WR,RDCS管脚 SL0-SL3:扫描输出,分为译码(内译码,4个输出信号)和编码(外译码后16个输出)RL0-RL7:回送线,内有 上拉,有键闭合变低。SHIFT:
12、扩展键盘功能 CNTR(/STB):扩展键盘功能管脚 OUTA,OUTB:A组(显示RAM高4位)和B组(显示RAM低4)显示输出 ,消隐,显示熄灭信号。BD2.8279的接口电路与应用的接口电路与应用 图 8.5 8031与 8279 接口连接框图 表8-2 8279命令功能键一览表8279命令解释显示和键盘设置:其中的传感器矩阵工作方式是指,传感器开关闭合直接使IRQ马上为1,申请中断。时钟编程命令:PPPPP=231,CLK=2M,output=100kHz,则20分频,编程命令字为34H。读FIFO/传感器RAM(A0=0):AI=1,读完该地址,读AAA+1内容。在键盘少描,AI,A
13、AA都无用。按键送入顺序读。读显示RAM(A0也=0):但D7D6D5=011,读AAAA地址内的显示内容。AI=1,显示后显示下一地址。AI=0,总显示相同地址的数。写显示RAM 屏蔽/熄灭显示器:清除命令结束中断/错误方式设置。RLRLRLRLRLRLRLRL111110101100011010001000000001010 011 100101 110 11107H0FH17H06H1FH27H 2FH37H3FH3EH3DH3CH3BH39H38H30H28H00H01H09H 11H 19H 21H0EH 16H1EH 26H2EH 36H05H04H03H02H08H0AH0BH0
14、CH0DH10H 18H1AH1BH1CH1DH20H22H23H24H25H29H2AH2BH2CH2DH12H13H14H15H31H32H33H34H35HYYYYYYYYSLSLSL012345673-8译码器012345670123AH图8-23 88键盘的键值与键号例子。8279138OUTB0dpbaOUTA3SL2SL1SL0AG2BG27Y0YRL3RL074067407x2SHIFTCNTL+5V100 欧x8初始化子程序 INTI:MOV DPTR,#7FFFH ;8279 命令口 MOV A,#0D1H;清显示(11010001)MOV DPTR,A NOP NOP L
15、OOP:MOVX A,DPTR;读状态字 JB ACC.7,LOOP;清除未完,等待 MOV A,#34H;分频系数,12M晶振,20分 MOVX DPTR,A MOV A,#00H;清键盘显示命令 MOV DPTR,A MOV IE,#84H;允许8279在外中断1中断 RET 显示子程序 DIS:MOV DPTR,#7FFFH;8279命令状态口 MOV R0,#30H;字段码首地址 MOV R7,#08H;8位显示 MOV A,#90H;送显示,显示后自动地址加1,首址0000 MOVX DPTR,A;MOV DPTR,#7EFFH;8279数据口 LP:MOV A,R0 ADD A,#
16、6 ;加偏移对准当前显示字在SEG表中位置 MOVC A,A+PC;获得显示段码 MOVX DPTR,A;送段码显示 INC R0 DJNZ R7,LP RET SEG:DB 3FH,06H,5BH,4FH,66H,6DH;see 教育188面 键盘中断子程序 KEY:PUSH PSW PUSH DPL PUSH DPH PUSH ACC PUSH B SETB PSW.3 MOV DPTR,#7FFFH MOVX A,DPTR ;读FIFO状态 ANL A,#0FH JZ PKYR ;全0无键按下 MOV A,#40H;读FIFO字送A MOVX DPTR,A;送读FIFO字到命令口 MOV DPTR,#7EFFH;数据口地址 MOVX A,DPTR ;读数据 JMP KEY1 ;转键值处理程序 PKYR:POP B POP ACC POP DPH POP DPL POP PSW RETIKEY1