请教一个长按键的问题

zhzhi418 2012-01-16 10:12:19
之前看到一个帖子:新型的按键扫描程序,于是想写一个长按键的程序:长按key0键切换LCD1602的屏幕显示,不知道为什么切换不了,程序如下:

#include <stdio.h>
#include <reg51.h>
unsigned char Trg;
unsigned char Cont;
unsigned int i=0;
unsigned char longpress=0;
#define KEY_0 0x01

void KeyRead( void )

{
unsigned char ReadData = P1^0xff;
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;

}
void main(void)
{
sys_init();
lcd_bus=0xff;
lcd_delay(10);
lcd_init();
lcd_clear();
while(1){
KeyRead();
if(Cont&key0){
i++;
if(i>500){
longpress=(~longpress);
}
}
if(longpress==0){
display1(); //屏幕1
}
if(longpress!=0){
display2(); //屏幕2
}
}
}
开机时显示屏幕1,长按key0键切换不到屏幕2,这是什么原因?求解
...全文
135 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
galle 2012-02-06
  • 打赏
  • 举报
回复
程序判断有问题,还有就是是你按的时间不够长,
开始时,I=0;
当你第一次按住是,加到500,时进行了一次翻转,但是没有清零操作,程序会一直加到65535然后回零,进行第二次翻转。
你在没有按键时将I清零,就好实现长按一次,翻转,抬起,然后长按 翻转,注意,在长按中对I的值做限定,不要超限后回零
Binzo 2012-01-31
  • 打赏
  • 举报
回复
还是中断保险些。
Binzo 2012-01-31
  • 打赏
  • 举报
回复
建议使用中断方式。
  if(Cont&key0){  
i++;
if(i>500){

你这个地方都没有在键按下时开始。过了这个语句,你才按的怎么办?
还是要等的:
  
while(!(Cont&key0));
if(Cont&key0){
i++;
if(i>500){
overmind 2012-01-28
  • 打赏
  • 举报
回复
我建议
if(Cont&key0){
改成
if(Cont&key0){
while(Cont&key0){
。。。}}
宋哥 2012-01-19
  • 打赏
  • 举报
回复
if(i>500){
longpress=(~longpress);
}
第一个问题是i>500的时间有多长?
第二个问题是i>500后i没有清零,而是继续增加下去,于是上面的语句被反复执行,导致你的显示状态反复切换。
所以,在确定500的时间适当之后,再将上面语句修改如下:
if(i>500){
longpress=(~longpress);
i=0;
}
palleexu 2012-01-16
  • 打赏
  • 举报
回复
i>500的时间有多长?你改改参数试试。或者是因为时间太短,你看不到切换的变化又回到了屏幕1?
net_friends 2012-01-16
  • 打赏
  • 举报
回复
长按键换, 一般做在驱动层中.
huabinsir 2012-01-16
  • 打赏
  • 举报
回复

长按键换, 一般做在驱动层中.

27,372

社区成员

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

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