简介
proteus提供1位、2位、4位、6位、8位数码管,在库中搜索7seg即可查找到所有7段数码管。
如下图,名称中7SEG表示7段数码管,MPXx代表数码管位数,CA表示共阳极,CC表示共阴极。
如下图为6位一体数码管,左侧下方abcdef DP为数码管段选端,右边为公共端。
在电路设计时可采用74HC254增加驱动能力,仿真环境下单片机直接驱动也可以点亮。
驱动代码
6位数码管驱动C文件:7segX6.c
#include <reg52.h>
#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<<n;
else
seg_num_point &= ~(1<<n);
}
//1-10ms定时器中断函数调用此函数刷新显示
void smg_refresh_int(void)
{
static uchar i=0;
if(seg_num_point&(1<<i))
smgdisplay(i,SMG_Duanma[seg_num[i]]&0x7F);
else
smgdisplay(i,SMG_Duanma[seg_num[i]]);
i++;
if(i>=SEG_NUMS)
i = 0;
}
//使用循环调用此函数刷新显示
void smg_refresh(void)
{
uchar i=0;
for(i = 0;i<SEG_NUMS; i++)
smgdisplay(i,SMG_Duanma[seg_num[i]]);
}
void smgshuju4(uint dat)
{
smgdisplay(1,SMG_Duanma[dat/1000]);
delay(200);
smgdisplay(2,SMG_Duanma[(dat%1000)/100]);
delay(200);
smgdisplay(3,SMG_Duanma[(dat%100)/10]);
delay(200);
smgdisplay(4,SMG_Duanma[dat%10]);
delay(200);
}
//高两位显示数字
//dat 显示的数值
//flash 是否闪烁
void smgshujuHeig2(uint dat,uchar flash)
{
static uchar flash_time = 0;
if(flash>0)
{
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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34556.html