楼主这个程序根本就不可能运行!首先是主函数名写错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
- }
- }
复制代码
|