数码管静态显示到动态显示——六位8段数码管(共阴极)按顺序间隔1s显示数字1~6

数码管静态显示到动态显示

2021-01-21,51单片机学习笔记

六位8段数码管(共阴极)按顺序间隔1s显示数字1~6

代码:
/****************************************************
六位8段数码管(共阴极)按顺序间隔1s显示数字1~6
*****************************************************/
#include <reg52.h>
//#include <intrins.h>
/*此程序也可以用其中的 按位移动函数_crol_和_cror_ 实现对 六位数码管 位显 的扫描*/
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;//段显
sbit wela=P2^7;//位显
uchar num,dunum,wenum;
//定义:计数(中断服务响应次数)变量,段显编码下标,位显编码下标

/*共阴极数码管段显真值表:0,1234,5678,9AbC,dEF.无*/
uchar code table_du[]={0x3f, //0
0x06,0x5b,0x4f,0x66,     //1234
0x6d,0x7d,0x07,0x7f,     //5678
0x6f,0x77,0x7c,0x39,     //9AbC
0x5e,0x79,0x71,0x80,	 //dEF.
0x00};    				 //无
/*六位共阴极数码位显真值表:(因为是六位数码管,最高两位用不到,索性都设为高电平)
1111 1110,1111 1101,1111 1011,1111 0111,1110 1111,1101 1111*/
uchar code table_we[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void display();//声明 显示函数
void main()
{
	EA=1;
	ET0=1;//打开中断
	TMOD=0X01;//选定中断模式
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;//初始化装填
	TR0=1;//启动计时器

	while(1)
	{
		/***********************************************************************************
		如果间隔时间足够短,如将50000改为500,将20改为2,此时,间隔时间为500us*2=1ms。
		由于扫描速度足够快,在人的眼睛看来,六位数码管就可以同时点亮,而稳定地显示出“123456”
		这也就是数码管的动态显示。随着扫描速度的加快,静态显示逐渐过渡到动态显示。
		************************************************************************************/
		if(num==20)//经历1s(=20*50ms)
		{
			num=0;//初始化计数变量
			
			if(dunum==6)//溢出回零,确保送入下标依次是下标为0~5的编码
				{
					dunum=0;
				}
			if(wenum==6)//溢出回零
				{
					wenum=0;
				}
				
			display();//显示函数,点亮相应位的数码管
			dunum++;//段显编码下标自增
			wenum++;//位显编码下标自增
		}
	}
}
//中断服务程序
void time0() interrupt 1 
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;//初始化装填	
	num++;//计数变量自增,num每增加1,耗时50ms(=50000*1us)
}
//显示函数
void display()
{
	P0=0xff;//1111 1111 清除位显(共阴极数码管位显为低电平时才会点亮)
	wela=1;//位显通过
	wela=0;//位显保持
	
	P0=table_du[dunum+1];//送入段显编码,数字123456的下标是1~6,故而 加1
	dula=1;//段显通过
	dula=0;//段显保持
	/*若要显示字母AbCdEF,字母AbCdEF下标是10~15,只要改为 加10 即可*/
	
	P0=table_we[wenum];//送入位显
	wela=1;//位显通过
	wela=0;//位显保持
}

写在最后:
本文仅为个人学习笔记,纰漏之处,欢迎斧正!

在使用Keil软件(如MDK-ARM)编写程序实现DS2数码管显示动态倒计时时,我们需要通过定时器控制每两秒钟更新一次显示内容。这里是一个简化的步骤: 1. **配置硬件**: - 确保连接好DS2数码管到微控制器的IO口,并了解其驱动电路(阳极或阴极)。 - 配置定时器用于定时任务。 2. **头文件包含**: ```c #include "ds1307.h" // 如果使用DS1307实时时钟模块作为时间源 #include <stdint.h> #include <stdbool.h> #include <stdio.h> ``` 3. **定义全局变量**: - 数码管的初始化数据结构、当前数值(初始值设为F,即15)和定时器的标志等。 4. **主函数启动**: ```c int main(void) { // 初始化数码管和定时器 init_DS2(); // 自定义初始化函数 start_Timer(2000); // 设置定时器周期为2000ms (2s) while(1) { update_LCD(currentValue); // 更新显示 if (timer_flag) { // 判断定时器是否到期 currentValue--; // 减一 if (currentValue == 0) { currentValue = 9; // 当倒计至0,回滚到最大值防止溢出 } timer_flag = false; // 清除标志 } } } ``` 5. **辅助函数**: - `init_DS2()`:初始化数码管,设置对应字符映射表。 - `start_Timer(period)`:设置定时器并开启中断处理。 - `update_LCD(value)`:将value转换为对应的DS2字符并发送给数码管。 - `set_Timer_flag()`:在定时器中断服务函数中设置`timer_flag`标志6. **定时器中断服务**: ```c void Timer_IRQHandler() { set_Timer_flag(); } ``` 记得根据实际硬件和平台调整代码细节,并在完成后测试各个阶的工作。这就是一个基本的倒计时示例,实际项目中可能还需要考虑错误处理和数码管编码的优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值