计数器(状态机按键检测)程序

更新时间:2023-05-16 10:26:33 阅读: 评论:0

计数器(状态机按键检测)程序
计数器(状态机按键检测)程序 
状态机是软件编程中的重要概念,比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。例如,一个按键命令解析程序就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机的例子。实际的按键解析程序会比这更复杂,但这并不影响我们对状态机的认识。
进一步看,击键动作本身可以看做一个状态机。一个击键动作包含按下、抖动、释放等状态。其实状态机的思想不单只是用在按键方面,数码管显示动态扫描、LED灯亮灭都存在状态机的思想。使用状态机思想进行单片机编程,比较通用的方法就是使用switch的选择性分支语句来进行状态跳转。
通过计数器这个实验向大家展示状态机的思想。
上图是proteus仿真图,时间每过1s计数器值自动加1,K1启动和停止计数器,K2选择要修改
的位,K3当前位加1,K4当前位减1。
完整代码如下:participate
#include<reg51.h>
typedef unsigned char UINT8;
typedef unsigned int  UINT16;
typedef unsigned long UINT32;
typedef char          INT8;
typedef int              INT16;
typedef long          INT32;
#define TIMER0_INITIAL_VALUE 5000    //5ms定时
hotchine#define SEG_PORT            P0        //数码管占用的IO口
#define KEY_PORT            P1        //按键占用的IO口conversational
#define KEY_MASK            0x0F    //按键掩码
#define KEY_SEARCH_STATUS    0        //查询按键状态
#define KEY_ACK_STATUS        1        //确认按键状态
#define    KEY_REALEASE_STATUS    2        //释放按键状态
#define KEY1                1        //按键1键值
#define KEY2                2        //按键2键值
#define KEY3                3        //按键3键值
#define KEY4                4        //按键4键值
#define HIGH                1
#define LOW                    0
#define ON                    1
#define OFF                    0
sbit DATA = P0^4;大连英语培训
sbit CLK = P0^5;
UINT8 Timer0IRQEvent = 0;    //定时器0中断事件
UINT8 Time1SecEvent = 0;    //1s定时事件
UINT8 TimeCount = 0;        //定时器0计数器,用于计数产生1s定时事件
部分分式
UINT8 SegCurPosMark = 0;    //被选中的数码管
UINT16 CounterValue = 0;    //计数器
UINT8 SegCurSel = 0;        //当前选中的数码管
UINT8 SegBuf[4] = {0};
code UINT8 SegCode[10] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
法语翻译
code UINT8 SegSelTbl[4] = {0xFE,0xFD,0xFB,0xF7};
UINT8 bSetTime = 0;            //标志位:是否设置计数值
void LS164_DATA(unsigned char x)
{
if(x)
{
DATA = 1;
}
el
{
DATA = 0;
}
}
void LS164_CLK(unsigned char x)
{
if(x)
{
CLK = 1;
}
el
{
做一个快乐的人
CLK = 0;
}
}
/**********************************************************
*函数名称:LS164Send
*输    入:byte单个字节
*输    出:无
*功    能:74LS164发送单个字节
***********************************************************/
void LS164Send(UINT8 byte)
{
UINT8 j;
for(j=0;j<=7;j++)
{
if(byte&(1<<(7-j)))
{
LS164_DATA(HIGH);
}
el
{
at leastLS164_DATA(LOW);
}
one womanLS164_CLK(LOW);
stuffit
LS164_CLK(HIGH);
}
}
/**********************************************************
*函数名称:SegRefreshDisplayBuf
*输    入:无
*输    出:无
*功    能:数码管刷新显示缓存
***********************************************************/
void  SegRefreshDisplayBuf(void)
{
SegBuf[0] = CounterValue%10;
SegBuf[1] = CounterValue/10%10;

本文发布于:2023-05-16 10:26:33,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/652883.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:状态机   按键   计数器   状态   思想   数码管   程序   进行
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图