proteus设计教程-数码管使用方法

简介

        proteus提供1位、2位、4位、6位、8位数码管,在库中搜索7seg即可查找到所有7段数码管。

如下图,名称中7SEG表示7段数码管,MPXx代表数码管位数,CA表示共阳极,CC表示共阴极。

proteus设计教程-数码管使用方法_第1张图片

如下图为6位一体数码管,左侧下方abcdef DP为数码管段选端,右边为公共端。proteus设计教程-数码管使用方法_第2张图片

在电路设计时可采用74HC254增加驱动能力,仿真环境下单片机直接驱动也可以点亮。 proteus设计教程-数码管使用方法_第3张图片

驱动代码

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();
}

你可能感兴趣的:(proteus仿真,proteus)