微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于单片机数码管动态显示的简单写法

关于单片机数码管动态显示的简单写法

时间:10-02 整理:3721RD 点击:

昨晚刚刚看到郭天祥老师的《新概念51单片机入门》入门一书,刚刚看到数码管动态显示这一部分,嫌郭老师的代码太长,我又是一个懒猪,所以产生了改造代码的想法。过程如下(注,以下所有代码,在STC89C52上通过,系统环境win8,编译软件keil UV4)
先贴出郭天祥老师的源代码
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code lizheao[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
void delayms(uint);
void aoge(void);
uint f(uint);
void main()
{
while(1)
{
dula=1;
  P0=table[1];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfe;
  wela=0;
  delayms(500);
dula=1;
  P0=table[2];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfd;
  wela=0;
  delayms(500);
dula=1;
  P0=table[3];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfb;
  wela=0;
  delayms(500);
dula=1;
  P0=table[4];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xf7;
  wela=0;
  delayms(500);
dula=1;
  P0=table[5];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xef;
  wela=0;
  delayms(500);
dula=1;
  P0=table[6];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xdf;
  wela=0;
  delayms(500);
dula=1;
  P0=table[7];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xbf;
  wela=0;
  delayms(500);
dula=1;
  P0=table[8];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x7f;
  wela=0;
  delayms(500);
}  
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
void aoge(void)
{
P1=aa;
aa=_crol_(aa,1);
}
怎么样很长是吧,现在小菜我来改造一下,先上代码
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
void aoge(void);
unsigned char aa=0xfe;
uint f(uint);
void main()
{
uint a,b;
b=0;
a=0xfe;
while(1)
{
  dula=1;
  P0=table[++b>=8?f(b):b];
  dula=0;
  P0=0xff;
  wela=1;
  P0=a;
  a=_crol_(a,1);
  wela=0;
  aoge();
  delayms(500);
}
  
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
void aoge(void)
{
P1=aa;
aa=_crol_(aa,1);
}
uint f(uint c)
{
if(c>8)
c=f(c-8);
return c;
}
是不是要短了很多,当时小菜在想第一怎么控制他的位选时,第一想到的是_crol_函数,循环左移,因为小菜用的数码管是共阴数码管,所以这样得到的效果就是从左至右数码管依次点亮,可是怎么控制数码管选择的数字,也就是段选呢? ,这里最大的一个问题就是,数组超标,更何况我们只希望显示1到八这几个数字怎么办呢?,我们在学C语言的时候,有两个东西可以起到非常重要的作用条件判断式?=:还有就是函数的递归,代码单独出来,
P0=table[++b>=8?f(b):b];
uint f(uint c)
{
if(c>8)
c=f(c-8);
return c;
}
这样是不是就是很清楚了呢?,所以我们的C语言基础是非常重要的啊,好了就写到这里,菜鸟心德,大大勿拍



学习了

如果你看了金山工作室的视频讲解、你会知道这个可以更简单,看过郭天祥的看过李想的视频教程,代码还是冗长

我们写数码管的基本思路是一个定时器订5ms扫描数码管!限制主函数执行5ms 因为每个数码管扫描时间不一样的话会亮暗不一样的!

恩恩,刚刚才开始搞单片机,又想偷下懒,所以自己琢磨的改进方法,以后还会继续研究怎么将这段代码更简洁

打错字了,不是金山,是金沙滩工作室,呵呵,我也是闲暇学习学习,正在看视频模仿的阶段~

都是學習!来自: Android客户端

有创意有思想,谢谢分享,只有不断的学习才会变得强大

为什么我感觉好麻烦 我数码管都是直接拉低P口 最多也就加一个138译码器 看那代码我真想死

有一个问题是,你用循环位移来控制位选,那你想改动某一位数码管显示的数的时候要怎么办呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top