数码管静态显示到动态显示
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;//位显保持
}
写在最后:
本文仅为个人学习笔记,纰漏之处,欢迎斧正!