51单片机矩阵扫描抖动问题 - 爱问答

(爱问答)

51单片机矩阵扫描抖动问题

#include<reg52.h>

#include<stdlib.h>

#define uchar unsigned char

#define uint unsigned int

#define input P1

 

sbit LCD1602_RS = P2^6;

sbit LCD1602_RW = P2^5;

sbit LCD1602_E = P2^7;

uchar code table1[]= {0x31,0x32,0x33,0x2b,0x34,0x35,0x36,0x2d,

  0x37,0x38,0x39,0x2a,0x30,0x2e,0x3d,0x2f};//1 2 3 + 4 5 6 - 7 8 9 * 0 . = /

uchar temp ;

uchar keyValue;

void keyPress();

void delay();//申明延迟

void init();//申明初始化

void write_data(uchar date);//申明写数据

void write_cmd(uchar cmd);//申明写命令

 

//延时

void delay(uchar i)

{

    while(i--);

}

//主函数

 

void main()

{

init();   

while(1)

{

keyPress();

}

}

 

//写数据

void write_data(uchar date)

{

delay(1000);

    LCD1602_RS=1;

   LCD1602_RW=0;

    LCD1602_E=0;

    P0=date;

    LCD1602_E=1;

    delay(1000);

    LCD1602_E=0;

}

 

//写命令

void write_cmd(uchar cmd)

delay(1000);

    LCD1602_RS=0;

   LCD1602_RW=0;

    LCD1602_E=0;

    P0=cmd;

    LCD1602_E=1;

    delay(1000);

    LCD1602_E=0;

}

 

//初始化

void init()

    delay(1500);

        write_cmd(0x38);

        delay(500);

        write_cmd(0x38);

        delay(500);

        write_cmd(0x38);

        delay(500);

        write_cmd(0x38);

        write_cmd(0x08);

        write_cmd(0x01);

        write_cmd(0x06);

        write_cmd(0x0c);

 

}

 

//实现矩阵按键的行列扫描

void keyPress()

{

char a=0;

input = 0x0f;

if(input != 0x0f)//读取按键是否按下

{

delay(1000);//延时10ms进行消抖

if(input != 0x0f)//再次检测键盘是否按下

{

switch(input) 

{   

            case 0x0e://第一行按下

            keyValue = 0;

            break;

 

            case 0x0d://第二行按下

            keyValue = 4;

            break; 

 

            case 0x0b://第三行按下

            keyValue = 8;

            break;

 

            case 0x07://第四行按下

            keyValue = 12;

            break;                            

          }

   }

}  

 

            input = 0xf0;//定义低四位为0来测试行

            switch(input)

            {

                case 0xe0://第一列的按键按下

                keyValue = keyValue;

                write_data(table1[keyValue]);

                break;

 

                case 0xd0://第二列的按键按下

                keyValue = keyValue + 1;

                write_data(table1[keyValue]);

                break;

 

                case 0xb0://第三列的按键按下

                keyValue = keyValue + 2;

                write_data(table1[keyValue]);

                break;

 

                case 0x70://第四列的按键按下

                keyValue = keyValue + 3;

                write_data(table1[keyValue]);

                break;


                while((a<50)&&(input!=0xf0)) //检测按键松手检测

                  {

                       delay(1000);

                       a++;

                  }

 

            }

 

}       

 

我的问题是当我按下我设定好的1键时,lcd1602上显示很多个1,其他键也是这样,可是我明明消除抖动了的,这问题困扰我一天了。网上也搜索了很久,没能解决,希望大神帮我看看。感激不尽。重点看下矩阵按键扫描那块,十分感谢

大家帮你,只能抽时间简单看看问题所在。你的问题,如果在这里回答你,就必须认真看你的程序,这是非常耗时的事,少有人能做到。所以我的建议是,你用仿真系统试试,看看程序到底循环到哪里的,一点一点的去调试。

编程工作就是这样,少有一次就能通过的,会遇到各种各样的问题。所以,单片机的仿真系统,是最好的工具。用它去调试一下看看,会找到问题的。这也是单片机技术的一部分。

while(1)主函数永远循环啊

下一篇:CASS7.0如何创建dwt样板

上一篇:如何检测Zn

热门标签:
excel 网盘 破解 word dll
最新更新:
微软重新评估新的Outlook的使用时机 联想推出搭载联发科Helio G80芯片组的Tab M9平板 英特尔创新大赛时间确定! 微软Edge浏览器在稳定渠道中推出Workspaces功能 英伟达RTX4060TiGPU推出MaxSun动漫主题! 谷歌地图为用户提供了街景服务! GameSir 在T4 Kaleid中推出了一款出色的控制器! 微软开始在Windows 11 中测试其画图应用程序的新深色模式! LG电子推出全球首款无线OLED电视 英伟达人工智能芯片崭露头角! Steam Deck可以玩什么游戏-Steam Deck价格限时优惠 雷蛇推出CobraPro鼠标 Kindle电子阅读器可以访问谷歌商店吗 Windows10如何加入组策略 window10图片查看器怎么没有了?