基于51单片机四个按键四种方式电亮LED灯,示例中的为代码的主要部分,是实现功能的代码。delay表示延时,是自定义的函数,最终代码可直接运行。

51单片机多种方式点亮LED

  • 方式1 全亮和全熄
  • 方式2 依次电亮
  • 方式3 从上到下,再下到上一次电亮
  • 方式4 两边向中间电亮
  • 补充说明及按键控制思路
  • 最终代码

方式1 全亮和全熄

对于八个LED控制高低电平,可以一次性使用P1=0x**
低电平0则亮,1则熄。
8个LED对应的不同的电平,就比如控制全熄,那么对于的八位二进制数1111 1111

转为16进制则为ff,那么P1=0xff即为8个LED全熄,每个LED对应各自位的二进制数,比如最两边的不亮,1000 0001,转16进制,同理输入即可
P1=~P1即为取反,1变0,0变1, 比如,1000 0001就成了0111 1110

 while(1){delay(500);P1 =0x00;delay(500);P1 = ~P1;}

方式2 依次电亮

我们依然可以用之前的16进制输入。不同的是,如果继续直接赋值,对应8个LED,加上每次的延时,意味着程序十几句话,更重要的是后续的打断不方便,因此采用移位的操作,A<<m,表示数据A向左移动m位,空余的位置补0,同时取一定的位数,我们单片机八位二进制,所以只会去取八位:

比如
A=0000 0001 m=2时 移位后 A=0000 0100,原来在第一位的1会到第三位,同时空缺的补0
A=0100 0001 m=2时 移位后 A=0000 0100,最前边的1在移位后超出,不会取到它

同时当移动完

 while(1){   led = 0xfe;P1 = led;for(j=1;j<8;j++){ delay(500);led=led<<1;P1 = led;}          delay(1000);led = 0xff;j = 1;P1 = led;delay(500);}

方式3 从上到下,再下到上一次电亮

跟第二个同理
这里的 crol 与cror就是我们上一步说的移位类似,表示循环移位,crol 左移,cror右移,区别在于超出位数的部分会自动跑到最开始的位置,比如第八位循环移位一次,那么经过循环就该到第一位,可以当做他们是圈一样的循环。
比如
A=0100 0001 m=2时 移位后 A=0000 0101

需要头文件#include<intrins.h>
也可以跟我们上一步同样的操作实现

while(1)
{   P1 = 0xfe;for(m=1;m<8;m++){  led = 0xfe;delay(500);led = _crol_(led,m);P1 = led;      }for(n=1;n<8;n++){     led = 0x7f;               delay(500);led = _cror_(led,n);                    P1 = led;}m = 1; n = 1;}

方式4 两边向中间电亮

此处将两边分开表示即可

 while(1){   led = 0x7e;High=led&0xF0; Low=led&0x0F;for(i=0;i<4;i++){   led=(High&0xF0)|(Low&0x0F);P1 = led;delay(500); High=High>>1;  Low=Low<<1;               }i = 0;P1 = 0xff;delay(500);}

补充说明及按键控制思路

对于移位也是可以跟取反一起实现的,有些需求电亮后不熄灭的,可以循环移位,让1补回去,也可以将初始亮的灯定义熄灭0,移位取反,也可以达到与方式三循环移位的效果
P1=~(0x01<<i);

关于按键控制思路
首选最大的问题在于循环的打破,我们的程序初始设置的都是死循环,那么想要打破可以判断条件,不满足则break,这里不能仅仅只动while(1)是因为程序需要更快的打破,while判断是可以打破循环,但是一次循环的过程长了也是带来诸多不变,所以对于函数内的for循环每次也加判断,这样方便更快结束程序

思路一,也是最简单粗暴的,直接判断按键,比如结束第2个的循环,
最外的while(!KEY1 || !KEY3|| !KEY4)
for里边的if(KEY1 || KEY3 || KEY4) break; else
但是这样并不灵敏,对于循环以及延时的而言,他们判断按键依然是有一定时间后才执行的,以至于会出现按下没打断,按下打断了但未执行下一个,只有按下足够长的时间才能保证顺利切换

