内容正文:
任务3-2 按键控制多种花样霓虹灯设计
1
一、任务导入
任务要求
通过按键控制发光二极管显示不同的内容。
采用8个发光二极管模拟霓虹灯的显示,一个按键K控制8个发光二极管实现不同显示方式。当K没有按下时,8个LED全亮,当K按下时8个LED显示流水灯效果。
硬件电路
P0.0引脚通过上拉电阻1KΩ与+5V电源连接,当K没有按下时,P0.0引脚保持高电平,当K按下时,P0.0引脚接地,因此通过读取P0.0引脚的状态,就可以得知按键K是否被按下。
二、有弹性的按键
什么是按键开关呢?
6
按钮开关
常用按键符号
7
8
9
机械式按键开关有一个最大的特点,那就是它是有弹性的。
10
11
消除抖动方法
增加硬件电路
软件延时
12
三、程序设计
void main() //主函数
{
unsigned char i,w;
P1=0xff; //LED全灭
while(1)
{
if(K==0) //第一次检测到按键K按下
{
delay(1200); //延时10ms左右去抖动
if(K==0) //再次检测到按键K按下
{ w=0x01; //流水灯显示字初值为0x01
for(i=0;i<8;i++)
{
P1=~w; //显示字取反后,送P1口
delay(10000); //延时,一个灯显示时间
w<<=1; //显示字左移一位
}
}
}
else P1=0x00; //没有按键按下,8个灯全部点亮
}
}
选择语句
if (表达式)
{
语句组1;
}
else
{
语句组2;
}
void main() //主函数
{
unsigned char i,w;
P1=0xff; //LED全灭
while(1)
{
if(K==0) //第一次检测到按键K按下
{
delay(1200); //延时10ms左右去抖动
if(K==0) //再次检测到按键K按下
{ w=0x01; //流水灯显示字初值为0x01
for(i=0;i<8;i++)
{
P1=~w; //显示字取反后,送P1口
delay(10000); //延时,一个灯显示时间
w<<=1; //显示字左移一位
}
}
}
else P1=0x00; //没有按键按下,8个灯全部点亮
}
}
软件去抖流程
四、举一反三
没有按键按下时:8个LED全灭
当K1按下时:8个LED全亮
当K2按下时:高4位连接的LED点亮
当K3按下时:低4位连接的LED点亮
当K4按下时:8个LED交叉亮灭
用4个按键K1,K2,K3,K4控制花样霓虹灯的具体要求:
举一反三1
17
输入 :
按键按下, I/O引脚为0
按键弹起, I/O引脚为1
硬件设计
If else if
Switch语句
switch语句
按键与开关的区别
软件设计思路
#include <reg51.h> //包含头文件reg51.h,定义了51单片机专用寄存器
#define TIME 1200 //定义符号常量TIME,代表常数1200,关于符号常量
sbit K1=P0^0; //定义位名称
sbit K2=P0^1;
sbit K3=P0^2;
sbit K4=P0^3;
if(K1==0) //第一次检测到K1按下
{
delay(TIME); //延时去抖动
if(K1==0)P1=0x00; //再次检测到K1按下,第一种模式,8个灯全亮
}
else if(K2==0) //第一次检测到K2按下
{
delay(TIME); //延时去抖动
if(K2==0)P1=0x55; //再次检测到K2按下,第二种模式,8个灯交叉亮
}
else if(K3==0) //第一次检测到K3按下
{
delay(TIME); //延时去抖动
if(K3==0)P1=0x0f; //再次检测到K3按下,第三种模式,高四位亮
}
else if(K4==0) //第一次检测到K4按下
{
delay(TIME); //延时去抖动
if(K4==0)P1=0xf0; //再次检测到K4按下,第四种模式,低四位亮
}
if (表达式1)
{
语句组1;
}
else if (表达式2)
{
语句组2;
}
……
else if (表达式n)
{
语句组n;
}
else
{
语句组n+1;
}
采用8个发光二极管模拟霓虹灯的显示,通过1个按键控制霓虹灯在四种显示模式之间切换,由P0口的P0.0引脚控制按键K。
当K第一次按下,显示第一种模式;
第二次按下,显示第二种模式;
第三次按下,显示第三种模式;
第四次按下,显示第四种模式,
第五次按下,又显示第一种模式。
举一反三2
程序设计思路
判断按键并累加次数
根据次数进行跳转
判断按键是否弹起
if(K==0) //第一次判断有键按下
{
delay(1200); //延时消除抖动
if(K==0) //再次判断有键按下
{
if(++i==5)i=1; //i增1,且增加到5后,再重新赋值1
}
}
判断按键并累加次数
根据次数进行跳转
switch(i) //根据i的值显示不同模式
{
case 1:P1=0x00;break; //i=1显示第1种模式
case 2:P1=0x55;break; //i=2显示第2种模式
case 3:P1=0x0f;break; //i=3显示第3种模式
case 4:P1=0xf0;break; //i=4显示第4种模式
default:break;
}
判断按键是否弹起
while(!K); //等待K键释放,!为逻辑非操作
delay(1200); //延时消除抖动
感谢您的观看
Thanks for your attention.
26
$$