* 8位数码管显示 *
* *
********************************************************************
* *
* 描述: *
* 将显存单元的数据进行逐个交换,使数码管形成移动显示效果。 *
* *
*******************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar data display[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,};
unsigned char count,shift,temp;
/**********************************************************
延时子程序
**********************************************************/
void delayms(uint ms)
{
uchar k;
while(ms--)
{
for(k = 0; k < 120; k++);
}
}
/**********************************************************
数据转移函数
**********************************************************/
void exchange()
{
uchar i,j;
display[0]=display[8];
for(i=8; i!=0; i--)
{
j=i-1;
display[i] = display[j];
}
}
/*********************************************************
数码管显示函数
*********************************************************/
void disp()
{
uchar i;
shift=0x7f;
for(i=0; i<8; i++)
{
P0=display[i+1];
P2=shift;
shift=_cror_(shift,1);
delayms(1);
}
P2=0xff ;
}
/*********************************************************
主函数
*********************************************************/
void main()
{
P0=0xff;
P2=0xff;
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1)
{
disp();
}
}
/*********************************************************
定时器0中断服务函数
*********************************************************/
void timer0() interrupt 1
{
TR0=0;
TH0=0x4c; //50ms定时常数
TL0=0x00;
count++;
if(count==20)
{
count=0;
exchange(); //1s转换一次数据
}
TR0=1;
}
|