二位数码管动态显示

发布网友 发布时间:2022-04-22 00:49

我来回答

2个回答

热心网友 时间:2022-07-08 03:57

#include <REGX52.H>

 

const unsigned char DisCode[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管各显示数据    0~F对应的数码管显示

const unsigned char Dis_bit[8]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f}; //数码管各显示位   对8个数码管的控制

unsigned char Dis_buf[2]={0};  //显示字符缓冲区

unsigned char bit_point=0; //当前显示位指针

unsigned  int count; 

char Num=99;

/*******************************************

* 函数名:Led_Print

* 功能: 数码管显示值储存到数码管显存buff中

* 参数: 显示数值 

* 还回值: 无

*********************************************/

void Led_Print(long disdata)  //确定显示内容的函数

{

 Dis_buf[0] = DisCode[disdata/10];

 Dis_buf[1] = DisCode[disdata%10];

    

}

/*******************************************

* 函数名:Led_Scan()

* 功能: 数码管扫描

* 参数: 无

* 返回值: 无

*********************************************/

void Led_Scan()//显示函数

{

P0=0x00;

P0=Dis_buf[bit_point];//显示缓冲区中的字符

P1=Dis_bit[bit_point]; //设置当前显示位

bit_point++;  //准备下一显示字符

if(bit_point==2)  //如果显示位大于8,则将显示位指针置0;

{

bit_point=0;

}

}

/*********************************************************

名称:device_init(void)

功能:初始化端口、状态寄存器

参数:无

***********************************************************/

void device_init(void)

{

TMOD=0x02; //设置定时器0的工作方式为1

TH0=0x47; //设置定时器0初始值 ,22.1184M  定时0.1ms

TL0=0x47; 

TR0 = 1;

IE=0x82; //打开全局中断和定时器0溢出中断

}

/******************************************************

名称:timer0_over

功能:定时器/计数器0溢出中断服务程序

参数:无

*******************************************************/

void timer0_over(void) interrupt 1

{

count++; //计数一次

if(count==10000)//10000*0.1ms=1s

{

count = 0;

Num--;

if(Num < 0) Num=99;

Led_Print(Num); 

}

Led_Scan();

}

void main()

{

device_init();

Led_Print(Num);

while(1)

{}

}

热心网友 时间:2022-07-08 03:57

两个扫描轮换显示,转换周期尽量小一点,看实际效果调整型扫描周期

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com