标题:
用单片机独立按键实现led灯的亮灭程序,重点是实现两种模式:单次扫描和连续扫描
[打印本页]
作者:
wangmengxu
时间:
2022-11-21 09:41
标题:
用单片机独立按键实现led灯的亮灭程序,重点是实现两种模式:单次扫描和连续扫描
我之前跟着开发板学习51单片机,然后学着学着,自己练习只看原理图和芯片手册自己写代码,最后发现每个人的思路是不一样的,按照自己的思路可能写出来比他更简单的代码,所以不管看谁的视频或者怎么学都必须要自己动手打代码,这样才能调用自己的思维,自己形成自己的代码习惯
分享一下我当时自己写的代码,最后有整体解释,每一步有单独的注释,希望能对新手入门起到帮助。
有几步很微妙,自己第一次想真的是想不到,所以一定要先模仿,然后再自己创新,给同学者一点自己的心得建议,望有帮助!
单片机源程序如下:
//独立按键K1控制D1指示灯亮灭
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
sbit LED1=P2^0;
void delay_10us(u16 time)
{
while(time--);
}
void key_scan(u8 mode) //模式选择函数:0表示单次扫描,1表示连续扫描
{
static u8 key=1; //静态变量第一次赋初值必须要为1,至少要执行一次
if(mode)key=1; //判断模式,若形参为1,把上一次循环清零的key变成1
if((key==1)&&(K1==0)) //逻辑运算,如果mode=1且有按键按下
{
delay_10us(1000); //10ms
if(K1==0) //二次判断
LED1=!LED1;
key=0;
}
else if(K1==1) //没有按键按下,要把key变成1,缺少这一步,按键按一次变化之后就不会变了
key=1; //else if与最近的if语句相关联
}
//void key_functions()
//{
// if(K1==0)
// {
// delay_10us(1000); //10ms
// if(K1==0) //二次判断
// LED1=!LED1; //LED1即P20口初始为高电平
//
// }
//}
void main()
{
while(1)
{
key_scan(1); //实参选择模式
}
}
/*整个过程:
第一种情况:mode=0,单次操作
1.key=1
2.key_scan函数里第一个if语句不满足,直接跳到下一条
3.由于赋初值key=1,有按键按下时,执行第二个if语句
4.key清零
5.若前一个操作按键按下没送,第二次循环到来时,由于key已经为0,不满足第二个if语句,不会执行LED灯状态翻转操作
6.直到前一次按键松开,K1=1,再把key变成1,等待下次按键按下
第二种情况:mode=1,连续操作
1.key=1
2.key_scan函数里第一个if语句满足,key仍然为1
3.由于赋初值key=1,有按键按下时,执行第二个if语句
4.key清零
5.若前一个操作按键按下没送,第二次循环到来时,由于第一个if语句满足,key再次变成1,满足第二个if语句,继续执行LED灯状态翻转操作
6.直到前一次按键松开,K1=1,再把key变成1,等待下次按键按下
*/
作者:
Roddy123
时间:
2023-5-8 11:16
模式为1,按了就看不出了,亮和灭都是随机的,无法控制
作者:
zyscxr
时间:
2024-9-22 20:08
优秀,向你学习
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1