用矩阵按键怎么实现按键时亮灯,松开时灯灭
时间:10-02
整理:3721RD
点击:
- #include <reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code led[]={0xfe,0xfb,0xfd,0xf7,0xef,0xbf,0xef,0x7f} ;
- /*1毫秒延时函数*/
- void delay(uint z)
- {
- uint x,y;
- for(x = z; x > 0; x--)
- for(y = 114; y > 0 ; y--);
- }
- uchar KeyScan()
- {
- uchar cord_l,cord_h;//声明列线和行线的值的储存变量
- P3 = 0xf0;//1111 0000
- if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
- {
- delay(5);//软件消抖
- if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
- {
- cord_l = P3 & 0xf0;// 储存列线值
- P3 = cord_l | 0x0f;
- cord_h = P3 & 0x0f;// 储存行线值
- while( (P3 & 0x0f) != 0x0f );//松手检测
- return (cord_l + cord_h);//返回键值码
- }
- }
-
- }
- /*
- 4*4矩阵键盘键值码处理函数
- 返回转换后的键值码
- */
- uchar KeyPro()
- {
- uchar key_value; //存放转换后的按键值
- switch( KeyScan() )
- {
- //第一行键值码
- case 0xee: P1=0xfe; break;
- case 0xde: P1=0xfd; break;
- case 0xbe: P1=0xfb; break;
- case 0x7e: P1=0xf7; break;
-
- //第二行键值码
- case 0xed: key_value = 0x05; break;
- case 0xdd: key_value = 0x06; break;
- case 0xbd: key_value = 0x07; break;
- case 0x7d: key_value = 0x08; break;
- //第三行键值码
- case 0xeb: key_value = 0x09; break;
- case 0xdb: key_value = 0x0a; break;
- case 0xbb: key_value = 0x0b; break;
- case 0x7b: key_value = 0x0c; break;
- //第四行键值码
- case 0xe7: key_value = 0x0d; break;
- case 0xd7: key_value = 0x0e; break;
- case 0xb7: key_value = 0x0f; break;
- case 0x77: key_value = 0x10; break;
- }
- return (key_value);//返回转换后的键值码
- }
- void main()
- {
- while(1)
- {
- KeyScan();
- KeyPro();//提取键值码并且送不同数值给数码管显示
- delay(10);
- if( (P3 & 0x0f) == 0x0f )
- {
- P1=0xff;
- }
-
- }
- }
void main()
{
while(1)
{
// KeyScan();
P1=KeyPro();//LED显示键值,把KeyPro()中第一行键值码改为正常值
// delay(10);
// if( (P3 & 0x0f) == 0x0f )
// {
// P1=0xff;
// }
}
}
你先确定你要实现什么功能吧,程序里没有看到开关灯的操作,而在uchar KeyScan()里含有按键的松手检测,也就是不松手,不会推出uchar KeyScan()。
先理一理思路吧
我42到46行有写LED的程序,那我这个功能要怎么实现
最简单的问题就是按你的要求uchar KeyScan()里不能检测按键释放
我把检测的删了,又修改了一下,怎么不稳定,有的时候按下亮,松开灭。有的时候按下去亮,送开还是亮,
你可以试试不在计算键码时亮灯,照常计算键码,然后无按键按下时也设置一个键码,在计算完键码后,再根据键码判断是亮灯,还是灭灯。
按键防抖动程序加了没有