注意:P0字型口 P2位选口
首先实现1234轮流隔1s显示
#include<reg51.h>
//51单片机寄存器定义头文件
//实现1234轮流隔1s显示
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
void delay(int i)
{
int j,k;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
/************************/
void main(){
int n=1000;
while(1)
{
P2=0x7f;//0111 1111
P0=seg[1];
delay(n);
P2=0xbf;//1011 1111
P0=seg[2];
delay(n);
P2=0xdf;//1101 1111
P0=seg[3];
delay(n);
P2=0xef;//1101 1111
P0=seg[4];
delay(n);
}
}
由于我们人类的视觉暂留不到百分之1秒,快速循环播放,会利用人眼的暂留实现动态显示,
但同时会占用CPU,程序不能停。
动态显示:字段共用的数码管,做不到同时显示不同内容。因此动态显示就是轮流选中每一位数码管,分别显示对应的内容,即为位扫描。然后快速循环,重复以上过程。这样就可以同时显示不同内容,造成视觉假象。其缺点是想要维持显示效果,就必须不断重复位扫描过程。
同理我们可以实现单片机连接8位共阳极数码管,编程显示8个不同的数字
如显示日期:
/*************************
项目名称:项目二简易电子表
任务名称:任务2-2数码管动态显示
任务描述:单片机连接8位共阳极数码管,编程显示8个不同的数字
*************************/
#include<reg51.h>
//51单片机寄存器定义头文件
//显示20240322
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
int dis[]={2,0,2,4,0,3,2,2};//定义8位显示内容
void delay(int i)
{
int j,k;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
/************************************/
void main()
{
int n=1;
while(1)
{
P2=0x7f;//0111 1111
P0=seg[2];
delay(n);
P2=0xbf;//1011 1111
P0=seg[0];
delay(n);
P2=0xdf;//1101 1111
P0=seg[2];
delay(n);
P2=0xef;//1110 1111
P0=seg[4];
delay(n);
P2=0xf7;//0111 1111
P0=seg[0];
delay(n);
P2=0xfb;//1011 1111
P0=seg[3];
delay(n);
P2=0xfd;//1101 1111
P0=seg[2];
delay(n);
P2=0xfe;//1110 1111
P0=seg[2];
delay(n);
}
}
或者使用闭环右移符号实现:
/*************************
项目名称:项目二简易电子表
任务名称:任务2-2数码管动态显示
任务描述:单片机连接8位共阳极数码管,编程显示8个不同的数字
*************************/
#include<reg51.h>
//51单片机寄存器定义头文件
//显示20240322
#include<intrins.h>
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
int dis[]={2,0,2,4,0,3,2,2};//定义8位显示内容 display
void delay(int i)
{
int j,k;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
/***************************/
void main()
{
int i,j;
while(1)
{
for(i=0,j=0x7f;i<8;i++)
{
P2=j;//选中某位数码管
P0=seg[dis[i]];//查表两次,第一次取这一位的显示内容,第二次转换七段码
delay(1);
j=_cror_(j,1);//将位选控制字闭环右移1位
}
}
}
方法二:通过调用函数display()实现
/*************************
项目名称:项目二简易电子表
*************************/
#include<reg51.h>
//51单片机寄存器定义头文件
//通过调用函数实现
#include<intrins.h>
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
int dis[]={2,0,2,2,0,2,3,5};//定义8位显示内容 display
void display();//定义显示子函数,完成一次动态扫描
void delay(int i)
{
int j,k;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
/***************************/
void main()
{
while(1)//不断重复
{
display();
}
}
/**************************/
void display(){
int i,j;
for(i=0,j=0x7f;i<8;i++)
{
P2=j;//选中某位数码管
P0=seg[dis[i]];//查表两次,第一次取这一位的显示内容,第二次转换七段码
delay(1);
j=_cror_(j,1);//将位选控制字闭环右移1位
}
}