本文目录一览:
- 1、需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来
- 2、C语言矩阵键盘函数疑问
- 3、C语言,4X4矩阵键盘怎么判断有再次按键发生?
- 4、求一个单片机4X4矩阵键盘扫描程序,C语言的。
需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来
这个是单独的键盘扫描子程序,你可以借鉴一下..
我使用的P3口接的矩阵键盘,你可以根据需要适当改变. 还要注意我的键值可能和你不一样,这就要看你的硬件电路是怎么设计的了.
uint keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
uint cord_h,cord_l,cord;//行列值
P3=0x0f; //行线输出全为0
cord_h=P30x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(); //去抖
if(cord_h!=0x0f)
{
cord_h=P30x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P30xf0; //读入行线值
for(;;)
{
P3=0x0f;
if(P3==0x0f)
break;
}
P10=0;
delayring();
P10=1;
switch(cord_h+cord_l)
{
case 0x7e:P0=led[1];cord=1;break;
case 0x7d:P0=led[2];cord=2;break;
case 0x7b:P0=led[3];cord=3;break;
case 0x77:P0=led[4];cord=4;break;
case 0xbe:P0=led[5];cord=5;break;
case 0xbd:P0=led[6];cord=6;break;
case 0xbb:P0=led[7];cord=7;break;
case 0xb7:P0=led[8];cord=8;break;
case 0xde:P0=led[9];cord=9;break;
case 0xdd:P0=led[0];cord=0;break;
case 0xee:cord=13;break;
case 0xed:cord=14;break;
case 0xeb:cord=15;break;
case 0xe7:cord=16;break;
}
P2=h;
return(cord);//键盘最后组合码值
}
}return(0xff); //返回该值
}
如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你用的是共阴的还是共阳的数码管了~~
祝您的问题早日得到解决. 谢谢
C语言矩阵键盘函数疑问
看程序中P1.0-P1.3是行扫描输出,P1.4-P1.7是扫描输入。所以原理是P1.0-P1.3中每次只有一个引脚输出0,其余输出1,然后读取P1.4-P1.7是否有引脚为0;如果有0说明有按键按下,如果全1说明没有按键按下。
scancode这个变量就是用于控制P1.0-P1.3(P1 = scancode;由这句输出)中每次只有一个引脚输出0的。
scancode = 0xfe;这句中bit0值为0,其余bit为1,所以开始时,P1 = scancode;由这句输出后,P1.0为0,其余引脚为1。
scancode = (scancode 1) | 0x01;这句使为0的bit左移一位(依次值为0xFE, 0xFD, 0xFB, 0xF7, 0xEF)。0xFE, 0xFD, 0xFB, 0xF7都满足while ((scancode 0x10) != 0)这个条件,而0xEF则不满足了,所以说此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了,到这就所有按键都扫描过了,没有按键按下(如果有按键按下,中途就返回了)。
if ((P1 0xf0) != 0xf0)这句中P1 0xf0表示只判断P1.4-P1.7,只有当前按下的按键所在行扫描输出为0时,这个表达式才成立(这时(P1 0xf0) != 0xf0);否则这个表达式肯定不成立(这时(P1 0xf0) == 0xf0),所以说当前行。
return ((~scancode) + (~tmpcode));这句就是如果有按键按下,那么直接返回键值,并不再进行循环退出程序。
程序格式要注意,下面这样更清楚:
uchar keyscan(void)
{
uchar scancode, tmpcode;
P1 = 0xf0; // 发全0行扫描码
if ((P1 0xf0) != 0xf0)
// 若有键按下
{
delay(); // 延时去抖动
if ((P1 0xf0) != 0xf0)
// 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while ((scancode 0x10) != 0)
// 逐行扫描此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了
{
P1 = scancode; // 输出行扫描码
if ((P1 0xf0) != 0xf0)
// 本行有键按下为什么是行?哪一列按下此句都成立啊
{
tmpcode = (P1 0xf0) | 0x0f;
/* 返回特征字节码,为1的位即对应于行和列 */
return ((~scancode) + (~tmpcode));
}
else
scancode = (scancode 1) | 0x01;
// 行扫描码左移一位
}
}
}
return (0); // 无键按下,返回值为0
}
C语言,4X4矩阵键盘怎么判断有再次按键发生?
你在程序检测到按键后,加个延时去抖,不要加松手检测。然后执行第一个按键相对应的程序。
然后继续按键扫描。注意这里说的是继续,也就是继续往下检测。否则你的程序就只能执行第一个按键所对应的程序了。这样,就能检测到你第二次按键的键值了。
当然,这个扫描是循环的。也就是说即使你第二次按的按键已经扫描完了,循环扫描任然能检测到。
求一个单片机4X4矩阵键盘扫描程序,C语言的。
淘bao 旺铺: 广州华电 单片机学习板 单片机外围学习模块/传感器模块
//4*4键盘检测程序,按下键后相应的代码显示在数码管上
#includereg51.h
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i)
{
for(j=i;j0;j--)
for(k=125;k0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
display(unsigned char num)
{
P0=table[num];
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
}
void main()
{
dula=0;
wela=0;
while(1)
{
P3=0xfe;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfe;
}
}
P3=0xfd;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
}
}
}
}