📄 text1.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0
#define N 800
sbit E=P2^5;
sbit RW=P2^6;
sbit RS=P2^7;
sbit RSTB=P2^4;
int num;
uint i=0;
uint l=0;
uint b;
uchar temp;
uchar a[]="东莞理工学院0123456789abcdefg,今天是2008年04月07日星期1.";
uchar c[]={2+'0',5+'0'};
uchar d[]={0x98,0x90,0x88,0x80};
////////////////////////////////////////////////////////////
/**************延时1ms*count*****************///
void delay(int count)
{
int x,y;
for(x=0;x<count;x++)
for(y=0;y<120;y++);
}
/***********忙检测********************/
void Busy()
{
DataPort=0xFF;
RS=0;
RW=1;
E =1;
if (P0^7==1) delay(10);
E=0;
}
/***********写指令子程序****************/
void Write_Com(uchar command)
{
Busy(); //检测忙标志位
RS=0;
RW=0;
E=1;
DataPort=command; //写入指令
delay(1);
E=0;
RW=1;
DataPort=0xff;
}
/***********写数据子程序***************/
void Write_Data(uchar Data)
{
Busy();
RS=1;
RW=0;
E=1;
DataPort=Data;
delay(1);
E=0;
RW=1;
}
/***********LCD初始化*******************/
void Init_LCD(void)
{
RSTB=0;
delay(1);
RSTB=1;
delay(1);
Write_Com(0x32);//30H--基本指令操作
Write_Com(0x32);
Write_Com(0x0e);//开显示,关光标,不闪烁。
Write_Com(0x00);//清除显示
Write_Com(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。
}
/*****************清屏***********************/
void Clear_LCD(void)
{
Write_Com(0x01);
Write_Com(0x34);
Write_Com(0x30);
}
/*******************逐行显示***************************************/
/**** 灵活的算法,实现字体向上走动,x=d[0]=0x98时,i=0时执行第1,3个if,最终将字写在0x98开始的行中。
x=d[1]=0x90时,i=0时执行第1,4个if,最终将字写在0x98开始的行中,i=16时执行第2个if,将字写在
0x98中。。。以此类推。。。 ****/
void Display_Line(uchar x)
{
uchar c=0;
c=x-0x1; //本函数说明,函数内部的计算公式一定要处在函数的首行
if(i==0) Write_Com(x);
if(i==2*(0x87-c)) Write_Com(0x90);
if(i==2*(0x97-c)) Write_Com(0x98);
if(i==2*(0x8f-c)) Write_Com(0x88);
}
/********************汉字显示********************/
void Show_Chiese()
{
EA=0;
b=sizeof(a)/sizeof(char); //注意,这里不能单纯写成b=sizeof(a),编译器看到的就是一个有52个元素的字符形数组,大小就是2*52.
num=b;
//for(l=0;l<4;l++)
//{
l=3;
for(i=0;i<num;i++)
{
Display_Line(d[l]);
Write_Data(a[i]);
}
delay(N); //决定字幕向上走的速度。
//EA=1;
//}
EA=1;
TH0=0x06;
TL0=0x06; //设定定时的时间,1542=(65536-定时时间)*(12/晶振频率)
//晶振频率为12M的定时时间为63994ms。
Write_Com(0x9e);
for(i=0;i<3;i++)
{Write_Data(c[i]);}
delay(5000);
Clear_LCD();
delay(500);
}
///////////////////////////////////////////////////////////////
/*********************主函数********************/
void main(void)
{
TMOD=0x01; ///选择定时器模式
TR0=1; //开中断,并允许T0中断
ET0=1;
EA=1; //总开关
Init_LCD();
Clear_LCD();
DataPort=0xff;
DataPort=0x00;
while(1);
{
};
}
////////////////////////////////////////////////////
void t0(void) interrupt 1 using 0
{
//delay(100);
Show_Chiese();
//EA=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -