#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIN =P1^0;//74HC595数据线
sbit Rclk=P1^1;//74HC595锁存口,上升沿有效
sbit SCLK=P1^2; //74HC595时钟线,上升沿有效
uchar tcount,move;//定时器计数值和汉字移动的次数
void delay(uint del)
{
while(--del);
}
void init_tx()//定时移动字
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=1;
EA=1;
}
void wri_dat(uchar dat) //写1byte数据
{
uchar i;
DIN=1;
for(i=0;i<8;i++)
{
if(dat&0x01)DIN=1;//低位在前
else DIN=0;
SCLK=0;
SCLK=1;
dat>>=1;
}
}
void wri()
{ uchar *point;
uchar i,j;
uchar num2,aa;//ss,
num2=0x80;//首先显示第一行
aa=move*4;//没一行需写4byte
point=&tab1[aa]; //指针指向开始地址
for(j=0;j<8;j++)
{
wri_dat(num2);
// ss=aa+j*4;
// if(ss>=32)ss-=32;
// point=tab1+ss;
for(i=0;i<4;i++)
{
if(point>=(tab1+40))point=tab1;//如果已经指向最后一个地址,则让其指向首地址,达到移动显示的效果
wri_dat(*point++);
}
Rclk=0; delay(1);
Rclk=1; //写完一行显示一次
num2>>=1;
}
}
void main()
{
init_tx();
while(1)
{
wri();
}
}
void timer0()interrupt 1
{
TH0=0x3c;
TL0=0xb0;
tcount++;
if(tcount>12){tcount=0;move++;if(move>9)move=0;}
//数组有多少个行数,move的值相应改变
}
|