/*******************************************************************************
* 实 验 名 : 动态显示数码管实验
* 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4
* 实验效果 : 数码管显示76543210。
* 注 意 :
*******************************************************************************/
#include <reg51.h>
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char DisplayData[8];
unsigned int Time=0;
unsigned char m=0;
unsigned char n=0;
unsigned char x=0;
unsigned char y=0;
unsigned char a=0;
unsigned char b=0;
void DigDisplay(); //动态显示函数
void TimerConfiguration();
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
TimerConfiguration();
while(1)
{
DigDisplay();
}
}
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 使用数码管显示
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):LSA=0;LSB=0;LSC=0;
if(Time>=20)
{m++;Time=0;}
GPIO_DIG=DIG_CODE[m];
// if(m==10)
// m=0;
// j=10;
// while(j--);
// GPIO_DIG=0x00;
break;
case(1):LSA=1;LSB=0;LSC=0;
if(m==10)
{n++;m=0;}
GPIO_DIG=DIG_CODE[n];
// j=10;
// while(j--);
// GPIO_DIG=0x00;
break;//显示第1位
case(2):LSA=0;LSB=1;LSC=0;
GPIO_DIG=0x40;
// j=10;
// while(j--);
// GPIO_DIG=0x00;
break;//显示第2位
case(3):LSA=1;LSB=1;LSC=0;
if(n==6)
{x++; n=0;}
GPIO_DIG=DIG_CODE[x];
// j=10;
// while(j--);
// GPIO_DIG=0x00;
break;//显示第3位
case(4):LSA=0;LSB=0;LSC=1;
if(x==10)
{y++;x=0;}
GPIO_DIG=DIG_CODE[y];
// j=10;
// while(j--);
// GPIO_DIG=0x00;
break;//显示第4位
case(5):LSA=1;LSB=0;LSC=1;
GPIO_DIG=0x40;
// j=10;
// while(j--);
// GPIO_DIG=0x00;
break;//显示第5位
case(6):LSA=0;LSB=1;LSC=1;
if(y==6)
{a++;y=0;}
GPIO_DIG=DIG_CODE[a];
// j=10;
// while(j--);
// GPIO_DIG=0x00;
break;//显示第6位
case(7):LSA=1;LSB=1;LSC=1;
if(a==6)
{b++;a=0;}
GPIO_DIG=DIG_CODE[b];
// j=10;
// while(j--);
// GPIO_DIG=0x00;
if(b==10)
b=0;
break;//显示第7位
}
j=10;
while(j--);
GPIO_DIG=0x00;
}
}
void TimerConfiguration()
{
TMOD = 0x01; //选择工作方式1
TH0 = 0x3C; //设置初始值,定时50MS
TL0 = 0xB0;
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
void Timer0() interrupt 1
{
TH0 = 0x3C; //设置初始值
TL0 = 0xB0;
Time++;
} |