自学51单片机中,学习中做一个简易仪表有时需要一个简易4按键程序,又不适合等待查询法,于是 有了状态法。
还是逐个查询,没有用switch+case函数适合初学者使用,弄懂了状态机原理,就很容易改成switch+case函数变成组合按键输入,大神请绕路
附带屏幕任意键唤醒,定时息屏,不用可去除。
//==========keyscan.h================
#ifndef __KEYSCAN_H__
#define __KEYSCAN_H__
extern bit key1; //模式键
extern bit key3; //移位键
extern bit key2; //增加键
extern bit key4; //确认键
extern bit key1_d; //长按模式键
extern bit key3_d; //长按移位键
extern bit key2_d; //长按增加键
extern bit key4_d; //长按确认键
sbit KEY_ADD=P3^7; //定义增加键 BAT2 P2^7
sbit KEY_DEC=P3^6; //定义菜单键 BAT1 P2^6
sbit KEY_YW=P3^5; //定义移位键 BAT3 P2^5
sbit KEY_Q=P3^4; //定义确认键 BAT4 P2^4
sbit LCD_led=P2^7; // LCD屏背光灯
void keyscan (void);
#endif
//===================================
/*********************keyscan.c********************************
//定时器中断按键查询程序
//使用方法 keyscan ();放入定时器中断,例如temr1,temr2动态扫描LED显示
// AD采样周期循环内,
//主程序查询key1-key4_d,清除key1-key4_d
//*****************************************************
#include<reg52.h>
#include "keyscan.h"
#include "bintohex.h"
bit key1; //模式键
bit key3; //移位键
bit key2; //增加键
bit key4; //确认键
bit key1_d; //长按模式键
bit key3_d; //长按移位键
bit key2_d; //长按增加键
bit key4_d; //长按确认键
bit key_I; //有按键标志
unsigned char key_c; //
unsigned char key_T; //按键计时器
unsigned char key_D; //按键锁存器
unsigned int LD_time; //亮屏计时
void keyscan (void)
{
key_c=P3|0xf0; //P3高位为按键
key_c=~key_c;
if(key_c>0) //有任意按键按下亮屏
{ LCD_led=0; }
if(LCD_led==0)
{ LD_time++;
if (LD_time>600) //亮屏计时
{ LCD_led=1;
LD_time=0;}
} //不用时此段可删除
if (key_c>0&key_I==0)
{ key_I=1; key_D=key_c; } //有键按下 标志置位,锁存按键状态
if(key_I==1)
key_T++;
if(key_I==1&key_c==0&key_T>5) //标志和计时 按键复位
{
if(key_D==0x08)
key4=1;
if(key_D==0x04)
key3=1;
if(key_D==0x02)
key2=1;
if(key_D==0x01)
key1=1;
}
if(key_I==1&key_c==0&key_T>80) //标志和计时 按键复位
{
if(key_D==0x08)
key4_d=1;
if(key_D==0x04)
key3_d=1;
if(key_D==0x02)
key2_d=1;
if(key_D==0x01)
key1_d=1;
}
if(key_I==1&key_c==0)
{key_T=0; key_I=0; key_D=0;}
}
//=============main.c例子==================
ad7705_init(2); //AD采样
for (j=0;j<7;j++)
{
CH2_data=get_7705_CH2();
CH2_temp[j]=CH2_data;
keyscan (); //按键查询扫描程序
}
void KEY_pd(void ) //按键处理
{
if(key1==1 )
{key1=0; //LCD_led=0;
}
if(key2==1 )
{ key2=0;// LCD_led=1;
}
if(key3==1)
{key3=0;Bao_L=~Bao_L;}
if(key4_d==1)
{ key4_d=0;Bao_L=0;
//Ds1302_Init();
//DelayMs(200);
Ds1302_zero(); //时钟从0开始计时
L_AH=0;
}
}
|