资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,电子工程设计,I-2,显示与键盘控制电路设计与实现,显示与键盘控制电路设计与实现,一,.,基本要求,1. 4,位,7,段数码显示,前,3,位含小数点,2. 0 9,数字输入键及若干功能设置按键控制,3.,独立电路板安装结构,2.1 LED,数码显示器内部电路,a,b,c,d,e,f,g,dp,1,2,3,4,5,10,9,8,7,6,e,d,Vcc,c,dp,g,f,Vcc,a,b,1,2,3,、,8,4,5,10,9,7,6,e,d,c,dp,b,a,f,g,1,2,4,5,10,9,7,6,e,d,c,dp,b,a,f,g,3,、,8,共阳,共阴,二,.,显示电路基本原理,本实验中用到,2,位数码管,2.2,用,74LS273,设计显示数据输出电路,显示数据输出,74LS273,输出,P2.0,(,A8,),D0D7,显示内容刷新,Q1Q8,Q1Q8,74LS273,C8051F023,74LS32,数码管,“静态”缺陷,:,芯片较多、影响总线驱动,2.3.1.,静态,扫描显示控制电路,2.3,基本显示控制电路,二次译码,单片机板,AT89C51,(,PDF,:,Rev. 0265G02/00,,第,13,页,),CS,2.3.2.,动态,扫描显示控制电路,驱动,驱动,驱动,驱动,C8051,F023,74LS32,74LS273,原理图,Q1Q8,LED1,LED2,LED3,LED4,LED1,LED2,LED3,LED4,P30,P31,P32,P33,20mS,时序图,“动态”缺陷,:,需外加驱动、程序控制麻烦(必须,20ms,以内写,4,次数)、瞬间点亮,LED,(,LED,的频繁开关影响电源,造成冲激,对模拟电路不利),显示控制电路方案,对比,静态显示电路方案,:使用的元件多,成本相对较高。每位独立控制,程序设计比较简单,适用于显示位数较少的场合。采用此方案。,动态显示电路方案,:电路简单,成本低,控制程序复杂,适用于显示位数较多的场合。,三,.,按键控制电路基本原理,3.1,轻触按键内部电路,实物外形示意,内部电路,电路符号,3.2,用,74LS244,设计键盘状态读入电路,键盘状态,74LS244,输出,P2.0,(,A8,),键盘状态读入,74LS244,C8051F023,74LS32,AT89C51,(,PDF,:,Rev. 0265G02/00,,第,12,页,),最大值:,252ns,最小值:,0ns,最大值:,97ns,12 MHz Oscillator,3.3,基本键盘状态读取方式,3.3.1,按键状态,直接读取,电路,单片机板,二次译码,3.3.2,阵列式键盘及其状态读取电路,阵列式键盘电路工作原理,S1,S2,S3,S4,R1,R2,R3,R4,K0,K1,K2,K3,K7,K11,K15,K14,K13,K12,K8,K9,K10,K6,K5,K4,原理图,R1,R2,R3,R4,S1S4,时序图,D0D7,D0D7,P2.0,P2.0,D0D7,R1R4,S1S4,1Y11Y4,74LS244,74LS273,原理图,时序图,74LS32,阵列式键盘电路设计参考,键盘实现方案一:,先写后读,键盘实现方案二:,仅读操作,R1,R2,R3,R4,调试代码,直读键盘电路方案,:按键较多时,成本高,控制程序较简单,适用于按键较少的场合。,矩阵键盘电路方案,:按键较多时,成本低,控制程序较直读电路复杂,适用于显示位数较多的场合。采用此方案。,按键状态读取方案,对比,四,.,显示控制与按键状态读取集成电路方案,显示控制电路,键盘控制电路,译码电路,4.1.,电路方案方框图,4.2.,安装结构,+5V,+5V,ALE,RST,WR,D0,RD,D1,A4,D2,A3,D3,A2,D4,A1,D5,C4,D6,C3,D7,C2,C1,GND,GND,显示键盘电路,ROW5,ROW5,ROW4,ROW4,LINE1,LINE1,LINE2,LINE2,ROW3,ROW3,ROW2,ROW2,LINE3,LINE3,ROW1,ROW1,LINE4,LINE4,显示,键盘,板,电路板母版,图,显示板焊接参考图,1.,显示电路模块调试,汇编程序,$include (C8051F020.inc),DP_DATA1 EQU 000H,DP_DATA2 EQU 100H,DP_DATA3 EQU 200H,DP_DATA4 EQU 300H,清除显示;,MAIN:LCALL Init_Device,CLR A,MOV DPTR,#DP_DATA1,MOVX DPTR,A,MOV DPTR,#DP_DATA2,MOVX DPTR,A,七,.,使用集成调试环境调试显示电路模块,MOV DPTR,#DP_DATA3,MOVX DPTR,A,MOV DPTR,#DP_DATA4,MOVX DPTR,A,显示数据寄存器,R7,清,0,;,MOV R7,#0H,显示数据加,1,;,LOOP:INC R7,数据合理性检查(应该小于,10,);,MOV A,R7,小于,10,继续处理;,CJNE A,#10,L1,否则,显示数据寄存器清,0,;,MOV R7,#0H,CLR A,二进制数值转换为显示段码(换码);,L1:CALL DECODE,显示段码数据送第一位数码管显示数据所存器;,MOV DPTR,#DP_DATA1,MOVX DPTR,A,延时等待;,CALL DELAY,显示数据加,1,;,INC R7,数据合理性检查(应该小于,10,);,MOV A,R7,小于,10,继续处理;,CJNE A,#10,L2,否则,显示数据寄存器清,0,;,MOV R7,#0H,CLR A,二进制数值转换为显示段码(换码);,L2:CALL DECODE,显示段码数据送第二位数码管显示数据所存器;,MOV DPTR,#DP_DATA2,MOVX DPTR,A,延时等待;,CALL DELAY,显示数据加,1,;,INC R7,数据合理性检查(应该小于,10,);,MOV A,R7,小于,10,继续处理;,CJNE A,#10,L3,否则,显示数据寄存器清,0,;,MOV R7,#0H,CLR A,二进制数值转换为显示段码(换码);,L3:CALL DECODE,显示段码数据送第三位数码管显示数据所存器;,MOV DPTR,#DP_DATA3,MOVX DPTR,A,延时等待;,CALL DELAY,显示数据加,1,;,INC R7,数据合理性检查(应该小于,10,);,MOV A,R7,小于,10,继续处理;,CJNE A,#10,L4,否则,显示数据寄存器清,0,;,MOV R7,#0H,CLR A,二进制数值转换为显示段码(换码);,L4:CALL DECODE,显示段码数据送第四位数码管显示数据所存器;,MOV DPTR,#DP_DATA4,MOVX DPTR,A,延时等待;,CALL DELAY,返回;,JMP LOOP,二进制数值转换为显示段码(换码);,段码表头(,#TAB,)送数据指针,DPTR;,DECODE:MOV DPTR,#TAB,以显示数据作变址以段码表头作基址取段码;,MOVC A,A+DPTR,RET,延时等待;,DELAY:MOV R5,#00H,D1:MOV R6,#0H,DJNZ R6,$,DJNZ R5,D1,RET,显示段码表;,TAB:DB0C0H,0F9H,0A4H,0B0H,099H,DB092H,082H,0F8H,080H,090H,$include (Init_Device.inc),END,LOOP,L1,L2,N,N,Y,Y,2.,显示电路模块汇编调试程序流程图,L3,L4,LOOP,N,N,Y,Y,3.,显示电路模块调试,C,程序,#include C8051F020.h,#include ,absacc.h,#include ,data_define.c,#define DP1 XBYTE0x0000,#define DP2 XBYTE0x0001,#define DP3 XBYTE0x0002,#define DP4 XBYTE0x0003,#define TIMER 0x8000,#include ,Init_Device.c,unsigned char table = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;,void,delay(void,);,void,display(unsigned,char x, y);,void,main(void,),unsigned char i = 0, num = 0;,Init_Device,();,DP1 = DP2 = DP3 = DP4 = !i;,while( 1 ) ,for( num=0; num9; +num ) ,i+;,if( i = 4 ),display(i, num);,else ,i = 1;,display(i, num);,delay();,void,display(unsigned,char x, y),if( x = 1 ),DP1 =,tabley,;,else if( x = 2 ),DP2 =,tabley,;,else if( x = 3),DP3 =,tabley,;,else,DP4 =,tabley,;,void,delay(void,),unsigned,int,i;,for( i=0; iTIMER; +i );,4.,显示电路模块调试电路组成,JTAG,适配器,单片机板,C8051F,电路模块,电源板,键盘及显示板,5.,显示模块故障检测方法,运行显示模块测试程序,如果电路工作正常,在,4,个数码管上应有,数字,0-9,滚动显示。否则,说明电路存在故障,可以根据故障现象,按照下面的方法进行检查。,全黑,-,数码管,未接电源,-,74LS237,未接电源或地,-,74LS237,触发控制信号,(,CK,),不正常,-,数据线全部漏接,全亮,-,74LS237,的,CLR,引脚未接高电平,乱显示且无规律、无变化,-,74LS237,触发控制信号,(,CK,),不正常,显示不正确,但有变化,-,数据线顺序接错,74LS237,触发控制信号,(,CK,),故障,-,信号线漏接,-,无信号,74LS237,触发控制信号线上无信号,-,WR,信号线漏接或信号线无信号,-,二次译码信号线漏接或信号线无信号,WR,信号线上无信号,-,逆向检查至单片机板,WR,引脚,二次译码信号线上无信号,-,一次译码信号线漏接或信号线上无信号,-,二次译码电路,74LS138,的,E2,、,E3,连接错误,-,二次译码电路,74LS138,漏接电源或地线,-,地址信号(,74LS138,的,A,、,B,、,C,输入)不正常,一次译码信号线上无信号,-,逆向检查至一次译码,74LS138,相应引脚,地址信号不正常,-,逆向检查至单片机,P2,口,-,访问地址错误,-,访问地址错误,-,访问地址错误,1.,键盘控制模块,调试,汇编程序,$include (C8051F020.inc),KEY_WRITE EQU 400H,KEY_READ EQU 500H,DP_DATA1 EQU 000H,DP_DATA2 EQU 100H,L_BUF EQU30H,R_BUF EQU31H,清除显示;,LCALL Init_Device,MOV A,#0FFH,MOV DPTR,#DP_DATA1,MOVX DPTR,A,MOV DPTR,#DP_DATA2,MOVX DPTR,A,八,.,使用集成调试环境调试显示键盘模块,R7,作为行键值计数器,并且清,0,;,LOOP: MOV R7,#0,INC R7,当前行键值为,1,,第一行线送低电平 ;,MOV A,#0FEH,MOV DPTR,#KEY_WRITE,MOVX DPTR,A,读列键值;,MOV DPTR,#KEY_READ,MOVX A,DPTR,屏蔽列键值数据高,3,位,并更改为正逻辑;,ORL A,#0E0H,CPL A,没有键按下转第二行按键检查;,JZ JP3,列键值数据处理计数器,R5,送数据处理次数,5,;,MOV R5,#5,列键值数据寄存器,R6,清,0,;,MOV R6,#0,列键值数据处理,列键值寄存器加,1,;,JP1: INC R6,列键值数据右移,1,位;,RRC A,移出位为,1,转键值显示处理;,JC JP2,否则,检查是否处理的是最后,1,位数据(,R5=0,),;,否,继续处理后面的数据位;,DJNZ R5,JP1,是,转第二行按键检查;,JMP JP3,键值显示处理;,行键值(,R7,)送行键值数据缓冲器,L_BUF,JP2: MOVL_BUF,R7,列键值(,R6,)送列键值数据缓冲器,R_BUF,MOVR_BUF,R6,行列键值显示;,CALLDISPLAY,CALLDELAY,第二行按键检查;,JP3: INCR7,当前行键值为,2,,第二行线送低电平 ;,MOVA,#0FDH,MOVDPTR,#KEY_WRITE,MOVX DPTR,A,读列键值;,MOVDPTR,#KEY_READ,MOVX A,DPTR,屏蔽列键值数据高,3,位,并更改为正逻辑;,ORLA,#0E0H,CPLA,没有键按下转第三行按键检查;,JZ JP6,列键值数据处理计数器,R5,送数据处理次数,5,;,MOVR5,#5,列键值数据寄存器,R6,清,0,;,MOVR6,#0,列键值数据处理,列键值寄存器加,1,;,JP4: INCR6,列键值数据右移,1,位;,RRCA,移出位为,1,转键值显示处理;,JC JP5,否则,检查是否处理的是最后,1,位数据(,R5=0,),;,否,继续处理后面的数据位;,DJNZR5,JP4,是,转第三行按键检查;,JMPJP6,键值显示处理;,行键值(,R7,)送行键值数据缓冲器,L_BUF,JP5: MOVL_BUF,R7,列键值(,R6,)送列键值数据缓冲器,R_BUF,MOVR_BUF,R6,行列键值显示;,CALLDISPLAY,CALLDELAY,第三行按键检查;,JP6: INCR7,当前行键值为,3,,第三行线送低电平 ;,MOVA,#0FBH,MOVDPTR,#KEY_WRITE,MOVX DPTR,A,读列键值;,MOVDPTR,#KEY_READ,MOVX A,DPTR,屏蔽列键值数据高,3,位,并更改为正逻辑;,ORLACC,#0E0H,CPLA,没有键按下转第四行按键检查;,JZ JP9,列键值数据处理计数器,R5,送数据处理次数,5,;,MOV R5,#5,列键值数据寄存器,R6,清,0,;,MOVR6,#0,列键值数据处理,列键值寄存器加,1,;,JP7: INCR6,列键值数据右移,1,位;,RRCA,移出位为,1,转键值显示处理;,JC JP8,否则,检查是否处理的是最后,1,位数据(,R5=0,),;,否,继续处理后面的数据位;,DJNZR5,JP7,是,转第四行按键检查;,JMPJP9,键值显示处理;,行键值(,R7,)送行键值数据缓冲器,L_BUF,JP8: MOVL_BUF,R7,列键值(,R6,)送列键值数据缓冲器,R_BUF,MOVR_BUF,R6,行列键值显示;,CALLDISPLAY,CALLDELAY,第四行按键检查;,JP9:INCR7,当前行键值为,4,,第四行线送低电平 ;,MOVA,#0F7H,MOVDPTR,#KEY_WRITE,MOVX DPTR,A,读列键值;,MOVDPTR,#KEY_READ,MOVX A,DPTR,屏蔽列键值数据高,3,位,并更改为正逻辑;,ORLA,#0E0H,CPLA,没有键按下返回;,JZ JP12,列键值数据处理计数器,R5,送数据处理次数,5,;,MOVR5,#5,列键值数据寄存器,R6,清,0,;,MOVR6,#0,列键值数据处理,列键值寄存器加,1,;,JP10: INCR6,列键值数据右移,1,位;,RRCA,移出位为,1,转键值显示处理;,JC JP11,否则,检查是否处理的是最后,1,位数据(,R5=0,),;,否,继续处理后面的数据位;,DJNZR5,JP10,返回;,JMPJP12,键值显示处理;,行键值(,R7,)送行键值数据缓冲器,L_BUF,JP11: MOVL_BUF,R7,列键值(,R6,)送列键值数据缓冲器,R_BUF,MOVR_BUF,R6,行列键值显示;,CALLDISPLAY,CALL DELAY,返回;,JP12: JMPLOOP,行键值显示;,DISPLAY:MOV A,L_BUF,行键值换码;,L1:CALL DECODE,行键值段码送显示;,MOV DPTR,#DP_DATA1,MOVX DPTR,A,列键值显示;,MOV A,R_BUF,列键值换码;,L2:CALL DECODE,列键值段码送显示;,MOV DPTR,#DP_DATA2,MOVX DPTR,A,RET,行列键值换码程序;,DECODE:MOV DPTR,#TAB,MOVC A,A+DPTR,RET,$include (Init_Device.inc),END,2.,键盘控制模块汇编调试程序流程图,3.,键盘控制模块调试,C,程序,#include C8051F020.h,#include ,absacc.h,#include ,data_define.c,#include ,Init_Device.c,”,#define DP1 XBYTE0x0000,#define DP2 XBYTE0x0001,#define KEY_WR XBYTE0x0002,#define KEY_RD XBYTE0x0003,#define linescan1 0xfe,#define linescan2 0xfd,#define linescan3 0xfb,#define linescan4 0xf7,#define TIMER 0x8000,unsigned char table = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;,void,display(unsigned,char x, y),DP1 =,tablex,;,DP2 =,tabley,;,键盘实现方案一,写,读,void,main(void,) ,unsigned char,l_val,r_val,r_state, temp,conter,;,DP1 = DP2 = 0xff;,Init_Device,();,while( 1 ) ,for(,l_val,= 1;,l_val, 5; +,l_val,) ,switch(,l_val,) ,case 1: KEY_WR = linescan1; break;,case 2: KEY_WR = linescan2; break;,case 3: KEY_WR = linescan3; break;,default: KEY_WR = linescan4;,r_state,= KEY_RD ,if(,r_state,!= 0 ) ,for(,conter,=1,r_val,=1, temp=1;,conter,6;,+,conter, +,r_val, temp=,temp,1 ) ,if( (,r_state&temp,) != 0 ),display(l_val,r_val,);,判定,4.,键盘控制电路模块调试电路组成,JTAG,适配器,单片机板,C8051F,电路模块,电源板,键盘及显示板,键盘,5.,键盘控制电路模块故障检测方法,运行键盘控制电路的测试程序,如果电路工作正常,在键盘上每按,1,个键,都会通过,2,位数码显示管,显示相应的行编码和列编码。否则,说明电路存在故障,有下面多种原因。,扫描数据锁存电路和状态读入电路,-,选通信号工作不正常,-,数据线漏接或错接,-,电源及地线漏接或错接,-,上拉电阻漏接或错接,键盘电路,-L,线和,R,线漏接或错接,
展开阅读全文