|
/*
為自已寫的矩陣鍵盤檢測+數碼管顯示+蜂鳴器響
采用if().....else嵌套方式;編譯通過,卻后二列顯示不出來(你找出來了嗎?一個不算問題的問題)
*/
//----------------------------------------------------------------
 - #include <pic.h>
- #define uint unsigned int
- #define uchar unsigned char
- __CONFIG(0x3B31);
- const unsigned char table[] = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數碼管數組
- //--------------------變量定義------------------------------------
- uint keynum,keytem,num; //定義變量,//keynum按鍵端口讀回值,keytem為松手檢測值(以示區分),num數碼管
- //--------------------函數調用 聲明-------------------------------
- void init(); //初始化函數
- void keyscan(); //矩陣鍵盤掃描
- void didi(uchar dinum); //蜂鳴器
- void disp(); //數碼管顯示
- //-------------------主函數---------------------------------------
- void delay(x) //延時函數,幾乎每個程序都要用到,所以放在了主函數分界線內
- {
- uchar a,b;
- for (a=x;a>0;a--)
- for(b=110;b>0;b--);
- }
- void main()
- {
- init(); //初始化
- while(1)
- {
- keyscan(); //矩陣鍵盤掃描
- disp(); //數碼管顯示
- }
- }
- //------------初始化函數-------------------------------------------
- void init()
- {
- TRISA=0;PORTA=0x02; //38譯碼器
- TRISB=1; //矩陣鍵盤
- TRISC=0;PORTC=0x01;; //38使能
- TRISD=0;PORTD=0x00; //LED燈(數碼管)
- TRISE=0;PORTE=0x00; //蜂鳴器
- }
- //----------要調用的函數--------------------------------------------
- void keyscan()
- { //第一列掃描
- PORTB=0xef; //送出RB4=1110 1111
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0xef)
- {
- delay(5);
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0x0f)
- {
- keytem=keynum;
- didi(1);
- while(keytem!=0x0f)
- {
- keytem=PORTB;
- keytem=keytem&0x0f;
- }
- keynum=keynum|0xe0;
- }
-
- else //第二列掃描
- {
- PORTB=0xdf;
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0xdf)
- {
- delay(5);
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0x0f)
- {
- keytem=keynum;
- didi(1);
- while(keytem!=0x0f)
- {
- keytem=PORTB;
- keytem=keytem&0x0f;
- }
- keynum=keynum|0xd0;
- }
- }
- else
- {
- PORTB=0xbf;
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0xbf)
- {
- delay(5);
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0x0f)
- {
- keytem=keynum;
- didi(1);
- while(keytem!=0x0f)
- {
- keytem=PORTB;
- keytem=keytem&0x0f;
- }
- keynum=keynum|0xb0;
- }
-
- else //第四列掃描
- {
- PORTB=0x7f;
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0x7f)
- {
- delay(5);
- keynum=PORTB;
- keynum=keynum&0x0f;
- if(keynum!=0x0f)
- {
- keytem=keynum;
- didi(1);
- while(keytem!=0x0f)
- {
- keytem=PORTB;
- keytem=keytem&0x0f;
- }
- keynum=keynum|0x70;
- }
- }
- } ////////
- }
- }
- }
- }
- }
- void didi(uchar dinum)
- {
- uchar di_num;
- for(di_num=dinum;di_num>0;di_num--)
- {
- RE0=1;
- delay(100);
- RE0=0;
- delay(50);
- }
- }
- void disp()
- {
- switch(keynum)
- {
- case 0xee:PORTD=table[1];break;
- case 0xed:PORTD=table[2];break;
- case 0xeb:PORTD=table[3];break;
- case 0xe7:PORTD=table[4];break;
- case 0xde:PORTD=table[5];break;
- case 0xdd:PORTD=table[6];break;
- case 0xdb:PORTD=table[7];break;
- case 0xd7:PORTD=table[8];break;
- case 0xbe:PORTD=table[9];break;
- case 0xbd:PORTD=table[10];break;
- case 0xbb:PORTD=table[11];break;
- case 0xb7:PORTD=table[12];break;
- case 0x7e:PORTD=table[13];break;
- case 0x7d:PORTD=table[14];break;
- case 0x7b:PORTD=table[15];break;
- case 0x77:PORTD=table[0];break;
- }
- }
復制代碼
|
|