分享

数码管动态刷新显示的代码来了,仅供参考

 启云_9137 2021-07-23

很多同学一直私信我,问能否分享单片机视频课程的代码,当然是可以分享的啊。天下代码一大抄,其实这些代码网上基本上都是可以找到的,关键是要学会使用,知其然也要知其所以然。其实最好的学习的方法,应该是自己手动的撸代码,就如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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多