運行程序
#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 //自動計算漢字字數(shù)
/*****參數(shù)設置*****/
#define ziti 16 //字體大�。▽挾龋�
#define light 8 //顯示亮度
#define move_speed 25 //移動速度
uint k=0,j; //移位變量,k:移位個數(shù)
uint a=0; //用于軟件延時
ulong s=(sum+1)*ziti; //s為全部列數(shù)
uchar disbuf[32][2]; //定義顯示緩沖區(qū)(32行兩列的二維數(shù)組以開辟2個16*16漢字的空間)
bit move_st; //移動標志
/*****可變延時*****/
void delay(void) //用來改變掃描延時以調節(jié)亮度
{
uchar i;
for(i=0;i<light;i++);
}
/*****初始化子程序*****/
void init(void) //定時器初始化,設置定時器0工作方式1,定時時間1ms
{
TMOD=0x1;
TH0=0xfc;
TL0=0x18;
}
/*****計數(shù)器中斷程序*****/
void timer0(void) interrupt 1 //中斷處理
{
TH0=0xfc;
TL0=0x18;
a++;
}
/*****漢字循環(huán)顯示*****/
void run_move(void)
{
uchar k1,k2;
if(a>=move_speed) //move_speed控制移動速度
{
if(k>s-ziti-1)k=0; //整屏移動列數(shù)
k1=k/ziti;
k2=k%ziti;
j=ziti*2*k1+k2; //顯示指針
k++;
move_st=1;
a=0;
}
}
/*****裝載顯示數(shù)據(jù)至緩沖區(qū)*****/
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;
}
}
/*****掃描顯示數(shù)據(jù)緩沖區(qū)的內(nèi)容*****/
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();
}
}
|