最简单的数码管动态扫描子程序,谁还能比这个短?
最简单的数码管动态扫描子程序,只需要将要显示的内容放到一个数组内,然后传数组地址给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