矩阵式键盘键值分别是0-9,最下面一排键位功能键,左右两个键分别为“清0键”“C”,和”“回车键”“8 ”,其它键无效。未按键不显示,每按键一次,键值在最低位显示,原键值向高位移一位。按8个键后,再按键无效。按清0键全显示“0”。按“8 ”后全部熄灭,再按键重新开始。
设计思路:
1、 动态显示。 (1)设置8个数据的一维显示数组disp[],设置位选码数组sled_bit[],对应每个数码管;设置2个一维数组,data uchar ar[8]={1,9,4,9,1,0,0,1};data uchar br[8]={2,0,1,4,1,2,1,0};按K1、K2键进入外部中断0,在外部中断程序中根据按键将ar[]、br[]数据送人disp[]。 (2) T0每500us中断1次,在T0中断中点亮一个数码管。在T0中断函数中,① P1.3=1,U1、U2输出高阻;② P1.4=1,P0口输出段码,P1.4=0,U1锁存输入的段码;③ P1.5=1,P0口输出位选码,P1.5=0,U2锁存输入的位选码;④ P1.3=0,U1、U2同时输出段码和位选码,进行显示。 2、 矩阵式键盘按键识别 (1) 行、列输出后要延时,才读出相应特征值; (2) 进行键值分析前要具备如下条件: ① 要有键按下,设a是得到的键值,if(a!=0xff)才继续进行; ②要等键弹起,若输出P2=0x0f,则P2!=0x0f 要等待,while(P2!=0x0f); ③ 每次进行完键值分析后,要延时。 3、 功能键位 设置功能键位时单独处理,对位选数组disp[]做相应的修改并修改显示标志位。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- sbit out=P1^3;
- sbit page=P1^4;
- sbit bite=P1^5;
- data uchar a,num,i,j=0,y,b;
- //char data *px;
- uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- data uchar disp[]={16,16,16,16,16,16,16,16};
- uchar table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- //uchar table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
- //uchar data b1[]={2,0,1,4,1,2,1,0};
- //uchar data b2[]={1,9,4,9,1,0,0,1};
- void delay(unsigned int i)
- {
- unsigned char j;
- for(;i>0;i--)
- for(j=0;j<125;j++)
- ;
- }
- void main()
- {
- TMOD=0x01; //定时器T0的方式1
- //TMOD=0x50; 定时器T1的方式1
- TH0=65036/256;
- TL0=65036%256;
- ET0=1;
- EA=1;
- // TR0=1;
- EX0=1; //开关外部中断
- IT0=1; //外部中断0触发方式为跳变沿触发
- PX0=1; //设置外部中断0优先于1;
- // out=1;
- // P0=0xff;
- while(1){
- TR0=1;
- P2=0xf0;
- a=P2;
- // a=~a;
- P2=0x0f;
- b=P2;
- a=a|b;
- if(a!=0xff)
- {
- while(P2!=0x0f);
- switch(a)
- {
- case 0xee: num=0;break;
- case 0xde: num=1;break;
- case 0xbe: num=2;break;
- case 0x7e: num=3;break;
- case 0xed: num=4;break;
- case 0xdd: num=5;break;
- case 0xbd: num=6;break;
- case 0x7d: num=7;break;
- case 0xeb: num=8;break;
- case 0xdb: num=9;break;
- case 0xe7: num=12;break;
- case 0x77: num=15;break;
- }
- if(num<10&&disp[0]==16){
- for(i=0;i<7;i++)
- disp[i]=disp[i+1];
- disp[7]=num;
- }
- else if(num==12)
- {
- for(i=7;i>0;i--)
- disp[i]=disp[i-1];
- disp[0]=16;
- }else if(num==15)
- {
- for(i=0;i<8;i++)
- disp[i]=16;
- }else if(disp[0]!=16){
- for(i=0;i<7;i++)
- disp[i]=16;
- disp[7]=num;
-
- }
- }
- delay(50);
- }
- }
- void EXO_int() interrupt 0
- {
-
- }
- void T0_int() interrupt 1
- {
- uchar k;
- TH0=65036/256;
- TL0=65036%256;
- out=1;
- k=disp[j];
- P0=table2[k];//显示的值
- page=1;
- page=0;
- P0=table1[j]; //显示的位
- bite=1;
- bite=0;
- out=0;
- j++;
- if(j>7) j=0;
- }
复制代码
所有资料51hei提供下载:
动态显示与矩阵键盘.zip
(22.8 KB, 下载次数: 37)
|