/************************************************高手出來(lái)指點(diǎn)下下面16個(gè)按鍵分別按下會(huì)顯示什么數(shù)字。 跳線設(shè)置:J7拔掉,雙排針除PSEN外全部插上 硬件結(jié)構(gòu)框架: 1,八位八段數(shù)碼管 2,MCU STC89C52 3,4*4距陣鍵盤(pán) 顯示效果: 1,按下4*4鍵盤(pán)數(shù)碼管顯示顯示0-9 2,帶松手檢測(cè) 相關(guān)知識(shí)點(diǎn): 1,鍵盤(pán)的動(dòng)態(tài)掃描 ************************************************/
#include"AT89x52.h" #include"math.h" #define uint unsigned int #define uchar unsigned char
sbit DUAN=P2^6; //74HC573的LE端 U5 LED的段選端 sbit WEI=P2^7; //74HC573的LE端 U4 LED的位選端 uchar Temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰顯示字庫(kù) uchar keyboard_Scan[]={0xef,0xdf,0xbf,0x7f}; uchar in;
void delay(uint z) //1ms延時(shí) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
void duan_1(uchar duan) { DUAN=1; P0=Temp[duan]; DUAN=0; delay(10); }
uchar Keyboard() { uchar i,j,pc; for(i=0;i<4;i++) { P3=keyboard_Scan; pc=P3; pc=pc<<4|0x0f; //假如說(shuō)有按鍵按下 for(j=0;j<4;j++) //將掃描值與掃描按鍵值比較 { if(keyboard_Scan[j]==pc)in=i*4+j; if(in>=10)in=15-in; while(keyboard_Scan!=P3) //松手檢測(cè) { P3=keyboard_Scan; } } } return in; }
main() { WEI=1; P0=0; WEI=0; while(1) { duan_1(Keyboard()); } }
|