独立按键消抖,下降沿读取代码模板
按键消抖的详细分析放在文章后面
/********************变量声明********************/
unsigned char Key_Val,Key_Down, Key_Up,Key_Old;//按键扫描变量
/*******************函数区**********************/
unsigned char Key_Read()//按键读取函数
{
unsigned char temp=0;
if(P33 == 0) temp=1; //对应按键按下,返回相应的Key_Read值
if(P32 == 0) temp=2;
if(P31 == 0) temp=3;
if(P30 == 0) temp=4;
return temp;
}
四行固定代码//用于消抖和下降沿触发,加在main函数里面使用
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val&(Key_Val ^ Key_Old);//检测下降沿
Key_Up= ~Key_Val&(Key_Val ^ Key_Old);//检测上升沿
Key_Old=Key_Val;//扫描辅助变量
独立按键控制LED亮灭
-
独立按键的原理图;跳线帽接23端口时为独立键盘模式
-
实现原理:通过扫描IO口检测按键是否按下
-
程序实例:
前置函数
#include <STC15F2K60S2.H> #include "HC138.h" #include <intrins.H> /*********** 变量声明区*********/ unsigned char LED=0xfe;//LED数据变量 1111 1110 unsigned char Key_Val,Key_Down, Key_Up,Key_Old;//按键扫描变量 /*************函数区***************/ unsigned char Key_Read()//按键读取函数 { unsigned char temp=0; if(P33 == 0) temp=1;//P33口对应的按键按下时,返回值为1 if(P32 == 0) temp=2; if(P31 == 0) temp=3; if(P30 == 0) temp=4; return temp; }
主程序
void main()
{
HC138(4);
while(1)
{
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val&(Key_Val ^ Key_Old);//检测下降沿
Key_Up= ~Key_Val&(Key_Val ^ Key_Old);//检测上升沿
Key_Old=Key_Val;//扫描辅助变量
switch (Key_Down)
{
case(1)://按键返回值为1时,P00低电平,L1亮
P00=0;
break;
case(2)://按键返回值为2时,P01低电平,L2亮
P01=0;
break;
case(3)://按键返回值为3时,P00高电平,L1灭
P00=1;
break;
case(4)://按键返回值为4时,P01高电平,L2灭
P01=1;
break;
}
}
}
独立按键控制流水灯速度
- 实现原理:
- 用独立按键控制流水灯的开启与暂停
注:由于使用Delay()函数,在延时较高的情况下可能会出现,按键按下无法控制的情况,这是因为在执行Delay()函数时,无法对按键进行检测。并非程序没有消抖。 - 通过独立按键控制time变量,从而改变延时
- 用独立按键控制流水灯的开启与暂停
- 程序实例:
void main() { HC138(4);//打开Y4使得P0口电平信息能传递给LED while(1) { Key_Val = Key_Read();//读取键码值 Key_Down = Key_Val&(Key_Val ^ Key_Old);//检测下降沿 Key_Up= ~Key_Val&(Key_Val ^ Key_Old);//检测上升沿 Key_Old=Key_Val;//扫描辅助变量 P0=LED; Delay(time); if(flag == 1)//暂停标志位为1时,开始位移 { LED = _crol_(LED,1); } switch(Key_Down) { case(1): flag=1;//按键1按下,开始位移 break; case(2): flag=0;//按键2按下,停止位移 break; case(3): if(time!=50)//最小间隔为50ms,在此间隔情况下按下按键,间隔不变 { time=time-50;//按键3按下,流速加快,间隔缩短0.05s } break; case(4): time=time+50;//按键4按下,流速放缓,间隔增加0.05s break; } } }
(蓝桥杯题目)LED彩灯控制系统
- 彩灯运行模式:
- Led1-Led2-Led3-Led4-Led5-Led6-Led7-Led8
- Led8-Led7-Led6-Led5-Led4-Led3-Led2-Led1
- Led1+Led8-Led2+Led7-Led3+Led6-Led4+Led5
- Led4+Led5-Led3+Led6-Led2+Led7-Led1+Led8
-
功能定义:
S1 启动
S2暂停
S3运行模式+1 模式4后返回1
S4运行模式-1 模式1后返回4
-
初始化:
上电默认为模式1-启动,固定流转时间为500ms
-
程序实例:
由于延时500,会导致暂停时大概率暂停失败,下面代码中的延时均为50ms#include <STC15F2K60S2.H> #include <HC138.H> #include <intrins.H> /**********************变量声明**********************/ unsigned char LED_date=0xfe;//LED数据变量 1111 1110 unsigned char LED_date34[4] = {0x7e,0xbd,0xdb,0xe7};//18,27,36,45 unsigned char LED_date34index; unsigned char LED_mode=1;//LED_mode初值为1 unsigned char Key_Val,Key_Down, Key_Up,Key_Old;//按键扫描变量 //unsigned int time=100; bit flag=1;//开始暂停标志位 /*************函数区***************/ unsigned char Key_Read() { unsigned char temp=0; if(P33==0) temp=1; if(P32==0) temp=2; if(P31==0) temp=3; if(P30==0) temp=4; return temp; } void Delay(unsigned int x) //@11.0592MHz { unsigned char data i, j; while(x--) { _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); } } void main () { HC138(4); while(1) { Key_Val = Key_Read();//读取键码值 Key_Down = Key_Val&(Key_Val ^ Key_Old);//检测下降沿 //Key_Up= ~Key_Val&(Key_Val ^ Key_Old);//检测上升沿 Key_Old=Key_Val;//扫描辅助变量 switch(Key_Down)//按键功能 { case(1): flag=1;//开始 break; case(2): flag=0;//暂停 break; case(3)://LEd模式数加1 if(LED_mode==4) { LED_mode=1; } else { LED_mode++; } break; case(4)://LED模式数减1 if(LED_mode == 1) { LED_mode=4; } else { LED_mode--; } break; } if(flag == 1)//判断是否开启 { switch(LED_mode)//检查LED工作模式 { case(1): P0 = LED_date; Delay(50); LED_date = _crol_(LED_date,1);//左移位 break; case(2): P0 = LED_date; Delay(50); LED_date = _cror_(LED_date,1);//右移位 break; case(3): P0=LED_date34[LED_date34index];//使用数组,两边向中间 Delay(50); if(LED_date34index==3) { LED_date34index=0; } else { LED_date34index++; } break; case(4): P0=LED_date34[LED_date34index];//中间向两边 Delay(50); if(LED_date34index==0) { LED_date34index=3; } else { LED_date34index--; } break; } } } }
-
演示视频:
LED彩灯控制系统演示