微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 最简单的数码管动态扫描子程序,谁还能比这个短?

最简单的数码管动态扫描子程序,谁还能比这个短?

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

最简单的数码管动态扫描子程序,只需要将要显示的内容放到一个数组内,然后传数组地址给display函数即可
#include<reg52.h>
#include "display.h"
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code ktime[]={99,100};  //显示频率控制此时频率约为80hz,根据主程序运行时间长短适当修正可使亮度一致
unsigned char code shuwei[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF}; //显示数码管位置,右到左1-6
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x79,0x49};
                            //0-9                                             不显示 -  E    三
void delay(unsigned char i)        //延时程序
{
    unsigned char b;
    for(b=110;b>0;b--)
        for(;i>0;i--);
}
/*数码管显示*/
void display(unsigned char *p)
{
    unsigned char i;
    for(i=0;i<6;i++){
        P0=0x00;
        dula=1;
        dula=0;    //消隐
   
        P0=shuwei;
        wela=1;
        wela=0;    //位选
        P0=table[*p];  
        dula=1;
        dula=0;   //段选
        if(i<5)delay(ktime[1]);
        else delay(ktime[0]);     //延时+主程序运行时间约等于delay(ktime【1】); 使亮度一致
        p++;
    }
}

路过,看看,看看

建议小编不必在中断扫描时完成所有数码管扫描,这样会造成数码管点亮时间间隙不一。
此外,为了程序兼容性更强,将扫描线及送数据程序单独出来,方便修改。
/*4位数码管动态扫描,数码管可任意更改*/
unsigned char DIS_ROME[4]={0xc0,0xf9,0xa4,0xb0};//显示缓存区(4)
unsigned char DISP=0;//缓存区指针
unsigned char SCANF=0xf7;//扫描指针
void LED_SCAN(uchar dat)//低位点亮,仅低4位有效,最低位为LED4
{
  P2=P2&dat;//对于非按顺序接线的在此修改即可
}
void LED_DATA(uchar dat)//低位为A,阴码
{
  P1=dat;//对于非按顺序接线的在此修改即可
}
void Ddis() interrupt 3         //LED扫描
{
  LED_SCAN(SCANF);//扫描端口
  LED_DATA(DIS_ROME[DISP]);//数据端口送数据
  DISP++;//缓存指针加1
  SCANF=_cror_(SCANF,1);//扫描切换
  if(DISP==4)//缓存指针到尾
  {
   DISP=0;//计数归零
   SCANF=0xf7;//扫完四个数码管,扫描复位
  }
   TH1=0xf0;
   TL1=0x00;
}

在程序总体负担不重的情况下,显示函数放主函数里舒服些,不用管太多,让其他函数运行时间加上显示最后一位延时差不错等于 另外3个数码管延时,这样亮度很容易保证一致,
在mcu任务量较大时 最好采用静态显示方法,用74hc595驱动显示,只需在数据有更新的时候更新下就好了,这个时候可以放到中断里,
我的理解是这样,欢迎大侠指正

23333333233333332333333233333

6666666666666666666666666666666666666666666666666666666666666

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

网站地图

Top