用矩陣鍵盤1~6輸入6個數并按位同時顯示在6個數碼管上。這種功能的程序只能用于練練手,沒有什么實用價值。
無標題.jpg (144.39 KB, 下載次數: 0)
下載附件
2024-11-3 13:23 上傳
- #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
- }
- }
復制代碼 |