LCD12864显示程序 下载本文

本例程为通过用AT89C52芯片操作LCD12864显示的程序,使用的晶振为12M。

/********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7

**********************************************************/

#include #include\void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,\莫剑辉\ //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。

/********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7

**********************************************************/ //#include

#define uchar unsigned char #define uint unsigned int

#define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3;

/********************************************* 延时子程序

*********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

/********************************************* LCD12864液晶测忙子程序(读状态)

*********************************************/ void Busy() { uchar busy; do { E = 0; //0为关闭使能端,1为打开使能端 RS = 0; //1为指令,0为数据 RW = 1; //1为读,0为写 Delay_1ms(20); //延时20乘以120时间 E = 1; //0为关闭使能端,1为打开使能端 busy=P1; //读取P2状态 Delay_1ms(20); //延时20乘以120时间 E = 0; //0为关闭使能端,1为打开使能端 } while(busy&0x80); //判断BUSY位是否工作:1为内部在工作,0为正常状态 }

/********************************************* LCD12864液晶数据写入子程序

*********************************************/ void Write_Data(uchar k) { Busy(); //测忙 E =1; //0为关闭使能端,1为打开使能端 RS=1; //1为指令,0为数据 RW=0; //1为读,0为写 DATA=k; //输入数据K到DATA Delay_1ms(20); //延时20乘以120时间 E =0; //0为关闭使能端,1为打开使能端 Delay_1ms(20); //延时20乘以120时间 }

/********************************************* LCD12864液晶命令写入子程序

*********************************************/ void Write_Cmd(uchar cmd) {

Busy(); //测忙 E=1; //0为关闭使能端,1为打开使能端 RS=0; //1为指令,0为数据 RW=0; //1为读,0为写 DATA=cmd; //输入命令cmd到DATA Delay_1ms(20); //延时20乘以120时间

E=0; //0为关闭使能端,1为打开使能端 Delay_1ms(20); //延时20乘以120时间 }

/********************************************* LCD12864液晶数据显示子程序

*********************************************/ void Disp(uchar y,uchar x,uchar i,uchar *z) {

uchar Address;

if(y==1){Address=0x80+x;} //Y判断第几行,X判断第几列,0x80为液晶行初始地址

if(y==2){Address=0x90+x;} if(y==3){Address=0x88+x;} if(y==4){Address=0x98+x;} Write_Cmd(Address); //写入地址命令到LCD12864 while(i) //写入显示数据的大小 { Write_Data(*(z++)); //写入显示数据到LCD12864 i--; } }

/********************************************* LCD12864液晶初始化子程序

*********************************************/ void Ini_Lcd(void) { PSB=1;

Delay_1ms(20);

Write_Cmd(0x30); //基本指令集 Delay_1ms(20);

Write_Cmd(0x02); // 地址归位 Delay_1ms(20);

Write_Cmd(0x0c); //整体显示打开,游标关闭 Delay_1ms(20);

Write_Cmd(0x06); //游标右移 Delay_1ms(20);

Write_Cmd(0x80); //设定显示的起始地址 Delay_1ms(20);

Write_Cmd(0x01); //清除显示 }