|
|
運(yùn)行程序
#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 //自動(dòng)計(jì)算漢字字?jǐn)?shù)
/*****參數(shù)設(shè)置*****/
#define ziti 16 //字體大小(寬度)
#define light 8 //顯示亮度
#define move_speed 25 //移動(dòng)速度
uint k=0,j; //移位變量,k:移位個(gè)數(shù)
uint a=0; //用于軟件延時(shí)
ulong s=(sum+1)*ziti; //s為全部列數(shù)
uchar disbuf[32][2]; //定義顯示緩沖區(qū)(32行兩列的二維數(shù)組以開(kāi)辟2個(gè)16*16漢字的空間)
bit move_st; //移動(dòng)標(biāo)志
/*****可變延時(shí)*****/
void delay(void) //用來(lái)改變掃描延時(shí)以調(diào)節(jié)亮度
{
uchar i;
for(i=0;i<light;i++);
}
/*****初始化子程序*****/
void init(void) //定時(shí)器初始化,設(shè)置定時(shí)器0工作方式1,定時(shí)時(shí)間1ms
{
TMOD=0x1;
TH0=0xfc;
TL0=0x18;
}
/*****計(jì)數(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控制移動(dòng)速度
{
if(k>s-ziti-1)k=0; //整屏移動(dòng)列數(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; //關(guān)右屏
CS1=0; //開(kāi)左屏
for (i=0;i<16;i++)
{
lie=i;
hang1=disbuf[0];
hang2=disbuf[1];
delay();
hang1=0;
hang2=0;
}
CS1=1; //關(guān)左屏
CS2=0; //開(kāi)右屏
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; //開(kāi)中斷
TR0=1;
ET0=1;
while(1)
{
load_hanzi();
display();
}
}
|
|