数码管静态显示到动态显示——六位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;//位显保持
}

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

猜你喜欢

转载自blog.csdn.net/qq_46541463/article/details/112968128