找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1165|回复: 0
收起左侧

初学者适用的51单片机状态机4按键子程序

[复制链接]
ID:309610 发表于 2022-9-7 22:35 | 显示全部楼层 |阅读模式
自学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;
       }
        }




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表