📄 main.c
字号:
/*********************************************************
程序名称:LED3216点阵拉幕显示汉字
简要说明:P0口接上行线,P2口接下行线,P3口接扫描线
P3.0接左屏译码器使能端(CS1)
P3.1接右屏译码器使能端(CS2)
编 写:JiangX.net
*********************************************************/
#include<AT89X52.h>
#include<ziku.h>
#define uchar unsigned char //宏定义
#define hang1 P0 //上半屏行线
#define hang2 P2 //下半屏行线
#define lie P1 //扫描列线
#define CS1 P3_0 //接左屏154译码器使能端,低电平有效
#define CS2 P3_1 //接右屏154译码器使能端,低电平有效
#define num sizeof(hanzi)/32 //自动计算字数
uchar m=0,n=0; //m为扫描过程中的中间变量,n为显示指针
uchar a,b; //a、b分别为左半屏、右半屏的扫描变量
/*****参数调整项*****/
#define light 150 //显示亮度调节,数值不可过大,以不感到屏幕闪烁为准
#define speed 30 //卷动速度调节
/*****延时子程序*****/
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 //中断处理
{
uchar k; //定义变量k
TH0=0xfc;
TL0=0x18;
k++; //定时时间到,初始变量加1
if(k>speed) {m++;k=0;}
if(m<=16) {a=m;b=0;} //扫描左半屏,不扫描右半屏
else {a=16;b=m-16;} //全屏扫描左半屏,扫描右半屏
if(m>32) b=16; //全屏扫描右半屏
//中间这段时间是为了看清楚整屏画面内容,稍作停顿
if(m==40) {m=0;n++;} //一幅画面卷动显示过程结束,载入下一幅画面
if(n>num/2-1) n=0; //所有汉字显示完毕,回到第一个汉字
}
/*****显示子程序*****/
void display(void)
{
uchar i,j;
CS2=1; //关右屏
CS1=0; //开左屏
for(i=0;i<a;i++) //变量a决定了一次扫描左半屏列数
{
lie=i; //左屏列扫描信号输出
hang1=hanzi[i+64*n];
hang2=hanzi[i+64*n+16]; //行信号输出
delay();
hang1=0;
hang2=0;
}
CS1=1; //关左屏
CS2=0; //开右屏
for(j=0;j<b;j++) //变量b决定了一次扫描右半屏列数
{
lie=j<<4; //右屏列扫描信号输出
hang1=hanzi[j+64*n+32];
hang2=hanzi[j+64*n+48]; //行信号输出
delay();
hang1=0;
hang2=0;
}
}
/*****主程序*****/
void main(void)
{
init();
TR0=1;
ET0=1;
EA=1; //开中断
while(1)
{
display();
}
}
/*****END*****/
/*****欢迎到作者博客交流:http://www.jiangx.net*****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -