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