单片机
返回首页

状态机方式按键扫描单片机程序

2015-07-01 来源:51hei

这是从http://www.51hei.com/bbs/dpj-19294-1.html 这个单片机做的收音机里面截取出来的一个子程序,完整的代码和原理图可从原帖下载.

                 /*-----------状态机方式按键扫描-----------*/
                 /*------------外部晶振为  12MHz-----------*/           
     /*--------最后修改2011.02.26--------------*/
#include 'STC12C5620AD.H'
#include 'Key_Scan.H'
#define Key_Mask 0x0f        //屏蔽不用的按键,不用的按键用0屏蔽

/********************** 声明外部变量**************************/
extern uchar Work_Mode;      //From Main.c
/********************** 按键扫描读取**************************/
uchar Key_Scan(void) 

 static uchar Key_State=0;     //定义按键状态
 uchar Key_Press;
 uchar Key_Return=0x00;      //定义按键返回的键值
 Key_Press=Key_Input&Key_Mask;   //读按键I/O电平 
 switch(Key_State) 
  { 
   case 0:        // 按键初始态 
    if (Key_Press!=Key_Mask)
      Key_State=1;     // 键被按下,状态转换到键确认态
    break; 
   case 1:        // 按键确认态 
    if (Key_Press==Key_Input&Key_Mask) 
     { 
      Key_Return=Key_Press;    // 按键仍按下且键值键值,按键确认输出
      BEEP_DRV=1;      // 驱动蜂鸣器
      Key_State=2;     // 状态转换到键释放态 
     } 
    else 
     Key_State=0;   // 按键已抬起或改变,并转换到按键初始态 
    break; 
   case 2: 
    if (Key_Press==Key_Mask) 
     {
      Key_State=0;   // 按键已释放,转换到按键初始态 
      BEEP_DRV=0;    // 关闭蜂鸣器
     }
    else
     if(Work_Mode==1)            
      {
       Key_Return=Key_Press|0x09;          // 只有调台模式并且只有>>| 和 |<< 才能连按
       BEEP_DRV=0;    // 关闭蜂鸣器
      }
     else
      BEEP_DRV=0;    // 关闭蜂鸣器 
    break;
  } 
    return Key_Return; 
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 开关电源的基本组成及工作原理

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何构建一个触摸传感器电路

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章