#include<STC12C5A60S2.h>
char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x00,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e}
void delayms(int xms)
{
int i,j
for(i=xmsi>0i--)//i=xms即延时约xms毫秒
for(j=110j>0j--)
}
void display(char num)
{
P1=table[num]//段选数据灶弯睁
}
void matrixkeyscan()
{
char temp,key
P3=0xfe
temp=P3
temp=temp&0xf0
{
delayms(10)//延时,去抖动
temp=P3
temp=temp&0xf0
if(temp!=0xf0)//说明按键被持续按下
{
temp=P3//记录P3口状态
switch(temp)//根据现在的状态判断哪个按键闹晌被按下
{
case 0xee: //p3^4被按下
key=0
break
case 0xde: //p3^5
key=1
break
case 0xbe://p3^6
key=2
break
case 0x7e://p3^7
key=3
break
}
while(temp!=0xf0)//按键松开之后跳出循环
{
temp=P3
temp=temp&0xf0
}
display(key)//显示
}
}
P3=0xfd
{......}
P3=0xfb:
{......}
P3=0xf7
{......}
void main()
{
P0M1 = 0x00//推挽输出的定义
P0M0 = 0x0f//推挽输出的定义
P0=0x0f
while(1)
{
matrixkeyscan()//不停调用键盘扫描程序
}
}
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
比如:行为低电位,列为高四位
{
uchar
cord_h,cord_l//行列值
P3=0x0f
//行线输出全为0
cord_h=P3&0x0f
//读入列线值
if(cord_h!=0x0f)
//这个句话意思是这样的,如果有启余按键按下的话。那肯定就不是0x0f了。
{
主要就是识别按键按下作用
delay(100)
//去抖
if(cord_h!=0x0f)
//这是双重判定作用而已
{
cord_h=P3&0x0f
//读入列线值
P3=cord_h|0xf0
//输出当前列线值
cord_l=P3&0xf0
//读入液碧行线值
return(cord_h+cord_l)//键盘最后组合码值
}
}return(0xff)
//返回该值
}
好像你的程序解释得很好了。但是好像这么快,最好要延时下才准的。
我教闹旁举你按键的原理吧
就是那根线如果是高电平的话,遇到底电平就会变为底电平的。所以如果有按键按下的话,高电平就会变为低电平了。所以就可以读取了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)