注:备赛蓝桥杯期间,为了加深自己的理解,写下这篇文章。
1、led的亮灭控制
//关闭led灯
P0 = 0xff;//给灯赋值,让他全关闭 1是灭)(因为led右边接的是Vcc即1,左边给他为1就会熄灭)
P2 = P2 & 0x1f | 0x80;//1、后五位不变,前三位置0 2、将前三位变成100,即打开led相关的锁存器Y4
P2 &= 0x1f;//前三位置0,关闭锁存器
可以看出P0引脚并不能直接控制Led的亮灭,P0与Y4共同作用控制Led的亮灭,在原理图中找到Y4C,它受到Y4和WR控制,wr为0,所以影响Wr值的只有Y4,所以我们接着研究Y4
Y4受到138译码器的控制,打开Y4就要把Y4置1,P2 = P2 & 0x1f | 0x80;//1、后五位不变,前三位置0 2、将前三位变成100,即打开led相关的锁存器Y4,然后一顺看过去P2--Y4--Y4C
最终效果是P2控制锁存器Y4的开关,锁存器像是一道拦着数据的门,有数据要到他想去的位置,就打开锁存器,通过后立马关上(图中含有与、或、非门,自行理清逻辑即可。)
2、蜂鸣器的关闭
数据输入还是P0输入,但同样的Y5c控制着锁存器,决定着数据是否能通过,找到原理图上的Y5c,发现被Y5控制着,再通过P2引脚将Y5置1,代码如下
//关闭蜂鸣器
P0=0x00;//给蜂鸣器赋值,让他关闭 0位灭
P2 = P2 & 0x1f | 0xa0;
P2 &= 0x1f;//前三位置0,关闭锁存器
3、按键的控制
按键相对简单,对着原理图看,能看出哪个引脚控制行,哪个控制列
unsigned char Key_Read()
{
unsigned char temp=0;
P44=0;P42=1;P35=1;P34=1;
if(P33==0)temp=4;
if(P32==0)temp=5;
if(P31==0)temp=6;
if(P30==0)temp=7;
P44=0;P42=1;P35=1;P34=1;
if(P33==0)temp=8;
if(P32==0)temp=9;
if(P31==0)temp=10;
if(P30==0)temp=11;
P44=0;P42=1;P35=1;P34=1;
if(P33==0)temp=12;
if(P32==0)temp=13;
if(P31==0)temp=14;
if(P30==0)temp=15;
P44=0;P42=1;P35=1;P34=1;
if(P33==0)temp=16;
if(P32==0)temp=17;
if(P31==0)temp=18;
if(P30==0)temp=19;
return temp;
}