用矩阵键盘1~6输入6个数并按位同时显示在6个数码管上。这种功能的程序只能用于练练手,没有什么实用价值。
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- uchar key=0;//键值变量
- void delayms(uint k)
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=115;j>0;j--);
- }
- void key_scan() //按键扫描程序
- {
- static bit sign=0; //按键自锁标志
- static uint count=0; //消抖计数变量
- uchar num=0; //临时变量
- P3=0xf0; //赋值P3 1111 0000
- if(P3!=0xf0) //检测有按键按下
- {
- count++; //消抖计数
- if((count>=20)&&(sign==0)) //100~1000,根据主循环周期调整约10~20ms
- {
- sign=1; //按键自锁标志置1
- num=P3; //保存P3值xxxx 0000,x为0或1
- num|=0x0f; //保存num按位或0x0f值xxxx 1111
- P3=num; //赋值P3 xxxx 1111
- num=P3; //保存P3值xxxx xxxx
- switch(num)
- {
- case 0xee: key= 1; break;
- case 0xde: key= 2; break;
- case 0xbe: key= 3; break;
- case 0x7e: key= 4; break;
- case 0xed: key= 5; break;
- case 0xdd: key= 6; break;
- case 0xbd: key= 7; break;
- case 0x7d: key= 8; break;
- case 0xeb: key= 9; break;
- case 0xdb: key=10; break;
- case 0xbb: key=11; break;
- case 0x7b: key=12; break;
- case 0xe7: key=13; break;
- case 0xd7: key=14; break;
- case 0xb7: key=15; break;
- case 0x77: key=16; break;
- }
- }
- }
- else //键抬起
- {
- sign=0; //按键自锁标志清0
- count=0; //消抖计数清0
- }
- }
- void display() //数码管显示程序
- {
- static uchar a[6]={10,10,10,10,10,10};
- static uchar i,j;
- if (key==1)a[0]=key;
- else if(key==2)a[1]=key;
- else if(key==3)a[2]=key;
- else if(key==4)a[3]=key;
- else if(key==5)a[4]=key;
- else if(key==6)a[5]=key;
- else if(key==7)//清除
- {
- for(j=0;j<6;j++)
- a[j]=10;
- }
- P0=0x00;
- P2=~(0x01<<i);
- P0=table[a[i]];
- i=++i%6;
- }
- void main() //主函数
- {
- while(1)
- {
- key_scan(); //按键扫描程序
- display(); //数码管显示键值1~16
- delayms(1); //延时控制主循环周期约1ms
- }
- }
复制代码 |