|
樓主這個(gè)程序根本就不可能運(yùn)行!首先是主函數(shù)名寫(xiě)錯(cuò)void mian(),正確寫(xiě)法是void main(),其次是顯示函數(shù)體是死循環(huán)while(1),被按鍵函數(shù)執(zhí)行一次就出不來(lái)。不論是郭天祥的還是普中的示例矩陣鍵盤(pán)掃描函數(shù)只是為說(shuō)明一個(gè)基本原理,實(shí)戰(zhàn)中不宜采用。給你一個(gè)適用于你的開(kāi)發(fā)板的 4*4矩陣鍵盤(pán)示例參考,有詳細(xì)注釋,不難理解。- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- /*
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- */
- uchar KeyValue; //鍵值變量
- uchar num=0; //數(shù)碼管位計(jì)數(shù)變量
- bit sign=0; //按鍵標(biāo)志位變量
- uchar count=0; //消抖計(jì)數(shù)變量
- uchar code table[]={//0~15共陰數(shù)碼管段碼數(shù)組
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar data dis_buf[8]={0,0,0,0,0,0,0,0};//緩存數(shù)組
- void keyscan();
- void display();
- void delay(uint z);
- void keyscan() //矩陣按鍵掃描程序
- {
- P1=0xf0; //賦值P1 1111 0000
- if(P1!=0xf0) //檢測(cè)有按鍵按下
- {
- if((++count>=10)&&(sign==0))//消抖計(jì)數(shù)10ms與判斷按鍵狀態(tài)
- {
- sign=1; //按鍵狀態(tài)標(biāo)志置1
- switch(P1)
- {
- case(0Xe0):KeyValue = 0;break;
- case(0Xd0):KeyValue = 1;break;
- case(0Xb0):KeyValue = 2;break;
- case(0X70):KeyValue = 3;break;
- }
- P1=0x0f; //賦值P1 0000 1111
- switch(P1)
- {
- case(0X0e):KeyValue+= 1;break;
- case(0X0d):KeyValue+= 5;break;
- case(0X0b):KeyValue+= 9;break;
- case(0X07):KeyValue+=13;break;
- }
- }
- }
- else //鍵抬起
- {
- sign=0; //按鍵狀態(tài)標(biāo)志清0
- count=0; //消抖計(jì)數(shù)清0
- }
- }
- void display() //數(shù)碼管顯示程序
- {
- dis_buf[0]=table[KeyValue%10];//分解鍵值個(gè)位
- dis_buf[1]=table[KeyValue/10];//分解鍵值十位
- // dis_buf[2]=
- // dis_buf[3]=
- // dis_buf[4]=
- // dis_buf[5]=
- // dis_buf[6]=
- // dis_buf[7]=
- P0=0x00; //段碼消隱
- P2&=0xe3; //位碼清0
- P0=dis_buf[num];//送段碼
- P2|=num<<2; //送位碼
- num++; //位計(jì)數(shù)
- num%=8;
- }
- void delay(uint z)
- {
- uint a,b;
- for(a=z;a>0;a--)
- for(b=110;b>0;b--);
- }
- void main()
- {
- while(1)
- {
- keyscan();
- display();
- delay(1);//控制主循環(huán)周期約1ms
- }
- }
復(fù)制代碼
|
|