手动显示
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
//共阴数码管段选表0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*====================================
描述 :两位共阴数码管动态显示
====================================*/
void display(uchar num1, uchar num2)
{
/*第一位显示*/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFE; //1111 1110
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[num1];//
DU = 0;//锁存段选数据
delay(1);
/*第二位显示*/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFD; //1111 1101
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[num2];//
DU = 0;//锁存段选数据
delay(1);
}
void main()//main函数自身会循环
{
while(1)
{
display(0, 0); //数码管显示函数
}
}
说明:
由于传参的缘故,显示 00——10 共 11 个数字只需要调用
自定义的函数void display(uchar num1, uchar num2)
依次传入:
display(0 ,1);
display(0 ,2);
display(0 ,3);
display(0 ,4);
display(0 ,5);
display(0 ,6);
display(0 ,7);
display(0 ,8);
display(0 ,9);
display(1 ,0);
所以以上其它代码不再复制。
自动显示
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
uchar count = 0; // 控制数码管显示的变量
uchar i = 0; // 控制循环次数的变量
//共阴数码管段选表0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*====================================
描述 :两位共阴数码管动态显示
====================================*/
void display(uchar num1, uchar num2)
{
/*第一位显示*/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFE; //1111 1110
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[num1];//
DU = 0;//锁存段选数据
delay(1);
/*第二位显示*/
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = 0XFD; //1111 1101
WE = 0;//锁存位选数据
DU = 1;//打开段选锁存器
P0 = tabel[num2];//
DU = 0;//锁存段选数据
delay(1);
}
/*====================================
变量 count:负责控制点亮哪2个数码管,例如count 为1 则点亮 01 数码管
描述 :由于同时点亮2个数码管,需要2个数码管不断的循环才能实现2个数码管同时点亮
所以在这里将数码管显示在单片机的代码封装起来,来让我们调用。
====================================*/
void singlechip_show_num(uchar count){
switch(count){ // 通过 switch case 语句对 数码管的数值进行精准的管理
case 0 :
display(0 , 0);
break;
case 1 :
display(0 , 1);
break;
case 2 :
display(0 , 2);
break;
case 3 :
display(0 , 3);
break;
case 4 :
display(0 , 4);
break;
case 5 :
display(0 , 5);
break;
case 6 :
display(0 , 6);
break;
case 7 :
display(0 , 7);
break;
case 8 :
display(0 , 8);
break;
case 9 :
display(0 , 9);
break;
case 10 :
display(1 , 0);
break;
}
}
void main()//main函数自身会循环
{
while(1)
{
for (i = 0; i < 200; i++){ // 使点亮的数码管循环 200 次,保证人眼能够看到的数码管是同时显示的。
singlechip_show_num(count); // 调用数码管显示函数
}
count++; //每次循环200次结束, count 变量自身+1,单片机显示+1后的数值
if(count == 11){ // 当count 变量 等于11时,我们把变量再重新初始化为0,从0重新开始计数循环
count = 0;
}
}
}
效果显示:




















