运行程序
#include <AT89X52.h>
#include "test_ziku.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long //宏定义
#define hang1 P0 //上行线
#define hang2 P2 //下行线
#define lie P1 //列线
#define CS1 P3_0 //接左屏154译码器使能端
#define CS2 P3_1 //接右屏154译码器使能端
#define sum sizeof(hanzi)/32 //自动计算汉字字数
/*****参数设置*****/
#define ziti 16 //字体大小(宽度)
#define light 8 //显示亮度
#define move_speed 25 //移动速度
uint k=0,j; //移位变量,k:移位个数
uint a=0; //用于软件延时
ulong s=(sum+1)*ziti; //s为全部列数
uchar disbuf[32][2]; //定义显示缓冲区(32行两列的二维数组以开辟2个16*16汉字的空间)
bit move_st; //移动标志
/*****可变延时*****/
void delay(void) //用来改变扫描延时以调节亮度
{
uchar i;
for(i=0;i<light;i++);
}
/*****初始化子程序*****/
void init(void) //定时器初始化,设置定时器0工作方式1,定时时间1ms
{
TMOD=0x1;
TH0=0xfc;
TL0=0x18;
}
/*****计数器中断程序*****/
void timer0(void) interrupt 1 //中断处理
{
TH0=0xfc;
TL0=0x18;
a++;
}
/*****汉字循环显示*****/
void run_move(void)
{
uchar k1,k2;
if(a>=move_speed) //move_speed控制移动速度
{
if(k>s-ziti-1)k=0; //整屏移动列数
k1=k/ziti;
k2=k%ziti;
j=ziti*2*k1+k2; //显示指针
k++;
move_st=1;
a=0;
}
}
/*****装载显示数据至缓冲区*****/
void load_hanzi(void)
{
uchar i;
run_move();
if(move_st)
{
for(i=0;i<31;i++)
{
disbuf[0]=disbuf[i+1][0];//移位处理
disbuf[1]=disbuf[i+1][1];//移位处理
}
disbuf[31][0]=hanzi[j];
disbuf[31][1]=(hanzi[ziti+j]);
move_st=0;
}
}
/*****扫描显示数据缓冲区的内容*****/
void display(void)
{
uchar i;
CS2=1; //关右屏
CS1=0; //开左屏
for (i=0;i<16;i++)
{
lie=i;
hang1=disbuf[0];
hang2=disbuf[1];
delay();
hang1=0;
hang2=0;
}
CS1=1; //关左屏
CS2=0; //开右屏
for (i=0;i<16;i++)
{
lie=i<<4;
hang1=disbuf[i+16][0];
hang2=disbuf[i+16][1];
delay();
hang1=0;
hang2=0;
}
}
/*****主程序*****/
void main (void)
{
init();
EA=1; //开中断
TR0=1;
ET0=1;
while(1)
{
load_hanzi();
display();
}
}
|