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

简介

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

  • 33
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
适用于大学生数电课程设计 实现功能: 设计一个多路竞赛抢答器,可同时供八名选手参加比赛,并具有定时抢答功能。 设计制作要求如下: 1、设计一个智力竞赛抢答器,可同时供八名选手或八个代表队参加比赛,他们的选号分别是1、2、3、4、5、6、7、8,各用一个抢答按钮,按钮的编号与选手的编号相对应,分别是S1、S2、S3、S4、S5、S6、S7、S8。 2、给节目主持人设置一个控制开关,用来控制系统的清零(编号显示码管灭灯)和抢答器的开始。 3、抢答器具有数据锁存和显示的功能。抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示出选手的编号,同时扬声器给出音响提示。此外,要封锁输入电路,禁止其他选手抢答。优先抢答选手的编号一直保持到主持人将系统清零为止。 扩展功能: 1、抢答器具有定时抢答的功能,且一次抢答的时间可以由主持人设定(如 30s)。当节目主持人按“开始”键后,要求定时器立即减计时,并用显示器显示。 2、参加选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号,并保持到主持人将系统清零为止。如果定时抢答的时间已到,却没有选手抢答,则本次抢答无效,并封锁输人电路,禁止选手超时后抢答,时间显示器上显示00,并发出报警声。 说明如下: (1)压缩包里有proteus7.8的仿真文件及其安装包和安装教程,还有课设报告可以参考。用proteus7.8打开fangzhen文件夹里的fz.DSN文件即可进入设计和调试。 (2)详细的设计原理图 (3)附赠有用的参考资料和答辩ppt,以及华科的数字电子技术基础的课件ppt,仅供学习之用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值