|
自學(xué)51單片機(jī)中,學(xué)習(xí)中做一個(gè)簡(jiǎn)易儀表有時(shí)需要一個(gè)簡(jiǎn)易4按鍵程序,又不適合等待查詢(xún)法,于是 有了狀態(tài)法。
還是逐個(gè)查詢(xún),沒(méi)有用switch+case函數(shù)適合初學(xué)者使用,弄懂了狀態(tài)機(jī)原理,就很容易改成switch+case函數(shù)變成組合按鍵輸入,大神請(qǐng)繞路
附帶屏幕任意鍵喚醒,定時(shí)息屏,不用可去除。
//==========keyscan.h================
#ifndef __KEYSCAN_H__
#define __KEYSCAN_H__
extern bit key1; //模式鍵
extern bit key3; //移位鍵
extern bit key2; //增加鍵
extern bit key4; //確認(rèn)鍵
extern bit key1_d; //長(zhǎng)按模式鍵
extern bit key3_d; //長(zhǎng)按移位鍵
extern bit key2_d; //長(zhǎng)按增加鍵
extern bit key4_d; //長(zhǎng)按確認(rèn)鍵
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; //定義確認(rèn)鍵 BAT4 P2^4
sbit LCD_led=P2^7; // LCD屏背光燈
void keyscan (void);
#endif
//===================================
/*********************keyscan.c********************************
//定時(shí)器中斷按鍵查詢(xún)程序
//使用方法 keyscan ();放入定時(shí)器中斷,例如temr1,temr2動(dòng)態(tài)掃描LED顯示
// AD采樣周期循環(huán)內(nèi),
//主程序查詢(xún)key1-key4_d,清除key1-key4_d
//*****************************************************
#include<reg52.h>
#include "keyscan.h"
#include "bintohex.h"
bit key1; //模式鍵
bit key3; //移位鍵
bit key2; //增加鍵
bit key4; //確認(rèn)鍵
bit key1_d; //長(zhǎng)按模式鍵
bit key3_d; //長(zhǎng)按移位鍵
bit key2_d; //長(zhǎng)按增加鍵
bit key4_d; //長(zhǎng)按確認(rèn)鍵
bit key_I; //有按鍵標(biāo)志
unsigned char key_c; //
unsigned char key_T; //按鍵計(jì)時(shí)器
unsigned char key_D; //按鍵鎖存器
unsigned int LD_time; //亮屏計(jì)時(shí)
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) //亮屏計(jì)時(shí)
{ LCD_led=1;
LD_time=0;}
} //不用時(shí)此段可刪除
if (key_c>0&key_I==0)
{ key_I=1; key_D=key_c; } //有鍵按下 標(biāo)志置位,鎖存按鍵狀態(tài)
if(key_I==1)
key_T++;
if(key_I==1&key_c==0&key_T>5) //標(biāo)志和計(jì)時(shí) 按鍵復(fù)位
{
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) //標(biāo)志和計(jì)時(shí) 按鍵復(fù)位
{
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 (); //按鍵查詢(xún)掃描程序
}
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(); //時(shí)鐘從0開(kāi)始計(jì)時(shí)
L_AH=0;
}
}
|
評(píng)分
-
查看全部評(píng)分
|