我做的程序,送给大家。本人从不用软件延时,只用定时器,根据程序量决定定时器周期,如果所有程序在10ms时间内都能处理完毕,则程序扫描周期10ms,否则20ms1.(液晶刷新部分除外,因为液晶刷新在单片机来说不是实时的) //================================================================================= //文 件 名 : read_key() //功 能 : 读键值, 利用定时器产生的 10 毫秒进行键盘去抖,连续40毫秒的的按键为有效 // 按键, 对该键做键值译码. 有效键值为非零值 //寄 存 器 : key_last ---- 上个周期读到的键值, 全局变量 // key_code ---- 读到的有效键码, 全局变量 // keyshake ---- 键盘去抖 // lkey_time --- 首次检测连续按键时间=800ms, 0.8秒后按键没有抬起,0.1秒 // 更新一次键值 // long_key_flag;是否检测连续按键标识 // wait_esc_flag --- 等待键盘抬起标志, 全局变量 //输 出 : key_code --- 读到的有效键码, 为非零值,全局变量 //================================================================================= // void read_key() { uchar i; keyshake<<=1; keyshake&=0X0F; key_data=keyboard_port; i=key_data&0x3f; if(i!=key_last){key_last=i;long_key_flag=0;lkey_time=80;return;} //抖动状态 keyshake|=1; if(keyshake==0x0f) { if(i==0x3f) //无键按下,退出 { wait_esc_flag=0; long_key_flag=0; lkey_time=80; return; } sleep_min=0; if(!lcd_light&&!wait_esc_flag)//背光原来是关闭的,启动背光然后退出 { wait_esc_flag=1; lcd_light=1; return; } if(wait_esc_flag) //已有键按下,检查重复按键或等待键抬起 { if(long_key_flag) //等待重复按键 { if(--lkey_time==0) { lkey_time=10; keyp_flag=1; if(i==0x37)key_code=3; //连续加 else if(i==0x1f)key_code=4; //连续减 else {lkey_time=80;keyp_flag=0;} } } } else //首次检测到按键 { buzzer=0; buz_time=12; keyp_flag=1;wait_esc_flag=1; if(i==0x3d)key_code=1; //上 else if(i==0x2f)key_code=2; //下 else if(i==0x37)key_code=3; //左 else if(i==0x1f)key_code=4; //右 else if(i==0x3e) //ECS { if(lcd_light&&(main_menu_code==0))//背光原来是开的,关背光然后退出 { lcd_light=0; keyp_flag=0; } else key_code=5; //有效按键 } else if(i==0x3b)key_code=6; //ENTER else keyp_flag=0;
} } } |