樓主這個程序根本就不可能運行!首先是主函數名寫錯void mian(),正確寫法是void main(),其次是顯示函數體是死循環while(1),被按鍵函數執行一次就出不來。不論是郭天祥的還是普中的示例矩陣鍵盤掃描函數只是為說明一個基本原理,實戰中不宜采用。給你一個適用于你的開發板的 4*4矩陣鍵盤示例參考,有詳細注釋,不難理解。- #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; //數碼管位計數變量
- bit sign=0; //按鍵標志位變量
- uchar count=0; //消抖計數變量
- uchar code table[]={//0~15共陰數碼管段碼數組
- 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};//緩存數組
- void keyscan();
- void display();
- void delay(uint z);
- void keyscan() //矩陣按鍵掃描程序
- {
- P1=0xf0; //賦值P1 1111 0000
- if(P1!=0xf0) //檢測有按鍵按下
- {
- if((++count>=10)&&(sign==0))//消抖計數10ms與判斷按鍵狀態
- {
- sign=1; //按鍵狀態標志置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; //按鍵狀態標志清0
- count=0; //消抖計數清0
- }
- }
- void display() //數碼管顯示程序
- {
- dis_buf[0]=table[KeyValue%10];//分解鍵值個位
- 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++; //位計數
- 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);//控制主循環周期約1ms
- }
- }
復制代碼
|