/**************************************************
功能:12864显示汉字
单片机:STC12C5A60S2
晶振:11.0592M
并行输出
*****************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P3^7;//脉冲使能
sbit RW=P3^6;//读写选择
sbit RS=P3^5;//数据命令选择
sbit rst=P1^0;//12864复位
uchar code table3[]="欲穷千里目";
uchar code table4[]="更上一层楼";
uchar code table1[]="白日依山尽";
uchar code table2[]="黄河入海流";
// 延时ms函数:
void Delayms(uint t)//STC12C5A60S2 1ms
{
uint i,j;
for(i=t;i>0;i--)
for(j=0;j<840;j++);
}
// 12864写命令函数:
void Write12864Command(uchar com)
{
Delayms(10);
P0=com;//赋值
E=0;//写命令前三控制线的状态
Delayms(10);
RS=0;
RW=0;
E=1;//拉高,写命令
Delayms(10);//延时必须加
E=0;//写命令后三控制线的状态
Delayms(10);//延时必须加
RS=1;
RW=1;
}
//12864写数据函数:
void Write12864Data( uchar dat)
{
Delayms(10);
P0=dat;//赋值
E=0;//写数据前三控制线的状态
Delayms(10);
RS=1;
RW=0;
E=1;//拉高,写数据
Delayms(10);//延时必须加
E=0;//写数据后三控制线的状态
Delayms(10);//延时必须加
RS=0;
RW=1;
}
//12864初始化函数:
void Initialize12864()
{
rst=0;//复位12864
Delayms(30);
rst=1;
Delayms(20);
Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
Write12864Command(0x08);//显示关
Write12864Command(0x01);//清屏
Write12864Command(0x06);//地址计数器加一、光标右移
Write12864Command(0x0c);//显示开
}
//在指定行和列显示汉字
void LCD12864DisplayString( uchar y, uchar x, uchar *pstr)
//y-行数值0-3,x-列数值0-7,pstr-字符串指针
//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
//为了实现自动换行功能,这个函数比较繁琐
{
uchar row,n=0;
Write12864Command(0x30);//基本指令
Write12864Command(0x06);//地址计数器自动加以,光标右移
switch(y)//根据行号选择行地址
{
case 0:row=0x80;break;//第一行首地址
case 1:row=0x90;break;//第二行首地址
case 2:row=0x88;break;//第三行首地址
case 3:row=0x98;break;//第四行首地址
default:;
}
Write12864Command(row+x);//写地址
while(*pstr!='\0')
{
Write12864Data(*pstr);//写字符
pstr++;
n++;//计数
if((n+x*2)==16)//如果一行写完,继续写第二行
{
if(y==0) Write12864Command(0x90);//写下一行地址
else if(y==1) Write12864Command(0x88);//写下一行地址
else if(y==2) Write12864Command(0x98);//写下一行地址
else ;
}
else if((n+x*2)==32)//如果第二行写完,继续写第三行
{
if(y==0) Write12864Command(0x88);//写下一行地址
else if(y==1) Write12864Command(0x98);//写下一行地址
else ;
}
else if((n+x*2)==48)//如果第三行写完,继续写第四行
{
if(y==0) Write12864Command(0x98);//写下一行地址
else ;
}
else ;
}
}
//清屏
void Clear12864Screen()
{
Write12864Command(0x01);//清屏
Write12864Data(0x00);//清屏
}
void main()
{
uchar i;
Delayms(100);
Initialize12864();
Clear12864Screen();
while(1)
{
Write12864Command(0x80);
for(i=0;i<11;i++)
{
Write12864Data(table1[i]);
Delayms(200);
}
Clear12864Screen();
Write12864Command(0x90);
for(i=0;i<11;i++)
{
Write12864Data(table2[i]);
Delayms(200);
}
Clear12864Screen();
Write12864Command(0x88);
for(i=0;i<12;i++)
{
Write12864Data(table3[i]);
Delayms(200);
}
Clear12864Screen();
Write12864Command(0x98);
for(i=0;i<12;i++)
{
Write12864Data(table4[i]);
Delayms(200);
}
Clear12864Screen();
LCD12864DisplayString(0, 0, "--登鹳雀楼");
Delayms(4000);
Clear12864Screen();
}
}
STC12C5A60S2与12864显示
最新推荐文章于 2024-03-17 14:43:56 发布