一.知识点补充
1.P2^5,P2^6,P2^7分别对应38译码器的A,B,C(低,中,高),通过给三个引脚 (P2^5,P2^6,P2^7)赋值输入,由译码器二进制转换输出Y0~Y7,从而达到切换蓝桥杯板子不同模块的功能。
tips:蓝桥杯板子和江科大的不大一样,如果纯按视频所敲代码,实际效果是不同的。
比如:P2=0X80//A=P2^5=0,B=P2^6=0,C=P2^7=1,38译码器输出Y4,就对应图1的led模块 P2=0Xe0//A=P2^5=1,B=P2^6=1,C=P2^7=1,38译码器输出Y7,就对应图1的数码管模块,那么就是控制数码管段选(a,b,c,d,e,f,,g,dp) P2=0Xc0//A=P2^5=0,B=P2^6=1,C=P2^7=1,38译码器输出Y6,就对应图1的点阵屏模块,那么就是控制数码管位选(comx)
38译码器相关知识点,跳转至【蓝桥杯单片机02】LED的基本控制 - - 21ic电子技术开发论坛 (后期再写一篇译码器图解)
2.段选和位选相关知识点,跳转至http://t.csdnimg.cn/6JpWt或http://t.csdnimg.cn/aIab0
详细原理找B站【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?p=11&vd_source=e0a0e92e7fbcb4d0ff760d75fb57a403
3.共阳数码管码表
u8 dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//共阳数码管码表
// dat[]={0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,A ,B ,C ,D ,E ,F ,- ,. }
二.任务
1.在数码管不同位置显示数字
#include <REGX52.H>
typedef unsigned char u8;
u8 dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//共阳数码管码表
// dat[]={0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,A ,B ,C ,D ,E ,F ,- ,. }
void Delayxms(int c) //@12.000MHz延时函数
{
unsigned char data i, j;
while(c)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
c--;
}
}
void pos(int a,b,c,d)//第一个为38译码器,第二个为位选,第三个为38译码器,第四个为段选
{
switch(a)
{
case 6:
P2_7=1; P2_6=1; P2_5=0;break;
case 7:
P2_7=1; P2_6=1; P2_5=1;break;
}
switch(b)
{
case 1: P0=0X01;break;//0000 0001
case 2: P0=0X02;break;//0000 0010
case 3: P0=0X04;break;//0000 0100
case 4: P0=0X08;break;//0000 1000
case 5: P0=0X10;break;//0001 0000
case 6: P0=0X20;break;//0010 0000
case 7: P0=0X40;break;//0100 0000
case 8: P0=0X80;break;//1000 0000
case 9: P0=0Xff;break;//1111 1111
}//从1到8,数码管是从左到右显示
//决定位选,由于是共阳极数码管
switch(c)
{
case 6:
P2_7=1; P2_6=1; P2_5=0;break;
case 7:
P2_7=1; P2_6=1; P2_5=1;break;
}
P0=dat[d];
}
void main()
{
int i,j;
while(1)
{
for(i=1;i<=8;i++)//8个数码管单独显示0~9
{
for(j=0;j<=9;j++)
{
pos(6,i,7,j);
Delayxms(1000);
}
}
for(j=0;j<=17;j++)//8个数码管一起显示0~F
{
pos(6,9,7,j);
Delayxms(1000);
}
}
}