找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2287|回复: 1
打印 上一主题 下一主题
收起左侧

用单片机独立按键实现led灯的亮灭程序,重点是实现两种模式:单次扫描和连续扫描

[复制链接]
跳转到指定楼层
楼主
ID:1053062 发表于 2022-11-21 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我之前跟着开发板学习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,等待下次按键按下
*/

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1076019 发表于 2023-5-8 11:16 | 只看该作者
模式为1,按了就看不出了,亮和灭都是随机的,无法控制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表