数码管动态刷新显示的代码来了,仅供参考
很多同学一直私信我,问能否分享单片机视频课程的代码,当然是可以分享的啊。天下代码一大抄,其实这些代码网上基本上都是可以找到的,关键是要学会使用,知其然也要知其所以然。其实最好的学习的方法,应该是自己手动的撸代码,就如10000小时定律一样,要遵循10000条代码定律。撸代码的主要目的,我认为一个是熟悉C语言的语法,一个是理解软件控制硬件的原理,只有手感和逻辑能力得到了一定的训练,才能够为开发时的业务逻辑处理代码的编写提供基础。由于是对初学者的教学,代码并没有太多的优化,代码规范也不够,大家感兴趣的全做参考吧。以下代码对应的视频为:数码管动态显示之switch case语句实现动态刷新及多参数分时显示,https://www.ixigua.com/6827090528962609677。
/************ main.c **********************/ #include <reg51.h> #include 'delay.h' #include 'display.h' unsigned char wnd; unsigned char parm1 = 44; unsigned char parm2 = 55; unsigned char parm3 = 66; unsigned char parm4 = 77; void dis_Service(); void main() { unsigned int i; for(i = 0;i<5000;i++) { Display(); } while(1) { dis_Service(); } } void dis_Service() { unsigned int i; switch(wnd) { case 0: LEDBuf[0] = 0; LEDBuf[1] = 22; LEDBuf[2] = parm1/10; LEDBuf[3] = parm1%10; for(i = 0;i<5000;i++) { Display(); } wnd++; break; case 1: LEDBuf[0] = 1; LEDBuf[1] = 22; LEDBuf[2] = parm2/10; LEDBuf[3] = parm2%10; for(i = 0;i<5000;i++) { Display(); } wnd++; break; case 2: LEDBuf[0] = 2; LEDBuf[1] = 22; LEDBuf[2] = parm3/10; LEDBuf[3] = parm3%10; for(i = 0;i<5000;i++) { Display(); } wnd++; break; case 3: LEDBuf[0] = 3; LEDBuf[1] = 22; LEDBuf[2] = parm4/10; LEDBuf[3] = parm4%10; for(i = 0;i<5000;i++) { Display(); } wnd = 0; break; default:break; } }
//display.c
#include 'display.h'
unsigned char code leddata[]={ //数码管的段码表
0x3F, //'0'
0x06, //'1'
0x5B, //'2'
0x4F, //'3'
0x66, //'4'
0x6D, //'5'
0x7D, //'6'
0x07, //'7'
0x7F, //'8'
0x6F, //'9'
0x77, //'A'
0x7C, //'B'
0x39, //'C'
0x5E, //'D'
0x79, //'E'
0x71, //'F'
0x76, //'H'
0x38, //'L'
0x37, //'n'
0x3E, //'u'
0x73, //'P'
0x5C, //'o'
0x40, //'-'
0x00, //熄灭
};
unsigned char LEDBuf[] = {8,8,8,8};//数据显示缓冲区
unsigned char code PLACE_CODE[] = {0xfe,0xfd,0xfb,0xf7};//位选信号
void Display()
{
//static unsigned char i = 0;
unsigned char i;
//1、送段码
//2、送位选
//3、延时 1ms <10ms
//4、消隐
switch(i)
{
case 0:
GPIO_DIG = leddata[LEDBuf[0]];//送段码
GPIO_PLACE = PLACE_CODE[0];//送位选
DelayXms(1);//延时(实际开发时,可以通过定时刷新,取消此处的延时)
GPIO_DIG = 0x00;//消隐
i++;//切换下一个
break;
case 1:
GPIO_DIG = leddata[LEDBuf[1]];
GPIO_PLACE = PLACE_CODE[1];
DelayXms(1);
GPIO_DIG = 0x00;
i++;
break;
case 2:
GPIO_DIG = leddata[LEDBuf[2]];
GPIO_PLACE = PLACE_CODE[2];
DelayXms(1);
GPIO_DIG = 0x00;
i++;
break;
case 3:
GPIO_DIG = leddata[LEDBuf[3]];
GPIO_PLACE = PLACE_CODE[3];
DelayXms(1);
GPIO_DIG = 0x00;
i = 0;
break;
default:break;
}
}
//display.h #ifndef __DISPLAY_H__ #define __DISPLAY_H__ #include <reg51.h> #include 'delay.h' //IO的声明 #define GPIO_DIG P0 //段码 IO #define GPIO_PLACE P2 //位选 IO #define N 4 //数码管个数 unsigned char code leddata[]; extern unsigned char LEDBuf[]; void Display(); #endif
//delay.c
#include 'delay.h'
/************************************
函数名:DelayXms
功 能:毫秒级延时函数
参 数:unsigned int (1 - 65535)
返回值:无
**************************************/
void DelayXms(unsigned int xms)
{
unsigned int i,j;
for(i = xms;i>0;i--)
for(j = 124;j>0;j--);
}
//delay.h #ifndef __DELAY_H__ #define __DELAY_H__ void DelayXms(unsigned int xms); #endif
程序执行后对应的显示效果如下:
上电初始显示:

初始显示
下面的为4个参数的分时显示:

参数0显示

参数1显示

参数2显示

参数3显示
代码仅供参考。
赞 (0)