下午把状态机无延时按键消抖弄到51单片机上面,下面晒一下程序:
#include
enum State {Init, Press, Free}; //定义按键状态的枚举类型
enum State Key_State; //按键状态
sbit Key1 = P2^4;
sbit Key2 = P2^5;
sbit Key3 = P2^6;
sbit Key4 = P2^7;
void Delay_ms(unsigned int x)
{
int i,j;
for(i=0; i<110; i++)
for(j=0; j
case Init : // 按键初始态
if((P2 | 0x0f) != 0xff)
{
Key_State = Press; // 键被按下,但需要确认是否是干扰
}
break;
case Press : // 按键确认态
if((P2 | 0x0f) != 0xff) //如有键按下则不是干扰,判断键值
{
//判断是哪一个按键被按下
if( (P2 | 0xef) != 0xff ) //第一个键被按下
{
}
if( (P2 | 0xdf) != 0xff ) //第二个键被按下
{
}
if( (P2 | 0xbf) != 0xff ) //第三个键被按下
{
}
if( (P2 | 0x7f) != 0xff ) //第四个键被按下
{
}
Key_State = Free; // 状态转换到键释放态
}
else
{
Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态
}
break;
case Free :
if((P2 | 0x0f) == 0xff) //判断按键是否释放
{
Key_State = Init; //如果按键释放,转换到按键初始态
}
break;
case Init : // 按键初始态
if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0))
{
Key_State = Press; // 键被按下,但需要确认是否是干扰
}
break;
case Press : // 按键确认态
if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0)) //如有键按下则不是干扰,判断键值
{
//判断是哪一个按键被按下
if(Key1 == 0) //第一个键被按下
{
}
if((Key2 == 0)) //第二个键被按下
{
}
if((Key3 == 0)) //第三个键被按下
{
}
if((Key4 == 0)) //第四个键被按下
{
}
Key_State = Free; // 状态转换到键释放态
}
else
{
Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态
}
break;
case Free :
if((Key1 == 1) & (Key2 == 1) & (Key3 == 1) & (Key4 == 1)) //判断按键是否释放
{
Key_State = Init; //如果按键释放,转换到按键初始态
}
break;
关键字:51单片机 状态机 消抖
引用地址:51单片机的状态机消抖
;
}
//===============================================================================
//函数名称:键盘扫描(状态机无延时消抖)
//说明:键盘接口对应: key1 = P2-4 key2 = P2-5 key3 = P2-6 key4 = P2-7
//参数:
//返回值:
//日期:2011-6-22
//修改:
//===============================================================================
void Keyscan(void)
{
switch (Key_State)
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
}
这是另外一种,其实都差不多,只不过比较直观而已。
void Keyscan(void)
{
switch (Key_State)
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
}
上一篇:keil 51启动代码
下一篇:c51中的intrins.h库函数
推荐阅读最新更新时间:2024-03-16 14:44
MCS-51单片机汇编中的“指针”
111条单片机指令中让我想起高级语言中的指针的功能。 数据传送类指令中的 指针 1)MOV A,@Ri 2)MOV direct,@Ri 3)MOV @Ri,A MOV @Ri,direct MOV @Ri,#data8 4)MOVX A,@Ri MOV A,@DPTR 5)MOVX @Ri,A 6)MOVX @DPTR,A @:指向的意思。
[单片机]
51单片机-继电器
继电器控制方式: * 单片机I/O口控制端 * 继电器控制端 * 光耦控制端 * 在原理图中TX-3那部分,用单片机控制继电器把P35与JDQ连接在一起,如果B极是低电平,那么VCC的电流流过B,电流流过C极,通过继电器的线圈,指针从常闭端打到常开端。对应上边继电器左边绿色的那三个中间的是中间端,一个常开端,一个常闭端。平时中间端和常闭端是导通的,一控制继电器吸合,中间端和常开端导通。 NPN与PNP的区别 NPN和PNP主要就是电流方向和电压正负不同,说得 专业 一点,就是 极性 问题。 NPN 是用 B E 的电流(IB)控制 C E 的电流(IC),E极电位最低,且正常放大
[单片机]
51单片机计数器编程举例 计数值到一定大小后中断报警
程序: ORG 0000H AJMP START ORG 001BH AJMP TIMER1 ;定时器1的 中断 处理 ORG 30H START: MOV SP,#5FH MOV TMOD,#01010000B ;定时/计数器1作计数用,模式1,0不用全置0 MOV TH1,#0FFH MOV TL1,#0FAH ;预置值,要求每计到6个脉冲即为一个事件 SETB EA SETB ET1 ;开总中断和定时器1中断允许 SETB TR1 ;启动计数器1开始运行. AJMP $ TIMER1: PUSH ACC PUSH PSW CPL P1.0 ;计数值到,即取反P1.0 MOV TH1,#0F
[单片机]
基于AT89S51单片机设计的电子琴
1.实验任务 (1).由4X4组成16个按钮矩阵,设计成16个音。 (2).可随意弹奏想要表达的音乐。 2.电路原理图 3.系统板硬件连线 (1).把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2).把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上; 4.相关程序内容 (1).4X4行列式键盘识别; (2).音乐产生的方法; 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定
[单片机]
51单片机C编程(三、4位数码管飞入效果)
4位数码管飞入效果,PROTEUS仿真电路图如下: #include reg51.h #define uchar unsigned char #define LED P0 uchar code tab ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管数字码 uchar disp1 ={{8,10,10,10},{0,8,10,10},{5,0,8,10},{1,5,0,8},{10,1,5,0},{10,10,1,5},{10,10,10,1},{10,10,10,10}}; //数码管的8个显示状态 uchar scan;
[单片机]
51单片机基础之1602显示器
代码: main.c文件 #include public.h #include lcd1602.h /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { int a=111; lcd160
[单片机]
关于51单片机的定时器T0、T1总结
这是我总结的51单片机的中断定时器原理,之后会附上附件。第一次发帖,不足之处请多多包含! 我总结的文稿画面很花,所以给上个参考,各位不习惯的话,请酌情选择。 目录 一、原理: 1、对中断和定时器进行初始化: ①定时器/计数器工作方式寄存器 ②设定初值 ③开启中断和定时器 2、设置中断服务程序: 3、主函数: 二、各个定时器和工作方式: 方式0: 方式2: 方式3: 借鉴:郭天祥《新概念51单片机C语言教程》 一、原理: 51单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机的定时器是一样的,只是52比51多了一个定时器/计数器T2,它们的设置都大同小异,下面我来总结各个定时器的用法。 定时器
[单片机]
基于51单片机的车用数字仪表设计与实现
摘 要:介绍了一种以MCS 51单片机为主控器,以ADC0809为核心,以气压、油压、温度、霍尔元件等传感器为主要外围元件的车用数字仪表(VDI)的设计与实现。该仪表系统具有显示直观、准确,使用方便可靠等优点,代表了车用仪表的最新发展趋势。 关键词: MCS 51单片机;传感器;车用数字仪表 引言 ---车辆仪表是驾驶员与汽车进行信息交流的重要接口和界面,是车辆安全行驶的重要保证。随着电子技术的广泛应用,传统汽车仪表逐渐被微处理器为核心的电子控制数字仪表取代已成为必然趋势。然而,目前国内车辆仪表数字化水平还不高,绝大部分仪表还是模拟式的,而大多数模拟仪表表头的体积较大、数量多,使得显示系统拥挤不堪,影响美观;另外
[单片机]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多热门文章
更多每日新闻
更多往期活动
- TE Connectivity 助力下一代测试测量
- Fluke高分辨率热像仪~小细节也不放过!免费体验报名中
- EEWorld邀你来拆解(第7期)——拆拆减肥利器,看看跳绳里都有什么
- TI“无线”风光可穿戴现场培训直播,诚邀参与,预注册赢好礼
- 有奖直播|无线技术改变智能生活
- 【EEWORLD第六届社区明星人物】8月明星人物
- 6月4日上午10:00直播:英飞凌栅极驱动芯片的应用以及安富利对应的解决方案
- 2016年是德印象测试微视频网络竞选(大中国区)
- 瑞萨电子最新触控微控制器R7F0C208入门套件免费申请,参与申请还能赢好礼!
- 智能云锁哪家强?TI市场和技术大咖邀你1月16日10:00直播间畅聊
11月25日历史上的今天
厂商技术中心