思路二 ,对按键赋值,让按下按键1,会有一个变量A为1,直到按下其他按键,改变A的值,同时也能够保证单片机可以及时扫描到按键按下,改变A,那么在判断的时候,比如程序2,我们只需判断A是否为2,按下3时,A不为2了跳出,同时3进行,这些切换存在的延时以及不需要我们一直按下按键了,这里采用的是定时器每隔50ms(50ms真的很快了,另外时间可以自己设置,50ms真的足够)扫描一下按键。

最终代码

代码如下:

#include<reg52.h>
#include<intrins.h>
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
unsigned int i,j,m,n;
unsigned char led,High,Low;
char key_s;                               void delay(unsigned char x)                          //延时函数,延时x毫秒
{unsigned char a,b,c;for(c=x;c>0;c--)for(b=4;b>0;b--)for(a=248;a>0;a--);
}void delay_1()                                      //按键一的延时
{if(key_s==1){delay(500);}
}void delay_2()                                      //按键二的延时
{if(key_s==2){delay(500);}
}void delay_3()                                      //按键三的延时
{if(key_s==3){delay(500);}
}void delay_4()                                      //按键四的延时
{if(key_s==4){delay(500);}
}void key()                                          //各个按键的响应函数
{P1 = 0xff;while(key_s==1){delay(500);P1 = ~P1;delay_1();P1 = ~P1;}while(key_s==2){  led = 0xfe;P1 = led;for(j=1;j<8;j++){ delay_2();led=led<<1;P1 = led;}           delay_2();delay_2();led = 0xff;j = 1;P1 = led;delay_2();} while(key_s==3){ P1 = 0xfe;for(m=1;m<8;m++){  led = 0xfe;delay_3();led = _crol_(led,m);P1 = led;       }for(n=1;n<8;n++){     led = 0x7f;               delay_3();led = _cror_(led,n);                 P1 = led;}m = 1; n = 1;}   while(key_s==4){led = 0x7e;High=led&0xF0; Low=led&0x0F;for(i=0;i<4;i++){   led=(High&0xF0)|(Low&0x0F);P1 = led;delay_4(); High=~(~High>>1);   Low=~(~Low<<1);               }i = 0;}
}   void key_state()                                     //按键状态
{ if(key1==0||key2==0||key3==0||key4==0){   delay(10); if(key1==0||key2==0||key3==0||key4==0){if(key1==0){key_s = 1;}else if(key2==0){key_s = 2;}else if(key3==0){key_s = 3;}else if(key4==0){key_s = 4;}}}
}void main()
{   TMOD = 0x01;    //选择模式EA = 1;       //总中断打开//高八位  (65536-50000)/256 转 16 进制数,也可以直接写TH0=(65536-50000)/256 ,这里的50000即5万微秒,就是50毫秒,自定义时间,不要超过65536TH0 = 0x3c;    TL0 = 0xb0;   //低八位    同理TL0=(65536-50000)%256ET0 = 1;    //定时器中断打开TR0 = 1;    //定时器开关打开while(1){key();}
}void Timer0() interrupt 1                           //定时器中断,间隔50ms
{TH0=0x3c;TL0=0xb0;   key_state();
}

