键盘扫描问题

wg_can 2008-07-31 08:47:43
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define unit unsigned int
void delays(void)
uchar kbscan(void)
uchar main (void)
{uchar key;
while(1)
{key=kbscan();//键盘扫描函数
delays();//消抖延时函数
}
}
//消抖延时函数
void delays(void)
{uchar i;
for(i=300;i>0;i--);
}
//kbscan(void)键盘扫描函数
uchar kbscan(void)
{uchar sccode,recode;
P1=0xf0;//发全0行扫描码,列线输入
if((P1&0xf0)!=0xf0)//若有键按下
{delays();//消抖延时
if((P1&0xf0)!=0xf0)//确实有键盘按下
{sccode=0xfe;//逐行扫描初值
while((sccode&0x10)!=0)//判断是否是最后一行
{P1=sccode;//输出行扫描码
if((P1&0xf0)!=0xf0)//本行有键盘按下
{recode=(P1&0xf0)10x0f;
return((~sccode)+(~recode));//返回特征字节码
}else sccode=(sccode<<1)10x01;//行扫描左移一位
}
}
}return(0);//无键盘按下,返回0
}

1、while((sccode&0x10)!=0)这句怎么理解啊 为什么行扫描设定初值后下条语句就是判断是否最后一行了 这个问题真的不甚理解啊
搞了我好几天啦
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
-狙击手- 2008-08-01
  • 打赏
  • 举报
回复
low-key
azmao 2008-08-01
  • 打赏
  • 举报
回复
你这是4*4的键盘吧。
P1=0xf0的意思是p1.4-P1.7设置为输入,P1.0-P1.3为输出0。
然后读P1口,判断P1的高4位看是否有键。
有键的话,再P1.0-P1.3依次输出0,回读P1口。就可以判断是哪个键按下了。
只不过这个按键程序太差了。没有一个编程的结构。
它判断最后一行明显是功能键的判断。就像PC键盘的Ctrl、Shift等。
wg_can 2008-08-01
  • 打赏
  • 举报
回复
0x10等于10000000吗二进制

它判断最后一行明显是功能键的判断。为什么是这样
我不懂
zxg2006 2008-07-31
  • 打赏
  • 举报
回复
"P1=0xf0;//发全0行扫描码,列线输入
if((P1&0xf0)!=0xf0)//若有键按下 "

P1=0xf0什么意思呀?
ljydh2122 2008-07-31
  • 打赏
  • 举报
回复
其实它是一个判断语句,while()里面(sccode&0x10)!=0是判断语句,sccode&0x10

即scode与10000000每位相与,只有最高位为1有效,但是不代表它就是判断最后一行,

那要看你的具体电路是怎么连的,比如这里也可以(sccode&0x01)!=0,你可能是这样写

才觉得是在扫描第一行吧,其实这两个道理是一样的,只不过一个从高位开始接,一个从

低位开始接,你再结合实际电路看看吧
ljydh2122 2008-07-31
  • 打赏
  • 举报
回复
其实它是一个判断语句,while()里面(sccode&0x10)!=0是判断语句,sccode&0x10

即scode与10000000每位相与,只有最高位为1有效,但是不代表它就是判断最后一行,

那要看你的具体电路是怎么连的,比如这里也可以(sccode&0x01)!=0,你可能是这样写

才觉得是在扫描第一行吧,其实这两个道理是一样的,只不过一个从高位开始接,一个从

低位开始接,你再结合实际电路看看吧

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