2×2矩阵式键盘摘要:本设计主要是用来学习键盘扫描程序的设计,数码管的动态显示程序设计。
设计中,将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端,当按下第0行0列时数码管就显示00,按下第0行1列时数码管就显示01,第1行0列时数码管就显示02,第1行1列时数码管就显示03。
本设计一共四个按键,用双数码管动态显示。
关键字:单片机,数码管动态显示,行列式键盘,共阴数码管一、矩阵式键盘工作原理如下图1,I/O接口线组成行、列结构,按键设置在行、列的交点上。
行线通过上拉电阻接+5V。
第一步是CPU检测键盘上是否有按键。
具体过程如下:P1.2, P1.3输出0,即将列P1.2, P1.3置成低电平,然后将行线P1.0,P1.1电平状态读入累加器A中。
如果有键按下,总有一根行线电平被拉至低电平,从而使行输入状态不全为“1”。
第二步是识别是哪一个键按下。
具体过程如下:先将P1.2输出为0,即将列P1.2置成低电平。
然后读入行线P1.0,P1.1电平状态,如果全为“1”,则按下的键不在此列;如果不全为“1”,则按下的键必在此列;而且是该列与“0”电平线相交的交点上的那个键。
再将P1.3输出为0,即将列P1.3置成低电平。
做法如上。
二、数码管动态显示原理A.数码管原理:在单片机应用系统中,经常用到LED数码管作为显示输出设备。
LED数码管虽然显示信息简单,但它具有显示清晰、亮度高、使用电压低、寿命长、与单片机接口方便等特点,所以在应用中经常使用它。
LED数码管显示器是由发光二极管按一定的结构组合起来的显示器件。
在单片机应用系统中通常使用的是8段式LED数码管显示器,他有公阳极和共阴极两种。
如图1—1所示。
其中共阳极8段发光二极管的阳极端连接在一起,阴极端分开控制,使用时公共端接电源,要使哪根数码管亮,则对应的阴极接低电平。
而共阴极8段发光二极管的阴极端连接在一,阳极端分开控制,使用时公共端接地,要使哪根数码管亮,则对应的阳极接高电平即可。
从a~g引脚输入不同的8位二进制编码,可显示不同的数字或字符。
h为小数点位。
图1—1在此我们着重介绍下本次实验中用到的共阴极结构的数码管。
在共阴极结构中,各段发光二极管的阴极连在一起,将此公共点接地,某一段发光二极管的阴极为高电平时,该段发光。
共阴极字段码:LED显示0~9某个字符时,则要求在a~dp送固定的字段码,如要使LED 显示“0”,则要求a、b、c、d、f各引脚为高电平,g和dp为低电平,字段码为“3fh” 。
dp g f e d c b a对应为0 0 1 1 1 1 1 1 。
共阴极字符0~9七段码如下:字符:0 1 2 3 4 5 6 7 8 9字段码:3fh 06h 5bh 4fh 66h 6dh 7dh 07h 7fh 6fhB.LED的动态显示方式LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O接口控制,公共端不是直接接地(共阴极)或电源(用阳极),而是通过相应的I/O接口控制。
它是循环依次使每个LED的公共端接地(共阴极)或电源(用阳极),每次接通的时间为几毫秒的时间,一次循环完毕后,下一次循环又这样的开始依次进行,从计算机的角度看是一个一个的显示,但由于人的视觉暂留效应,只要循环周期足够快,看起来所有的数码管都是一起显示的了,这就是动态显示原理。
三、系统设计部分如图1-0所示,此按键设计是以单片机8051为核心,以按键和数码管为扩展,实现键盘识别和动态显示的功能。
图1-03.2总体设计方案3.2.1 设计思路将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端,当按下第0行0列时数码管就显示00,按下第0行1列时数码管就显示01,第1行0列时数码管就显示02,第1行1列时数码管就显示03。
3.2.2 方案论证与选择方案一:将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端。
方案二:将单片机8051的并行口P0的P00,P01接键盘的行,将P0.2,P0.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端。
点评:由于在方案二中,P0口内部没有上拉电阻,如用此方案,就要比方案一多接几个上拉电阻,在键盘多的时候很容易弄错,所以在这里我们选择方案一。
四. 单元电路设计部分4.1 数码管显示电路的设计这里是将单片机8051的并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端,如图1-1。
图1-14.2 矩阵式键盘的设计将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列。
如图1-2。
五. 软件设计N NY YN NY Y六. 动态显示及键盘扫描程序#include<reg51.h> //包含特殊功能寄存器库unsigned char code table[]={0x3f,0x06,0x5b,0x4f}; unsigned char temp;unsigned char key1,key2;unsigned char i,j;void delay1() //延迟函数1{for(i=0;i<50;i++){ for(j=0;j<50;j++);}}void delay2() //延迟函数2{ for(i=0;i<50;i++){ for(j=0;j<200;j++);}}void main(void) //主函数{while(1){P1=0x03; //置行P1.0,P1.1为1,列P1.2,P1.3为0 temp=P1; //检测P1口temp=temp&0x0f; //检测列p1.2, p1.3是否有按键while(temp!=0x03){delay2();temp=P1; //再次检测是否有按键temp=temp&0x03;while(temp!=0x03){P1=0x0b; //置行P1.0,P1.1为1,列P1.2为0,P1.3为1temp=P1;temp=temp&0x0f;switch(temp){case 0x0a://检测行p1.0是否有按键key1=0;key2=1;break;case 0x09://检测行p1.1是否有按键key1=1;key2=0;break;}P1=0x07; //置行P1.0,P1.1为1,列P1.2为1,P1.3为0temp=P1;temp=temp&0x0f;switch(temp){case 0x05://检测行p1.1是否有按键key1=2;key2=3;break;case 0x06://检测行p1.0是否有按键key1=3;key2=2;break;}P2=0xef; //选择端口P2.4,数码管1显示P0=table[key1];delay1();P2=0xdf;//选择端口P2.5,数码管2显示P0=table[key2];delay1();}}}}七、双机通讯原理实现单片机的双机通讯是使用单片机的串口进行数据的发送和接收。
两机之间遵循严格的通信协议。
必须在一方发送的时候另一方进行接受,在时序上不能出现错误。
进行双机通讯前必须先对单片机的串口方式进行设定。
本设计中使用方式1,设定波特率为1250bps. Bps = *(T1的溢出率)/32。
甲机发送数据ORG 0000HLJMP MAINORG 0100HMAIN: MOV TMOD,#20H ;定时器T1,工作方式2 MOV TH1,#0ecH ;设波特率MOV TL1,#0ecHMOV PCON,#00H ;电源控制寄存器SMOD位为0MOV SCON,#50H ;串口控制方式1MOV DPTR,#LEDMOV R0,#00HL4: MOV A,R0MOVC A,@A+DPTR ;查表指令SETB TR1 ;启动定时器T1MOV SBUF,A ;甲机开始发送数据LOOP: JNB TI,LOOP ;判断甲机数据有没发送完毕ACALL DELAY ;调入延迟CLR TI ;准备下一次发送数据INC R0CJNE R0,#0AH,L4 ;判断十个数据有没发送完毕SJMP MAINDELAY: MOV R1,#05H ;延迟程序L2: MOV R2,#0FFHL3: MOV R3,#0FFHL1: DJNZ R3,L1DJNZ R2,L3DJNZ R1,L2RETLED: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH END乙机接收数据ORG 0000HLJMP MAINORG 0100HMAIN: MOV TMOD,#20H ;定时器T1,工作方式2MOV TH1,#0ecH ;设波特率MOV TL1,#0ecHMOV PCON,#00H ;电源控制寄存器SMOD位为0X: MOV SCON,#50H ;串口控制方式1,允许接收SETB TR1 ;启动定时器T1LOOP: JNB RI,LOOP ;判断乙机数据有没接收完毕MOV A,SBUF ;乙机数据接收完毕,置入数据寄存器A,CPU来取数据CLR P2.4 ;选择数码管显示SETB P2.5MOV P0,A ;P0口显示数据CLR RI ;准备下一次接收数据SJMP XEnd八.总结通过这次设计,我学会了键盘识别程序,数码管动态显示程序的设计方法以及焊接电路时的几个问题,使我加深了对单片机矩阵式键盘工作原理、动态扫描原理及双机通讯的了解。
比如:用两个数码管进行动态显示时,要将数码管的数据段连接在一起,但不能公共端接在一起,否则不能进行动态显示,而且,焊接时首先要设计好元器件最好摆放位置,不要拿到扳子就盲目地焊,否则在后期调试扳子时会出现很多麻烦!在调试键盘是否有效十时,编写程序先将一个行为0,其他都为1,当执行程序的时候,如果按下某个列时能执行某个命令,该键就可以了!九.参考文献黄智伟,全国大学生电子设计竞赛训练教程,电子工业出版社骆新全,黄玲铃,电路仿真与PCB板设计,北京,北京航空天大学出版社谢维成,杨加国,单片机原理与应用,北京,清华大学出版社。