标题一:通过SM74HC138译码器打开控制8个LED灯的寄存器
标题二:编程思路
标题三:总结
打开LED寄存器:
由开发板的原理图可知其8个LED灯的寄存器开关为SM74HC138译码器(以下用38译码器称代)的Y4口,该38译码器的输入端P25~P27,其分别对应P25->SM74HC138_A、P26->SM74HC138_B、P27->SM74HC138_C,CBA构成三位的二进制来选择Y0~Y7口。
例如:P25=0 P26=0 P27=1 对应100 为十进制数字4 也就是打开Y4口
那么我们不禁冒出一个问题:我们为什么要打开其寄存器才可以对LED进行操作而不能直接进行呢? 那是因为开发板的引脚数量有限、同一时间只能进行一个操作等原因导致许多功能的引脚重叠,所以才需要译码器来选择功能
编程思路:
介绍完毕接下来就是如何对P25~P27操作进行说明:对P2口集体进行操作,P2口有P20~P27,P2默认为1111 1111 前三位为38译码器输入位第一位为P27依次递减 ,那么可知想要打开Y4为1001 1111 那么对P2操作为:P2=((P2&0x1f)|0x80)), 初始化:P2&0x1f -> 0001 1111,这步很重要, 然后操作的模板或(|)上一个0x?0得到想要的Y口 ,在P2=((P2&0x1f)|0x80))操作完Y4口就已经打开, 接下来就是对P0口的操作, 按照你想要的LED闪烁模式进行编程,在结束对LED的编程后记得把P2口初始化养成好习惯。
一下是我的代码
#include "STC15F2K60S2.H"
#include "intrins.h"
//关闭蜂鸣器
void cls_buzz(void)
{
P2 = (P2 & 0x1F | 0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void mian()
{
cls_buzz();
while(1)
{
P2=((P2&0x1f)|0x80); //打开LED寄存器
P0=0xdf; //对LED P0口操作
P2&=0x1f; //关闭LED寄存器
Delay1000ms();
P2=((P2&0x1f)|0x80);
P0=0xff;
P2&=0x1f;
Delay1000ms();
}
}
总结:想要实现的功能->一定的思路->看开发板原理图->编程纠错,为大致的思路,遇到不懂的多上网查,当期知识要实际运用起来 。
本人小白知识面不广有错之处望网友指出。
标签:P2,LED,Day1,蓝桥,P27,寄存器,0x1f,译码器 From: https://blog.csdn.net/2302_80724534/article/details/140247385