> 文章列表 > 【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务

【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务

【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 charvoid 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 charvoid 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);}	}
}

天行健,君子以自强不息。人生是一场努力,就算结局是一个烧糊的花卷子,也不要懊悔自己曾经的一番烈火锻炼。人生风景在路过,不在结局。