proteus提供1位、2位、4位、6位、8位数码管,在库中搜索7seg即可查找到所有7段数码管。
如下图,名称中7SEG表示7段数码管,MPXx代表数码管位数,CA表示共阳极,CC表示共阴极。
如下图为6位一体数码管,左侧下方abcdef DP为数码管段选端,右边为公共端。
在电路设计时可采用74HC254增加驱动能力,仿真环境下单片机直接驱动也可以点亮。
6位数码管驱动C文件:7segX6.c
#include
#include "seg7x4.h"
#define SEG_NUMS (6) //数码管个数
//数码管段选端端口
#define SEG_PORT P0
//数码管公共端引脚
sbit W1=P2^7;
sbit W2=P2^6;
sbit W3=P2^5;
sbit W4=P2^4;
sbit W5=P2^3;
sbit W6=P2^2;
uint num=9968;
uchar seg_num[SEG_NUMS] = {0}; //0-5共6个数码管显示的数字
uchar seg_num_point = 0; //是否显示小数点 1表示显示
//数码管共阳极字形码
//若需要显示小数点则 &0x7F
//若驱动共阴极数码管则按位取反 ~
unsigned char code SMG_Duanma[10] =
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
void delay(uint t)
{
while(t--);
}
void smgdisplay(uchar n,uchar dat)
{
SEG_PORT=0XFF;
switch(n)
{
case 0: W1=1;W2=0;W3=0;W4=0;W5=0;W6=0; break;
case 1: W1=0;W2=1;W3=0;W4=0;W5=0;W6=0; break;
case 2: W1=0;W2=0;W3=1;W4=0;W5=0;W6=0; break;
case 3: W1=0;W2=0;W3=0;W4=1;W5=0;W6=0; break;
case 4: W1=0;W2=0;W3=0;W4=0;W5=1;W6=0; break;
case 5: W1=0;W2=0;W3=0;W4=0;W5=0;W6=1; break;
}
SEG_PORT=dat;
}
//修改数码管显示数字
//n 第几个数码管
//dat 显示的数值
void smg_set_num(uchar n,uchar dat)
{
if(dat > 9)
return;
seg_num[n] = dat;
}
//修改数码管显示数字
//n 第几个数码管
//t 1 显示小数点 0:不显示小数点
void smg_set_point(uchar n,bit t)
{
if(t)
seg_num_point |= 1<=SEG_NUMS)
i = 0;
}
//使用循环调用此函数刷新显示
void smg_refresh(void)
{
uchar i=0;
for(i = 0;i0)
{
flash_time++;
if(flash_time > 100)
{
smgdisplay(1,SMG_Duanma[(dat%100)/10]);
delay(100);
smgdisplay(2,SMG_Duanma[dat%10]&0x7f);
delay(100);
}
else
{
smgdisplay(1,0xFF);
delay(100);
smgdisplay(2,0xFF);
delay(100);
}
if(flash_time> 200)
{
flash_time = 0;
}
}
else
{
smgdisplay(1,SMG_Duanma[(dat%100)/10]);
delay(100);
smgdisplay(2,SMG_Duanma[dat%10]&0x7f);
delay(100);
}
}
//中间两位显示数字
void smgshujuMid2(uint dat,uchar flash)
{
static uchar flash_time = 0;
if(flash>0)
{
flash_time++;
if(flash_time > 100)
{
smgdisplay(3,SMG_Duanma[(dat%100)/10]);
delay(100);
smgdisplay(4,SMG_Duanma[dat%10]&0x7f);
delay(100);
}
else
{
smgdisplay(3,0xFF);
delay(100);
smgdisplay(4,0xFF);
delay(100);
}
if(flash_time> 200)
{
flash_time = 0;
}
}
else
{
smgdisplay(3,SMG_Duanma[(dat%100)/10]);
delay(100);
smgdisplay(4,SMG_Duanma[dat%10]&0x7f);
delay(100);
}
}
//低两位显示数字
void smgshujuLow2(uint dat,uchar flash)
{
static uchar flash_time = 0;
if(flash>0)
{
flash_time++;
if(flash_time > 100)
{
smgdisplay(5,SMG_Duanma[(dat%100)/10]);
delay(100);
smgdisplay(6,SMG_Duanma[dat%10]&0x7f);
delay(100);
}
else
{
smgdisplay(5,0xFF);
delay(100);
smgdisplay(6,0xFF);
delay(100);
}
if(flash_time> 200)
{
flash_time = 0;
}
}
else
{
smgdisplay(5,SMG_Duanma[(dat%100)/10]);
delay(100);
smgdisplay(6,SMG_Duanma[dat%10]);
delay(100);
}
}
//显示小数点&0x7f
void smgshuju3(float dat)
{
int dat1= dat*10;
if(dat>0)
{
smgdisplay(1,SMG_Duanma[dat1/1000]);
delay(100);
smgdisplay(2,SMG_Duanma[(dat1%1000)/100]);
delay(100);
smgdisplay(3,0x7f&SMG_Duanma[(dat1%100)/10]);
delay(100);
smgdisplay(4,SMG_Duanma[dat1%10]);
delay(100);
}
else
{
dat1 = -dat1;
smgdisplay(1,0xBF); //显示负号
delay(100);
smgdisplay(2,SMG_Duanma[(dat1%1000)/100]);
delay(100);
smgdisplay(3,0x7f&SMG_Duanma[(dat1%100)/10]);
delay(100);
smgdisplay(4,SMG_Duanma[dat1%10]);
delay(100);
}
}
void delay1(uint tt)
{
while(tt--)
{
smgshuju4(num);
}
}
h文件
#ifndef __SEG_H_
#define __SEG_H_
#define uchar unsigned char
#define uint unsigned int
void delay(uint t);
void smgdisplay(uchar n,uchar dat);
void smgdisplay_clear(uchar n);
void smgshuju4(uint dat);
void smgshujuHeig2(uint dat,uchar flash);
void smgshujuMid2(uint dat,uchar flash);
void smgshujuLow2(uint dat,uchar flash);
void smgshuju2(uint dat,uchar flash,uchar comm);
void smgshuju3(float dat);
void delay1(uint tt);
void smg_refresh(void);
void smg_refresh_int(void);
void smg_set_num(uchar n,uchar dat);
void smg_set_point(uchar n,bit t);
#endif
配合定时器代码
void Timer0Init()
{
TMOD|=0x01;//0000 0001,最后2位-工作方式的选择,这里选择16位定时器‘01’
TH0 = (65536-10000)/256; //定时10ms //高八位赋初值
TL0 = (65536-10000)%256; //低八位赋初值
EA=1;//开中断
ET0=1;//定时器0的中断运行
TR0=1;//运行控制位,置1位为工作
}
void Timer0() interrupt 1
{
static unsigned int i=0;
static unsigned int j=0;
TH0=(65535-1000)/256; //给定时器赋初值,定时10ms
TL0=(65535-1000)%256;
i++;
smg_refresh_int();
}