一,设计目标:
通过此次学习初步认识到.蓝桥杯单片机74HC138译码怎么选择以及使用,以及后续的M74HC573M1R锁存器P0口的配置,更让同学们真正地理解到蓝桥杯大赛单片机的实现过程,是十分重要的基础。
二,设计思路:
首先对于初学者便于理解,你可以将蓝桥杯大赛单片机理解为一个电视机,每个频道可以看不同内容(对应其展现的功能),当然光换台可不行,还要每个台需要有电视剧(各数据采集模块)去放映,或者一个电视剧在不同频道(如数码管展示或LED灯展示)放映的效果不同,而为了更好的实现功能还需要我们不断地去换台和调节目等操作,可能中间大多会考虑时序问题那咱不多说了。
切入正题,这里说明一下74HC138译码器吧,如上图,学过数字逻辑的同学应该知道74HC138属于一种典型的38译码器,通俗来说就是通过三位二进制数来选择8个频道(000,001,010,011,100,101,110,111),由下图可知这三位数是P2八位二进制数的高三位,所以在实现模块功能之前我们只需要对其设置相应的频道。如:频道4负责LED灯也就是 P2 = 100* **** (其他位*不变以免修改出错),频道5负责蜂鸣器以及继电器也就是 P2 = 101* ****;
选择对应的频道后,我们则需根据其实现的功能来对其M74HC573M1R锁存器的P0进行设置,如这里的LED灯则是由M74HC573M1R锁存器的P0八位二进制数(P00~P07)进行配置的;
三,代码实现:
接上言, 关于怎么使用代码来选择自己想要的频道呢,这里通常有两种功能主要是:自己写函数来设置和使用存储器映射来设置,这两种方法略有些不同之处,作者这里先讲自己写传参函数来设置吧。
void initHC138(unsigned char n)
{
switch(n)
{
case 0:
P2=(P2 & 0x1f)|0x00;break;//0000 0000 频道0 空
case 4:
P2=(P2 & 0x1f)|0x80;break;//1000 0000 频道4 LED灯
case 5:
P2=(P2 & 0x1f)|0xa0;break;//1010 0000 频道5 蜂鸣器以及继电器
case 6:
P2=(P2 & 0x1f)|0xc0;break;//1100 0000 频道6 数码管位码
case 7:
P2=(P2 & 0x1f)|0xe0;break;//1110 0000 频道7 数码管段码
}
}
而且对初学者来说这种方法便于理解,不过后续我会出单独讲存储器映射来设置P2口的教程。对于代码的具体实现则是通过一定的离散数字基础来实现的,同学们可以自己动笔试试如何实现在设置高三位二进制数的同时保证其余位数不变( P2=(P2 & 0x1f)|0x00; );对于频道设置好后,我们还可以根据具体实现功能来对P0口进行直接设置。如 P0 = 0xff;也可以函数用同时对P2和P0进行设置。
void initHC138(unsigned char n)
{
switch(n)
{
case 0:
P2=(P2 & 0x1f)|0x00;break;
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;
}
}
void output(unsigned char channel,unsigned char dat) //对P2 和 P0 设置
{
initHC138(channel);
P0=dat;
}
有的初学者可能看到这会觉得光是代码段跑不出来一点用没有,理解不深。作者看来很正常不过,需要您在完整的代码中去理解效果最好,你可以先了解一下,然后在接下来的系列教程中你会恍然大悟的。而我单独拿出来讲,是为接下来的系列教程做铺垫。
三,注意事项:
需要注意上述使用函数来设置P2 和使用存储器映射的接线不同。使用函数来设置P2需要如下图来进行接线(J3 IO口短接)。