前言
蓝桥杯单片机基础部分——1、基础模块代码这里是之前的数码管显示,但是会出现一些情况,就比如数码管闪烁跳动,只显示最后一位,这里稍微改良了一些地方,但是底层的逻辑还是一样的。
之前的代码是
void display(unsigned char count,num)//数码管显示无小数点,count为数码管位选,num为数码管显示内容
{
HC138(6);
P0 = 0X01<<count;
HC138(7);
P0 = SMG_duanma[num];
delay(845);
}
这样的是把所有的数码管封装成了一个函数,调用的时候需要不断的根据每一位调用函数,运行效率和码代码的效率都比较低,下面是改良的代码
unsigned char yi,er,san,si,wu,liu,qi,ba;//定义变量表示对应数码管的位置
unsigned char code SMG_duanma[18]=//比赛时会提供,数组需要自己定义
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xff,0xff};
void delay(unsigned int t)//延时(也可以用STC ISP生成)
{
while(t--);
}
void HC138(unsigned int n)//138译码器
{
switch(n)
{
case 4: P2 = (P2 & 0X1F) | 0X80;break;//LED灯
case 5: P2 = (P2 & 0X1F) | 0XA0;break;//继电器
case 6: P2 = (P2 & 0X1F) | 0XC0;break;//数码管位选
case 7: P2 = (P2 & 0X1F) | 0XE0;break;//数码管显示
}
}
void display1(unsigned char yi,er)//这个地方的yi和er既是对应数码管的位置,也是数码管要显示的内容
{
HC138(6);
P0 = 0X01;
HC138(7);
P0 = SMG_duanma[yi];
delay(845);
HC138(6);
P0 = 0X02;
HC138(7);
P0 = SMG_duanma[er];
delay(845);
}
void display2(unsigned char san,si)
{
HC138(6);
P0 = 0X04;
HC138(7);
P0 = SMG_duanma[san];
delay(845);
HC138(6);
P0 = 0X08;
HC138(7);
P0 = SMG_duanma[si];
delay(845);
}
void display3(unsigned char wu,liu)
{
HC138(6);
P0 = 0X10;
HC138(7);
P0 = SMG_duanma[wu];
delay(845);
HC138(6);
P0 = 0X20;
HC138(7);
P0 = SMG_duanma[liu];
delay(845);
}
void display4(unsigned char qi,ba)
{
HC138(6);
P0 = 0X40;
HC138(7);
P0 = SMG_duanma[qi];
delay(845);
HC138(6);
P0 = 0X80;
HC138(7);
P0 = SMG_duanma[ba];
delay(845);
}
void main()
{
while(1)
{
display1(yi,er);//这部分的代码只需要在主函数里面调用一次就可以,赋值的话对yi到ba这八个变量进行赋值然后在上面调用即可
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
这个代码也有一点小bug,就是在切换页面的时候只有最后一位显示,但是不影响效果
本人水平有限,所有代码都是作者自己的风格书写,但是大致的应该是没有什么问题,如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论