标题: 用单片机独立按键实现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