单片机论坛

 找回密码
 立即注册
QQ登录 只需一步,快速开始
搜索
查看: 269|回复: 1
打印 上一主题 下一主题
收起左侧

单片机独立按键状态机源程序

[复制链接]
跳转到指定楼层
楼主
练氏 发表于 2017-11-4 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享一个独立按键控制的状态机程序,赚点币。    有详细的注解,请看附录

单片机源程序如下:
  • #include <reg52.h>
  • #define uchar unsigned char
  • #define uint  unsigned int
  • sbit LED = P1^0;//继电器(P1.0)接口定义 P1口的其他口可以接LED,也可以接LED,反正效果一样

  • /**************************************/
  • /**************定时器中断**************/
  • /**************************************/
  • void Timer0_init()
  • {
  •         TMOD = 0x01;//定时器定时模式,16位定时
  •         TH0  = 0xf8;//设定定时器初值2ms
  •         TL0  = 0xcc;
  •         TR0  = 1;//开启定时器
  •         ET0  = 1;//定时器中断
  •         EA   = 1;//总中断  
  • }

  • /**************************************/
  • /*********状态机按键扫描函数***********/
  • /*********返回值: 按键码值************/
  • /**************************************/
  • uchar Key_Scan(void)
  • {
  •         static uchar State_Cnt=0;//静态变量,用于改变状态过程
  •         uchar Key_State = 0;//用于存储键值码
  •         switch(State_Cnt)
  •         {
  •                 case 0x00:P3 = 0x0f;//先往P3(1到4独立按键)口送0000 1111
  •                 if(P3 != 0x0f)//有无按键被按下
  •                 {
  •                         State_Cnt = 0x01;//改变状态
  •                         break;                           
  •                 }
  •                 case 0x01:
  •                 if(P3 != 0x0f)//经过定时器延时后,再次判断按键是否按下
  •                 {
  •                         State_Cnt = 0x02;//改变状态
  •                         Key_State = P3;//把键值保存下来
  •                         P3 = 0x0f;//恢复P3,以便下次按下重新保存键值
  •                         break;
  •                 }
  •                 else
  •                 {
  •                         State_Cnt = 0x00;//改变状态
  •                         break;
  •                 }
  •                 case 0x02:
  •                 if(P3 == 0x0f)//判断按键释放
  •                 {
  •                         State_Cnt = 0x00;//改变状态
  •                         break;
  •                 }
  •                 default:break;
  •         }
  •         return Key_State;//返回键值
  • }

  • /**************************************/
  • /************按键功能函数**************/
  • /***********参数:按键键码*************/
  • /**************************************/
  • void Display_Key(uchar key_value)
  • {
  •         switch(key_value)
  •         {
  •                 case 0x0e:LED = 1;break;//键值改变时,做出相应的动作(用户自定义动作)
  •                 case 0x0d:LED = 0;break;
  •                 case 0x0b:P1  = 0x00;break;
  •                 case 0x07:P1  = 0xff;break;
  •         }
  • }

  • void main()
  • {
  •         Timer0_init();
  •         while(1);
  • }

  • /************定时器0中断函数**************/
  • void Timer0() interrupt 1
  • {
  •         static Time_Counter = 0;//定义变量,以便计数
  •         TH0 = 0xf8;//重新放入中断初值
  •         TL0 = 0xcb;
  •         Time_Counter++;//中断一次,值加1
  •         if(Time_Counter == 5)//累计10ms的延时,以便消抖
  •         {
  •                 Time_Counter = 0;
  •                 Display_Key(Key_Scan());//按键按下,键值码送入函数,以便做相应动作

  •         …………限于本文篇幅 余下代码请从51黑下载附件…………
  • 复制代码

    所有资料51hei提供下载:
    状态机按键程序.rar (14.62 KB, 下载次数: 2)



    评分

    参与人数 1黑币 +70 收起 理由
    admin + 70 共享资料的黑币奖励!
    查看全部评分
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
    回复 使用道具 举报
    沙发
    bhjyqjs 发表于 2018-2-9 18:14 | 只看该作者
    很好的状态机处理键盘例程
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 立即注册
    本版积分规则
    QQ|手机版|小黑屋|单片机论坛
    Powered by 单片机教程网
    快速回复 返回顶部 返回列表