众所周知,点灯可谓是硬件爱好者们心中的「 Hello,World 」,但是在硬件学习前期,led和smg或许是最好的调试结果对比工具,小小的led其实也有大大的道理,或许这一篇led能帮你梳理一遍:关于LED,我们需要掌握哪些。
点灯之前:
因为根据原理图上显示,要点亮LED,首先要对译码器进行处理,这里简单地介绍一下锁存器和译码器。
- 为何要用锁存器?
答:由“锁”字可以联想到保险柜,保险柜呢打开锁之后,把钱放进去,再把锁锁上,不管你外面再怎么变化,我的Money是不会少一点的,该是什么样就是什么样的。哪锁存器就好理解了,相当于我在单片机想要保留某一状态但是又不想影响其他状态的时候,巧妙的借用了锁存器这一功能。 - 为什么要用译码器?
答:译码器,语句上理解就是密码翻译器。你想,如果用2进制来表示你想要的密文,如果你学过数电,应该知道3-8译码器(具体不多说了,不懂的去百度上搜一下三八译码器)把三位数翻译成八位数(节省了IO口啊!)
话不多说,上译码器初始化代码
函数名称:SelectHC573
函数说明:一共四个选择,分别对应了上图的四个区域
void SelectHC573(unsigned char t)
{
switch(t)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;break;
}
}
是时候展现真正的技术了!
下面就直接上LED的各种调试好的代码了!
- 点亮L1
- 点亮任一一盏灯
- 点亮全部
#include "reg52.h"
sbit L1 P0^0;
sbit L2 P0^1;
sbit L3 P0^2;
sbit L4 P0^3;
sbit L5 P0^4;
sbit L6 P0^5;
sbit L7 P0^6;
sbit L8 P0^7;
/******************************************
* 函数名称:Led_ShowL1
* 函数功能:点亮L1
* 函数说明:无
******************************************/
void Led_ShowL1()
{
P2 = (P2 & 0x1f ) | 0x80;
P0 = 0xff; // 全灭:1111 1111
L1 = 0; // P0 = 0x7f: 0111 1111
}
// 仅点亮某一盏灯
/******************************************
* 函数名称:Led_ShowBit
* 函数功能:点亮某一盏LED灯
* 函数说明:每次调用只能点亮自己想点亮的那盏灯,不能同时点亮
******************************************/
void Led_ShowBit(unsigned char LedID)
{
P2 = (P2 & 0x1f ) | 0x80; // SelectHC573(4);
switch(LedID){
case 1: P0 = 0x7f;break;
case 2: P0 = 0xbf;break;
case 3: P0 = 0xdf;break;
case 4: P0 = 0xef;break;
case 5: P0 = 0xf7;break;
case 6: P0 = 0xf8;break;
case 7: P0 = 0xfd;break;
case 8: P0 = 0xfe;break;
}
}
/******************************************
* 函数名称:Led_ShowAll
* 函数功能:点亮全部LED
* 函数说明:无
******************************************/
void Led_ShowAll()
{
P2 = (P2 & 0x1f ) | 0x80; // SelectHC573(4);
P0 = 0x00;
}