【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务
学习目标:
学习普中51单片机的按键控制led灯。
电路图:
学习内容:
LED灯的十六进制怎么算???
在这给大家算一下:首先先看一下LED模块的电路图!
实物图:
可以把
D1 D2 D3 D4 D5 D6 D7 D8
看成
1 1 1 1 1 1 1 1
如:
D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
十六进制1位 对 二进制 四位
则
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C |
0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 |
下图接上图后:
D | E | F |
1101 | 1110 | 1111 |
根据上图可以知道 十六进制 和 二进制 的一一对应。
根据电路图又知 当 低电平 的时候 led灯点亮 即低电平有效。
在数字电路中 1 代表 高电平 0 代表 低电平
还有一个就是需要知道实物的编码方式:
D1 ——> D8
所有led灯熄灭 则 111111111 十六进制就是 0xFF
如果我想要 右边第一个led灯亮 111111110
注:这里要明白 左边 1111 右边1111
左边的1111控制的是右边的四个灯
右边的1111控制的是左边的四个灯
所有想要右边第一个灯亮 则 就是 0x7F
比如 我想要 右边第二个灯亮 1111 1101 就是0xBF (可以理解为就是反着来)
说明:1101 是从左到右 的 1+2+8 = 11 = B
(本文这样计算 只针对普中51单片机)
由于 上文可知
右边第三个灯亮 1111 1011 0xDF
右边第四个灯亮 1111 0111 0xEF
左边第一个灯亮 0111 1111 0xFE
说明: 0111 是从左到右 的 2+4+8 = 14 = E
左边第二个灯亮 1011 1111 0xFD
左边第三个灯亮 1101 1111 0xFB
左边第四个灯亮 1110 1111 0xF7
由此 即讲完了 十六进制 控制 P2 亮指定灯 后续又代码 大家也可参考!
学习内容:
题目:
用汇编或C语言实现霓虹灯效果:
1)开始D1、D2、D3、D4、D5、D6、D7、D8,全灭,
2)等待按键KEY1按下松开后D4->D3->D2->D1和D5->D6->D7->D8同时间隔约0.2秒逐次点亮后,从D8->D7->D6->D5->D4->D3->D2->D1逐次间隔0.3秒灭掉,循环执行D4->D3->D2->D1和D5->D6->D7->D8同时间隔约0.2秒逐次点亮后,从D8->D7->D6->D5->D4->D3->D2->D1逐次间隔0.3秒灭掉;重复以上现象。
3)按键再一次按下后:D1->D2->D3->D4和D8->D7->D6->D5同时间隔0.2秒逐次点亮后,从D8->D7->D6->D5->D4->D3->D2->D1逐次间隔0.3秒灭掉;重复以上现象。
4)等按键按下后,分别重复1)2) .... ...
代码如下:
#include <reg51.h>
sbit key1 = P3^1;
#define uint unsigned int
#define uchar unsigned char
void delay(uint z) {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
int i,j,key=1;
while(1)
{
if(key1 == 0)
{
delay(20);
if(key1 == 0)
{
key +=1;
}
if(key == 2)
{
for(j=0;j<4;j++)
{
P2 = 0xE7;
delay(200);
P2 = 0xC3;
delay(200);
P2 = 0x81;
delay(200);
P2 = 0x00;
delay(200);
for(i=0;i<8;i++)
{
P2=~(0x7f>>i);
delay(300);
}
}
}
if(key == 3)
{
for(j=0;j<4;j++)
{
P2 = 0x7E;
delay(200);
P2 = 0x3C;
delay(200);
P2 = 0x18;
delay(200);
P2 = 0x00;
delay(200);
for(i=0;i<8;i++)
{
P2=~(0x7f>>i);
delay(300);
}
}
}
}
}
}
/*
P2=0XF7;
delay(200);
P2=0XF3;
delay(200);
P2=0XF1;
delay(200);
P2=0XF0;
delay(200);
P2=0xEF;
delay(200);
P2=0xCF;
delay(200);
P2=0x8F;
delay(200);
P2=0x0F;
delay(200);
*/
学习内容:
题目
用汇编或者c语言实现
1)初始状态所有灯火。
2)等按键K3第一次按下松开后D1->D2->D3->D4->D5->u0->L? v0 b0NO 『T
秒亮后,等全亮后,冉从D8->Dr-5.山U流水虹效里掉,重复上面的全亮到全灭重复执行;出现流水灯效果。
3)按键K3第二次按下松开后出现跑马灯效果
4)按键再一次按下后,重复2)3)现象。
代码如下:
#include <reg51.h>
#include "intrins.h"
sbit key1 = P3^2;
#define led P2
#define uint unsigned int
#define uchar unsigned char
void delay(uint z) {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
int i,j,key=1,a = 1;
P2 = 0xFF;
delay(500);
while(1)
{
if(key1 == 0)
{
delay(20);
if(key1 == 0)
{
key +=1;
}
if(key == 2 && a == 1)
{
for(i=0;i<8;i++)
{
P2=0XFE<<i;
delay(500);
}
for(i=0;i<8;i++)
{
P2=~(0x7f>>i);
delay(500);
}
a = 2;
}
if(key == 3 && a == 2)
{
led=~0x01;
delay(500);
for(i=0;i<7;i++)
{
P2=_crol_(P2,1);
delay(500);
}
for(i=0;i<7;i++)
{
P2=_cror_(P2,1);
delay(500);
}
a = 3;
}
if(key == 4 && a == 3)
{
for(i=0;i<8;i++)
{
P2=0XFE<<i;
delay(500);
}
for(i=0;i<8;i++)
{
P2=~(0x7f>>i);
delay(500);
}
led=~0x01;
delay(500);
for(i=0;i<7;i++)
{
P2=_crol_(P2,1);
delay(500);
}
for(i=0;i<7;i++)
{
P2=_cror_(P2,1);
delay(500);
}
key = 1;a = 1;
}
P2 = 0xFF;
delay(500);
}
}
}