找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1474|回复: 7
收起左侧

C语言键盘扫描程序的疑问

[复制链接]
ID:597405 发表于 2019-10-23 22:13 | 显示全部楼层 |阅读模式
void keydown()
{
u8 a;
key=0x0f;
if(key!=0x0f)
{
delay(1000);
   if(key!=0x0f)
    {
        key=0x0f;//为什么这里要再一次赋值,如果赋值后,KEY置不冲突吗??前面明明判断为不等于0x0f.
         switch(key)
         {
         case(0x07):keyvalue=0;break;
         case(0x0b):keyvalue=1;break;
         case(0x0d):keyvalue=2;break;
         case(0x0e):keyvalue=3;break;         
         }

回复

使用道具 举报

ID:235200 发表于 2019-10-23 23:46 | 显示全部楼层
void keydown()
{
u8 a;
key=0x0f;                    //这里的key应该是定义为按键的端口了,如P0,key=0x0f是打通低4位输入通道
if(key!=0x0f)               //读出端口判断有无键按下
{
delay(1000);               //一般是延时10ms进行消抖
   if(key!=0x0f)           //再次读低4位进行判断
    {
        key=0x0f;          //再一次打通低4位输入通道
         switch(key)       //读出端口值进行判断
         {
         case(0x07):keyvalue=0;break;     //这个地方似乎常量不对,应包括高4位的的值,,否则要改为switch(key&0x0f)
         case(0x0b):keyvalue=1;break;
         case(0x0d):keyvalue=2;break;
         case(0x0e):keyvalue=3;break;         
         }
回复

使用道具 举报

ID:411550 发表于 2019-10-24 01:15 | 显示全部楼层
再一次赋值,是为了进行列扫描。虽然赋了值,但按下按键的所在列的管脚会被拉低,switch语句则可以正常识别哪一列导通,所以KEY值并不会冲突
回复

使用道具 举报

ID:213173 发表于 2019-10-24 07:47 | 显示全部楼层
在这个程序中,楼主的疑问基本是对的。这是一赘句,没有好处也没有害处。只是白占了一点资源。
回复

使用道具 举报

ID:597405 发表于 2019-10-24 18:38 | 显示全部楼层
csmyldl 发表于 2019-10-23 23:46
void keydown()
{
u8 a;

谢谢,说的很详细!!
回复

使用道具 举报

ID:597405 发表于 2019-10-24 18:39 | 显示全部楼层
噗噗噗p 发表于 2019-10-24 01:15
再一次赋值,是为了进行列扫描。虽然赋了值,但按下按键的所在列的管脚会被拉低,switch语句则可以正常识别 ...

大概明白了,就是说在按键按下时,赋值,立马拉低,单片机会更好的识别。
回复

使用道具 举报

ID:597405 发表于 2019-10-24 18:41 | 显示全部楼层
wulin 发表于 2019-10-24 07:47
在这个程序中,楼主的疑问基本是对的。这是一赘句,没有好处也没有害处。只是白占了一点资源。

嘿嘿,谢了哦,一开始不好理解。后来我把这行删除,似乎不影响效果~
回复

使用道具 举报

ID:123289 发表于 2019-10-24 20:58 | 显示全部楼层
原则上付一次1就可以了,赞同地板的说法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表