把这个下载下来看看是不是你要的
#include <reg51.h>#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define Fisrt_Addr 0 //定义字符/汉字显示起始位置
typedef unsigned char uint8
sbit LCD_RS=P2^2
sbit LCD_RW=P2^3
sbit LCD_E=P2^4
sbit PCB=P2^5
uchar i,j
uint8 AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
}
void delay(int ms)
{
while(ms--)
{
for(j=0j<120j++)
}
}
bit lcd_busy()
{ bit result
LCD_RS=0
LCD_RW=1
LCD_E= 1
result=(bit)(P0&0x80)
LCD_E=0
return result
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy())
LCD_RS=0
LCD_RW=0
LCD_E=0
P0=cmd
LCD_E=1
LCD_E=0
}
void lcd_wdata(uchar dat)
{
while(lcd_busy())
LCD_RS=1
LCD_RW=0
LCD_E=0
P0=dat
LCD_E=1
LCD_E=0
}
void lcd_initial()
{
lcd_wcmd(0x30)
delay(1)
lcd_wcmd(0x0C)//开显示,关光标,不闪烁
delay(1)
lcd_wcmd(0x06)//指定在资料写入或读取时,光标的移动方向
delay(1)
lcd_wcmd(0x01)
delay(10)//这里要延时长一点,否侧会影响下面的 *** 作
}
/*------------------清屏命令--------------------------*/
void Clr_Screen()
{
lcd_wcmd(0x30)//考虑到前面出现0x34
lcd_wcmd(0x01)
delay(10)
}
/*------------------整屏写入数据:全亮,或者竖条-----------------------------*/
//先写0x34关绘图,写地址数据,0x360x绘图
void Lcd_Fill(uchar disdata)
{ uchar x,y//参考PDF写GDRAM的步骤,显示坐标
for(y=0y<32y++)
for(x=0x<16x++)
{ lcd_wcmd(0x34)
lcd_wcmd(y+0x80) //行地址
lcd_wcmd(x+0x80)//列地址
lcd_wdata(disdata)
lcd_wdata(disdata)
lcd_wcmd(0x36)
}
lcd_wcmd(0x30)//考虑到前面出现0x34
}
/*------------------显示字符串--------------------------*/
void Zi_FU(uchar code *s)
{
while(*s!=0)
{ lcd_wdata(*s)
s++
delay(10)
}
}
//注意:中文显示时空格符或数字ASCII码必需两个一起用,标点符号注意中英文
void intruction()
{
Clr_Screen()
lcd_wcmd(0x80)//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
Zi_FU("我真的很爱你")
lcd_wcmd(0x90)//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
Zi_FU("很在乎很在乎你 ")
lcd_wcmd(0x88)//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
Zi_FU("我把我的心交给你")
lcd_wcmd(0x98)//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
Zi_FU("想你啦")
delay(1000)
}
void feeling1()
{
lcd_wcmd(0x30)
Zi_FU("我真的很爱你")
delay(300)
lcd_wcmd(0x90+Fisrt_Addr)
Zi_FU("很在乎很在乎你 ")
delay(300)
lcd_wcmd(0x88+Fisrt_Addr)
Zi_FU("我把我的心交给你")
delay(300)
lcd_wcmd(0x98+Fisrt_Addr)
delay(500)
Zi_FU("想你哦")
}
/*------------------显示图片---------------------------*/
void Disp_Img(uchar code *bmp)
{
uchar count=2,X=0x80
lcd_wcmd(0x34)//扩展指令
lcd_wcmd(0x36)//打开绘图
for(count>0count--)
{
for(i=0i<32i++)
{ lcd_wcmd(0x80|i)
lcd_wcmd(X)//X地址坐标,自动加1.
for(j=0j<16j++) //16*8=128
lcd_wdata(*bmp++)
}
X=0x88//下半屏
}
}
/*********************************************
函数名称:去字摸函数 ,取模方式是横向,顺序
函数功能:
**********************************************/
void ZK(uchar *zk)
{
uchar i, j
for(j=0j<16j++)
{
lcd_wcmd(0x34)//扩展指令
lcd_wcmd(0x36)//打开绘图
lcd_wcmd(0x80|j)
lcd_wcmd(0x80) //X地址坐标,自动加1.
for(i=0i<2i++)
{
lcd_wdata(*zk++)
}
}
}
/*********************************************
函数名称: 向某一行写字符
函数功能:
**********************************************/
void Lcd_Write_Poss(uchar x,uchar y,uchar *ZiFu)
{
uchar addr,i=0
if(x==1)addr=0x80
if(x==2)addr=0x90
if(x==3)addr=0x88
if(x==4)addr=0x98
addr=addr+y
lcd_wcmd(0x30)
lcd_wcmd(addr)
while(*ZiFu!='\0')
{
lcd_wdata(*ZiFu++)
}
}
void main()
{
PCB=1
while(1)
{
lcd_initial()
delay(1000)
Clr_Screen()
feeling1()
delay(3000)
for(i=8i>0i--)
{
lcd_wcmd(0x18) //一二行与三四行调换了,液晶分为上下两个半屏,
delay(1000) //有时会乱,与上面程序有关,要加lcd_wcmd(0x30), clrscreen()
}
Clr_Screen() //清屏
feeling1()
lcd_wcmd(0x34)
lcd_wcmd(0x04) //0X04第一行和第三行反白显示,
delay(3000)//0X05第二行和第四行反白显示,与PDF不符
lcd_wcmd(0x04)//恢复正常
delay(3000)
lcd_wcmd(0x34)
lcd_wcmd(0x03) //允许输入滚动地址
for(i=0x40i<0x7fi++)
{
lcd_wcmd(i) //垂直滚动屏幕的内容
delay(500)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)