|
/*
为自已写的矩阵键盘检测+数码管显示+蜂鸣器响
采用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;
- }
- }
复制代码
|
|