51单片机多种方式点亮LED相关推荐

  1. 普中51单片机学习日记-点亮LED

    普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...

  2. 51单片机第一篇章-点亮LED

    排版能力不强,小白一个.学习理解能力一般,当做边学习边复盘.有错误请指正,交个朋友,交流51,也可交流就业趋势! 不论学习什么单片机,最简单的外设莫过于 IO 口的高低电平控制. 什么是LED? LE ...

  3. 51单片机c语言点亮LED,点亮LED

    1.硬件连接 了解了上一讲的一些元器件的使用原理,那么使用本教程的开发板点亮最右端的LED2的硬件连接简化为如下所示 2.软件分析 我们知道74HC138要想正常工作,单片机的P1.4要输出0,P1. ...

  4. 51单片机入门(2)LED点亮的背后

    上一节提到了51单片机开发环境的搭建,这节我们开始正式进入51单片机的学习--点亮LED. 所有的控制类芯片学习的第一个实践就是点亮LED,这是最简单.最基本的操作,但这个实现过程却可能攘括了单片机的 ...

  5. 毕业设计 基于51单片机无线蓝牙APP控LED灯亮灭亮度设计

    基于51单片机无线蓝牙APP控LED灯亮灭亮度设计 1.项目简介 1.1 系统构成 1.2 系统功能 2.部分电路设计 2.1 LED信号指示灯电路设计 2.2 蓝牙模块 3.部分代码展示 3.1 串 ...

  6. 【51单片机入门】点亮多个LED流水灯

    [51单片机&入门]点亮多个LED流水灯 实验环境 功能实现 PCB原理图 代码 要点 仿真 代码 实验环境 Keil C51 Proteus 8.9 功能实现 LED流水灯依次从右向左亮起, ...

  7. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇“显示贪吃蛇”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇"显示贪吃蛇" 完整的项目链接: https://github.com/linxinloningg/51_chip_ ...

  8. STM32F03寄存器方式点亮LED流水灯

    STM32F03寄存器方式点亮LED流水灯 文章目录 STM32F03寄存器方式点亮LED流水灯 一.题目内容 二.STM32F03系列芯片的地址映射和寄存器映射映射原理:了解GPIO端口的初始化设置 ...

  9. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇"自动运行函数" 完整的项目链接: https://github.com/linxinloningg/51_chip ...

  10. 51单片机红外通信及控制LED灯(LCD1602显示)

    51单片机红外通信及控制LED灯(LCD1602显示) 大家好,又和大家见面了,离上一次DS18B20传感器的文章已经过去了一个星期了,这期我将给大家带来,基于STC89C52芯片和HS0038红外接 ...

最新文章

  1. FPGA之道(22)VHDL基本程序框架
  2. CheckStyle
  3. 框架:servlet和MVC
  4. linux c++ 调用matlab,ubuntu系统下C++调用matlab程序的方法详解
  5. 修改hostname有几种方式?(转)
  6. 本周耐撕团队个人总结
  7. 用Flask封装下Ansible提供后端API
  8. 如何站在双11的肩膀上 详解阿里云企业级互联网架构
  9. 皇家彩世界教程iOS性能优化系列篇之“优化总体原则”
  10. r语言导入spss数据_R 中数据导入
  11. ADOConnection 打开EXCEL
  12. PTA-C语言-解一元二次方程
  13. 星号下三角形python答案_Python利用for循环打印星号三角形的案例
  14. 我犯了一个非常基础的错误:在对List的循环中改变了List
  15. 搞不定思想和组织转变,何谈企业转型
  16. AS3中对声音的控制
  17. web应用商城部署(mall)
  18. 用while实现一个简单的猜数字小游戏
  19. PCIe 4.0 SSD测试:接口、散热和CPU对性能的影响
  20. 【从零开始学Skynet】基础篇(三):服务模块常用API

热门文章

  1. [PMP]专题资源管理错题
  2. 计算机设置定时关机win10,Win10电脑如何设置定时关机?Win10电脑设置定时关机命令...
  3. 硬盘格式化后数据能否恢复 硬盘格式化数据恢复方法分享
  4. 什么是大数据,模式识别和人工智能算法实现
  5. Dell Dock 无法启动解决办法
  6. 学习笔记(3):掌握JQuery视频教程-jquery选择器03
  7. 好用的论文翻译工具集锦
  8. Office2016+Visio2016安装教程(超简单)
  9. eclipse怎么恢复默认界面
  10. 王道 计算机网络试题讲解_王道考研 计算机网络(7)学习笔记