LCD12864显示程序(精校版本)

合集下载

lcd12864.h是液晶显示的程序

lcd12864.h是液晶显示的程序
//**********************************
void clrram_lcd (void)
{
wr_i_lcd(0x30);
wr_i_lcd(0x01);
}
//********************************
//指定要显示字符的坐标
//*******************************
#define uint unsigned int
#define uchar unsigned char
//****************************************
//12864液晶显示部分子程序模块
//****************************************
case 2 : readOldL ^= ( 0x01 << ( 15 - tier_bit ));break ;
default : break ;
}
wr_d_lcd(readOldH);
wr_d_lcd(readOldL);
}
//wr_i_lcd(0x36);
wr_i_lcd(0x30);
}
default : break ;
}
wr_d_lcd( readOldH ) ;
wr_d_lcd( readOldL ) ;
}
else
{
switch(color)
{
case 0 : readOldL &= (~( 0x01 << ( 15 - tier_bit )));break ;
case 1 : readOldL |= ( 0x01 << ( 15 - tier_bit ));break ;

12864图形液晶显示器c程序

12864图形液晶显示器c程序

lcd12864图形液晶显示器c程序#define _LCD12864_E//#include"lcd12864.h"#include"dtype.h"#include<reg52.h>sbit lcd_rw=P2^0;sbit lcd_rs=P2^1;sbit lcd_cs2=P2^2;sbit lcd_cs1=P2^3;sbit lcd_e=P3^0;sbit lcd_busy=P0^7;INT8U lcd_page_grobal,lcd_line_grobal; /** 函数名称:lcd_LScreen()* 函数功能:选择显示屏的左半屏*/ void lcd_LScreen(){lcd_cs2=0;lcd_cs1=1;}/** 函数名称:lcd_RScreen()* 函数功能:选择显示屏的右半屏*/ void lcd_RScreen(){lcd_cs1=0;lcd_cs2=1;}/** 函数名称:lcd_ChkBusy()* 函数功能:查询忙状态*/void lcd_ChkBusy(){while(lcd_busy){lcd_e=0;lcd_rs=0;lcd_rw=1;P0=0xff;lcd_e=1;lcd_e=0;}}/* 函数名称:lcd_WriteCmd()* 函数功能:写命令cmd--待写命令*/void lcd_WriteCmd(const INT8U cmd){lcd_ChkBusy();lcd_rs=0;lcd_rw=0;P0=cmd;lcd_e=1;lcd_e=0;}/* 函数名称:lcd_WriteData()* 函数功能:写数据dat--待写数据*/void lcd_WriteData(const INT8U dat){lcd_ChkBusy();lcd_rs=1;lcd_rw=0;P0=dat;lcd_e=1;lcd_e=0;}/* 函数名称:lcd_StartLine()* 函数功能:设定起始行line--列号* 说明:用户需自己保证行号的有效性*/ void lcd_StartLine(INT8U line){INT8U tmp;tmp=line;tmp=tmp|0x40;lcd_WriteCmd(tmp);}/* 函数名称:lcd_StartPage()* 函数功能:设定起始页* 入口参数:page--页号* 说明:用户需自己保证页号的有效性*/ void lcd_StartPage(INT8U page){INT8U tmp;tmp=page;tmp|=0xb8;lcd_WriteCmd(tmp);}/* 函数名称:lcd_Ready()* 函数功能:显示屏初始化*/void lcd_Ready(){INT8U i,j;lcd_LScreen();lcd_WriteCmd(0x3f); //开显示lcd_RScreen();lcd_WriteCmd(0x3f); //开显示lcd_LScreen();for(i=0;i<8;i++){lcd_StartPage(i);lcd_StartLine(0);for(j=0;j<64;j++){lcd_WriteData(0);}}lcd_RScreen();for(i=0;i<8;i++){lcd_StartPage(i);lcd_StartLine(0);for(j=0;j<64;j++){lcd_WriteData(0);}}}/** 函数名称:lcd_Display(INT8U *ptr) * 函数功能:16*16显示* 入口参数:*ptr--图片数据指针lcd_page_grobal--页地址lcd_line_grobal--列地址调用方法:lcd_page_grobal=xx;lcd_line_grobal=xx;ptr=&picture;lcd_Ready();lcd_Display(ptr);*/void lcd_Display(INT8U *ptr){INT8U i,j;lcd_StartPage(lcd_page_grobal);lcd_StartLine(lcd_line_grobal);for(i=0;i<16;i++){lcd_WriteData(*ptr);ptr++;}lcd_StartPage(lcd_page_grobal+1);lcd_StartLine(lcd_line_grobal);for(j=0;j<16;j++){lcd_WriteData(*ptr);ptr++;}}void main( void ){lcd_page_grobal=xx;lcd_line_grobal=xx;ptr=&picture;lcd_Ready();lcd_Display(ptr);}。

LCD12864显示中文及图片C程序

LCD12864显示中文及图片C程序

/****************************************屏幕显示驱动*****************************************/#include "GT23L24T3Y.h"#include "print.h"#include <stdio.h>#include <string.h>#include "bmp_picture.h"#include "lcd_12864.h"#include "..\user\rtc.h"u8 comTable[]={4,5,6,7,3,2,1,0};extern void Setlcd_Addr ( u8 row,u8 column );//外部函数调用声明extern u8 Num_Code[];//字库获得函数extern u8 Big_Num_Code[];//字库获得函数extern u8 Picture_Code[];//字库获得函数extern u8 arrow1[];extern u8 arrow2[];u8 testlcd[]="测试数据";/************************************************************************//显示中文输出//函数名:print_16//功能:显示16x16点阵字符串。

// 函数名:print_16// 功能:显示16点阵字符串// 形参:// row:x轴// column:y轴// *lcd:显示字符串// logic:显示取反// wei.显示位值// len长度*************************************************************************/void _print_15 ( u8 row,u8 column,const char *lcd,u8 logic ,u8 wei,u8 len){u8 w=0,x=0,y=0,l=0,read_data=0;u8 Length=0;GT_cs1;//字库片选至高for ( l=len; l>0; l=l-2 ) //总字节{w=*lcd;if ( w&0x80 ) //为1则为汉字,为0则为ASCII码{GT_cs0; //字库片选选定GT23_Write ( GT23_write_15 ( lcd ) ); //写入字库指令以及文字地址for ( x=0; x<2; x++ ){Setlcd_Addr (row,column);for(y=0;y<16;y++){read_data=GT23_Read();if(logic == true){// read_data = ~read_data;}WriteData(read_data );}row++;}GT_cs1;//字库片选至高row-=2;column+=16;if(column>=128){row+=2;column=0;}lcd=lcd+2;}}}/************************************************************************//描述:显示中文输出//使用:顶层函数调用参数:row 行column 列*lcd 字符串logic 反白*************************************************************************/ void print_15 ( u8 row,u8 column,const char *lcd,u8 logic ){u8 c=strlen ( lcd );_print_15(row,column,lcd,logic,0,c);}/************************************************************************ //描述:显示图片输出//使用:顶层函数调用参数:row 行column 列*lcd 字符串logic 反白*************************************************************************/ void print_array(u16 row,u16 column,u16 size_x,u16 size_y,const u8 *ptr, u8 logic){u8 w=0,x=0,y=0,l=0,read_data=0;u8 Length=0;for( x=0;x<size_x/8;x++){Setlcd_Addr (row,column);for(y=0;y<size_y;y++){read_data=*( ptr + (y+x*size_y) );if(logic == true){read_data = ~read_data;}WriteData1(read_data);// WriteData1(0XFF);}row++;}}u8 OpMgsCode[][10] ={"病人信息","循环播放","房号与床号","从机音量","对比度","广播""恢复","音乐","主机音量","时间"};u8 DayCode[][7]={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};void PrintMainFace(time mytime,u8 PeopleNum){//待机界面函数u8 Hrd,Ten,One;Lcd_Clr();//清屏print_15 ( 0,16, "月",false );print_15 ( 0,48, "日",false );print_15 ( 0,70, &DayCode[mytime.day][0],false );//显示星期//日期显示Ten=mytime.month/10;One=mytime.month%10;print_array(0 , 0, 16 , 7 , &Num_Code[Ten*14], false);print_array(0 , 8, 16 , 7 , &Num_Code[One*14], false);Ten=mytime.date/10;One=mytime.date%10;print_array(0 , 32, 16 , 7 , &Num_Code[Ten*14], false);print_array(0 , 40, 16 , 7 , &Num_Code[One*14], false);//时间显示Ten=mytime.hour/10;One=mytime.hour%10;print_array(2 , 20, 32 , 21 , &Big_Num_Code[Ten*84], false);print_array(2 , 42, 32 , 21 , &Big_Num_Code[One*84], false);Ten=mytime.minute/10;One=mytime.minute%10;print_array(2 , 68, 32 , 21 , &Big_Num_Code[Ten*84], false);print_array(2 , 90, 32 , 21 , &Big_Num_Code[One*84], false);//住院人数显示print_15 ( 6,32, "住院人数",false );Hrd=PeopleNum/100;PeopleNum=PeopleNum%100;Ten=PeopleNum/10;One=PeopleNum%10;if(Hrd ){print_array(6 , 96, 16 , 7 , &Num_Code[Hrd*14], false);}print_array(6 , 102, 16 , 7 , &Num_Code[Ten*14], false);print_array(6 , 110, 16 , 7 , &Num_Code[One*14], false);}void PrintPictureFace(u8 Index){time mytime;Lcd_Clr();//清屏mytime.month = 10;mytime.date = 16;mytime.hour = 12;mytime.minute = 15;mytime.day =3;PrintMainFace(mytime,96);//print_array(0 , 10, 48 , 8 , arrow1, false);//左箭头显示// print_array(0,38 ,48 ,48 , &Picture_Code[288*Index], false);//图片显示// print_array(0,108, 48 , 8 , arrow2, false); //右箭头显示//print_15 ( 6,33, &OpMgsCode[0][Index],false );//提示信息显示}。

LCD12864驱动程序(带字库的)

LCD12864驱动程序(带字库的)
/*void delayuS(uchar buf)
{
while(buf--);
}*/
/***********忙检测********************/
void Busy()
{
DataPort=0xFF;
RS=0;
RW=1;
while (1)
{
E =1;
if (P0^7==0) break;
}
E=0;
}
void main(void)
{
TMOD=0x01; ///选择定时器模式
TR0=1; //开中断,并允许T0中断
ET0=1;
EA=1; //总开关
Init_LCቤተ መጻሕፍቲ ባይዱ();
Clear_LCD();
while(1);
}
void t0(void) interrupt 1 using 0
{
//delay(100);
/*void Line_Num(uchar k)
{
//uint l;
if(k>=128&&k<=135)l=1;
if(k>135&&k<=143) l=3;
if(k>143&&k<=151) l=2;
if(k>151&&k<=159) l=4;
}*/
/*******************逐行显示***************************************/
void Write_Data(uchar Data)
{
Busy();
RS=1;
RW=0;

LCD12864显示实时时钟例程可运行

LCD12864显示实时时钟例程可运行

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

下面是一段12864液晶显示实时时钟的程序:/****************************************************************************** *********时间:2012.11.30晶振:11.0592MHz芯片:STC89C52RC功能描述:在12864上显示年、月、日、星期、时、分和秒等时间信息******************************************************************************* ********/#include<reg52.h>#define uchar unsigned charsbit CLK=P1^4; //DS1302引脚定义sbit IO=P1^5;sbit CE=P1^6;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit RS=P2^4; //12864引脚定义数据口为P0sbit RW=P2^5;sbit EN=P2^6;sbit PSB=P2^1;sbit RET=P2^3;void Input_1byte(uchar TD) //DS1302输入一字节数据{uchar i;ACC=TD;for(i=8;i>0;i--){IO=ACC0;CLK=1;CLK=0;ACC=ACC>>1;}}uchar Output_1byte(void) //DS1302输出一字节数据{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}return(ACC);}void Write_DS1302(uchar add,uchar dat)//向DS1302写{CE=0;CLK=0;CE=1;Input_1byte(add);Input_1byte(dat);CE=0;}uchar Read_DS1302(uchar add) //从DS1302读{uchar inf; //信息临时存储变量CE=0;CLK=0;CE=1;Input_1byte(add);inf=Output_1byte();CE=0;return(inf);}/**********************DS1302初始化*****************************/void init_1302(){if(Read_DS1302(0xd1)==0x55) //判断内存单元的内容,是否进行初始化 {return;}else{Write_DS1302(0x8e,0x00); //关闭写保护Write_DS1302(0x90,0x00); //电池充电设置Write_DS1302(0x80,0x00); //秒Write_DS1302(0x82,0x54); //分Write_DS1302(0x84,0x20); //时Write_DS1302(0x86,0x30); //日Write_DS1302(0x88,0x11); //月Write_DS1302(0x8a,0x05); //星期Write_DS1302(0x8c,0x12); //年Write_DS1302(0xd0,0x55); //写RAMWrite_DS1302(0x8e,0x80); //打开写保护}}/**********************延时函数*****************************/ void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/**********************12864判忙*****************************/ void check_busy(){RS=0;RW=1;EN=1;while((P0&0x80)==0x80);EN=0;}/**********************12864写指令*****************************/ void write_com(uchar com){check_busy();RS=0;RW=0;EN=1;P0=com;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864写数据*****************************/void write_data(uchar dat){check_busy();RS=1;RW=0;EN=1;P0=dat;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864初始化函数*****************************/void init(){DelayMs(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式DelayMs(1); //延时RET=0; //复位DelayMs(1); //延时RET=1; //复位置高DelayMs(200);write_com(0x30); //选择基本指令集DelayUs2x(250); //延时大于100uswrite_com(0x30); //选择8bit数据流DelayUs2x(200); //延时大于37uswrite_com(0x0c); //开显示(无游标、不反白)DelayUs2x(250); //延时大于100uswrite_com(0x01); //清除显示,并且设定地址指针为00HDelayMs(200); //延时大于10mswrite_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(250); //延时大于100us}/**********************清屏*****************************/void clrscreen(){write_com(0x01);DelayMs(15);}/*********************************************************主函数********************************************************/void main(){uchar sec,sec1,sec2;uchar min,min1,min2;uchar hour,hour1,hour2;uchar date,date1,date2;uchar mon,mon1,mon2;uchar day;uchar year,year1,year2;uchar table1[]="年月日时分秒星期温度摄氏"; //长度24uchar table2[]={0XD2,0XBB, 0XB6,0XFE, 0XC8,0XFD, 0XCB,0XC4, 0XCE,0XE5, 0XCE,0XF9, 0XC8,0XD5}; //长度14 uchar table3[]="0123456789"; //长度10init(); //液晶初始化clrscreen();DelayMs(200);init_1302(); //1302初始化只初始化一下就可以需要下载两次DelayMs(50);write_com(0x80); //显示20write_data('2');write_data('0');write_com(0x82); //显示年write_data(table1[0]);write_data(table1[1]);write_com(0x84); //显示月write_data(table1[2]);write_data(table1[3]);write_com(0x86); //显示日write_data(table1[4]);write_data(table1[5]);write_com(0x91); //显示时write_data(table1[6]);write_data(table1[7]);write_com(0x93); //显示分write_data(table1[8]);write_data(table1[9]);write_com(0x95); //显示秒write_data(table1[10]);write_data(table1[11]);write_com(0x88); //显示星期write_data(table1[12]);write_data(table1[13]);write_data(table1[14]);write_data(table1[15]);while(1){sec=Read_DS1302(0x81); ////读秒sec1=sec&0x0f; //个位sec2=sec>>4; //十位min=Read_DS1302(0x83); ////读分min1=min&0x0f; //个位min2=min>>4; //十位hour=Read_DS1302(0x85); ////读时hour1=hour&0x0f; //个位hour2=hour>>4; //十位date=Read_DS1302(0x87); ////读日date1=date&0x0f; //个位date2=date>>4; //十位mon=Read_DS1302(0x89); ////读月mon1=mon&0x0f; //个位mon2=mon>>4; //十位year=Read_DS1302(0x8d); ////读年year1=year&0x0f; //个位year2=year>>4; //十位day=Read_DS1302(0x8b); ////读星期write_com(0x94); //送显示内容write_data(table3[sec2]); //秒write_data(table3[sec1]);write_com(0x92);write_data(table3[min2]); //分write_data(table3[min1]);write_com(0x90);write_data(table3[hour2]); //时write_data(table3[hour1]);write_com(0x85);write_data(table3[date2]); //日write_data(table3[date1]);write_com(0x83);write_data(table3[mon2]); //月write_data(table3[mon1]);write_com(0x81);write_data(table3[year2]); //年write_data(table3[year1]);write_com(0x8a);write_data(table2[2*day-2]); //星期write_data(table2[2*day-1]);}}(注:范文素材和资料部分来自网络,供参考。

LCD12864液晶显示原理电路图程序

LCD12864液晶显示原理电路图程序

LCD12864系列点阵型液晶显示模块使用说明书一、OCM12864液晶显示模块概述1.OCM12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。

采用KS0107控制IC。

2.外观尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)78×70×10mm(ocm12864-3),3.视域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),64×44mm(ocm12864-3)4.重量:大约g补充说明:外观尺寸可根据用户的要求进行适度调整。

二、最大工作X围1、逻辑工作电压(Vcc):4.5~5.5V2、电源地(GND):0V3、LCD驱动电压(Vee):0~-10V4、输入电压:Vee~Vdd5、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温)6、保存温度(Tstg):-10~65℃三、电气特性(测试条件Ta=25,Vdd=5.0+/-0.25V)1、输入高电平(Vih):3.5Vmin2、输入低电平(Vil):0.55Vmax3、输出高电平(Voh):3.75Vmin7、读显示数据CODE:RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0H H D7 D6 D5 D4 D3 D2 D1 D0功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。

从DD RAM读数据前要先执行“设置页地址”及“设置列地址”命令。

六、接口时序1.写操作时序时序11.读操作时序时序2时序参数表:Line 7 1/0 1/0 1/0 1/0 …………1/0 1/0 1/0 DB7………………………………X=7 Line60 1/0 1/0 1/0 1/0 …………1/0 1/0 1/0 DB4 Line61 1/0 1/0 1/0 1/0 …………1/0 1/0 1/0 DB5 Line62 1/0 1/0 1/0 1/0 …………1/0 1/0 1/0 DB6 Line63 1/0 1/0 1/0 1/0 …………1/0 1/0 1/0 DB7八、测试硬件电路九、读写模块程序举例写指令子程序(INST)SETB ECLR D_ICLR R_WMOV P1, ACLR EVEE’V0第三脚VEE第18脚可调10K (三极管内置)RET●写数据子程序(DATA)SETB ESETB D_ICLR R_WMOV P1, ACLR ERET●写一页显示RAM数据(假设指令子程序为INST,数据子程序为DATA)MOV A,#0B8HLCALL INST ;置页地址为0页MOV A,#40HLCALL INST ;置列地址为0列MOV R2,#40HMOV R1,#00HMOV DPTR,#ADDRLOOP:MOV A,R1MOVC A,A+DPTRLCALL DATAINC R1DJNZ R2, LOOP带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

lcd12864程序

lcd12864程序

//用户版//描述: LCD12864液晶显示模块,对于芯片KS0108(HD61202)驱动程序.//编写:微控设计网 DC版主日期:2007.9.//编译环境:IAR EW430 V3.42A//验证平台: MC430F14+开发板 V1.0//声明:此程序只供微控用户使用.在未得到DC版主的许可请勿将资料外公开和用于商业用途.//******************************************************************* ***********#include "lcd12864.h"extern unsigned char ASCII86[][6];//******************************************************************* ***********//LCD12864函数声明void Lcd12864delay(); //延时void CheckState(); //忙状态检查void WriteByte(unsigned char dat); //写显示数据void SEdCommandToLCD(unsigned char command); //向LCD发送命令void SetLine(unsigned char line); //设定行地址(页)--X 0-7void SetColumn(unsigned char column); //设定列地址--Y 0-63void SetOnOff(unsigned char onoff); //开关显示void SetStartLine(unsigned char startline); //设定显示开始行--XXvoid ClearScreE(unsigned char screE); //清屏void SelectScreE(unsigned char screE); //选择屏幕unsigned char ReadByte(); //读显示数据//显示8*6字符串void ShowString86(unsigned char lin,unsigned char column, unsigned char *string); //反显一个8*6字块void ReverseShow86(unsigned char lin,unsigned char column);//反显某行某几个字符void ReverseLinChar(unsigned char lin,unsigned char startcolumn,unsigned char ShowQuantity);void InitLCD(void); //初始化LCD//******************************************************************* ***********//初级函数列表//******************************************************************* ***********//延时void Lcd12864delay(){unsigned int i=500;while(i--) {;}}void LcdDelay(){unsigned int i=2;while(i--) {;}}//******************************************************************* ***********//忙状态检查(已整理)void CheckState(){MCU_BUS_DIR_IN; //设置BUS口为输入LVC4254_5Vto3V; //LVC4254数据方向为5V往3VRS0;RW1;E1;while(BUSIN & busy) _NOP(); //等待LCD_DB7为0E0; //重设E=0MCU_BUS_DIR_OUT; //设置BUS口为输出LVC4254_3Vto5V; //LVC4254数据方向为3V往5V}//******************************************************************* ***********//写显示数据(已整理)//dat:显示数据void WriteByte(unsigned char dat){CheckState(); //忙状态检查RS1;RW0;BUSOUT = dat; //写向数据口E1;LcdDelay();E0;}//******************************************************************* ***********//向LCD发送命令(已整理)//command :命令void SEdCommandToLCD(unsigned char command){CheckState(); //忙状态检查RS0;RW0;BUSOUT = command; //写入E1;LcdDelay();E0;}//******************************************************************* ***********//清屏(已整理)//screE:1-左屏,2-右//每个屏的显示RAM共64行,分8页,每页8行(一行对相一个字节)void ClearScreE(unsigned char screE){unsigned char i,j;SelectScreE(screE); //选择指定屏for(i=0;i<8;i++) //共8页(每页8行*64列){ SetLine(i); //选择某一页for(j=0;j<64;j++) //每一页全送0x00为清屏{WriteByte(0x00); //一个数据对应8行,8*64=1页,64*8页}}}//******************************************************************* ***********//开关显示(已整理)//onoff=1开,onoff=0为关//当DB0=1时LCD显示RAM中的内容DB0=0时关闭显示void SetOnOff(unsigned char onoff){onoff=0x3e | onoff; //0011 111xSEdCommandToLCD(onoff); //发命令到LCD}//******************************************************************* ***********//选择屏幕(已整理)//screE: 0-全屏,1-左屏,2-右屏void SelectScreE(unsigned char screE){ //MSC-G12864DYSY-2N:选中高电平switch(screE){ case 0: //开全屏CS1_1;_NOP();CS2_1;_NOP();break;case 1: //开左屏CS1_0;_NOP();CS2_1; //关右屏_NOP();break;case 2:CS1_1;//关左屏_NOP();CS2_0;//开右屏_NOP();break;}}//******************************************************************* ***********//设定行地址(页,也就是字行)--X 0-7(已整理)void SetLine(unsigned char line){line=line & 0x07; //保证在 0<=line<=7line=line|0xb8; //1011 1xxx,SEdCommandToLCD(line); //设定指定页}//******************************************************************* ***********//设定列地址--Y 0-63(已整理)void SetColumn(unsigned char column){column=column &0x3f; //0=<column<=63column=column | 0x40; //01xx xxxxSEdCommandToLCD(column); //指定列}//******************************************************************* ***********//设定显示开始行--XX(已整理)//0--63void SetStartLine(unsigned char startline){startline=startline & 0x07; //保证 0<=startline<8startline=startline|0xc0; //1100 0000(显示起始行ROW设置指令)SEdCommandToLCD(startline); //指定行}//******************************************************************* ***********//初始化LCD (已整理)void InitLCD(void){LVC4254_DIR0; //MCU对LVC4254 DIR控制端IO方向设为0LVC4254_3Vto5V; //LVC4254方向为3V转5V,DIR=0MCU_BUS_DIR_OUT; //MCU总线方向为输出LCDCTL_RSRWE_DIR; //MCU对LCD 控制组端IO方向设为LCDCTL_CS1CS2_DIR; //Lcd12864delay();SelectScreE(0); //选择屏SetOnOff(0); //关显示ClearScreE(1); //清屏1ClearScreE(2); //清屏2SelectScreE(0);SetOnOff(1); //开显示SelectScreE(0);SetColumn(0); //开始列:0SetStartLine(0); //开始行:0ClearScreE(0);}//******************************************************************* ***********//读显示数据(已整理)unsigned char ReadByte(void){unsigned int i;unsigned char dat;CheckState();RS1;RW1;MCU_BUS_DIR_IN; //设置BUS口为输入LVC4254_5Vto3V;E1;for(i=0;i<10;i++); //这个延时是不同MCU速度而不同dat=BUSIN; //读入,(原文件是没有此句的)E0;MCU_BUS_DIR_OUT; //设置BUS口为输出LVC4254_3Vto5V;return(dat);}//******************************************************************* ***********//显示8*6点阵,如显ASCII86[][6],字符(已整理)//旋转90度:字模被竖着切分//lin:字行(0-7), column: 字列(0-31)//address : 字模区首地址由Microcontrol dc 编写void Show86(unsigned char lin,unsigned char column, unsigned char *address){unsigned char i,j=0;if(column>31) //列地址大于31返回{return;}//第0-9个字列else if(column<=9){SelectScreE(1);SetLine(lin);SetColumn((column<<3)-(column<<1)); //计算列地址,以6为倍数.每6列显示一个字符.for(i=0;i<6;i++)WriteByte(address[i]);}//第10个字列else if(column==10){ j=(column<<3)-(column<<1);if(j<=63) //第10个字列的前4列{ SelectScreE(1);SetLine(lin);SetColumn(j);for(i=0;i<4;i++){ WriteByte(address[i]);j++;}}if(j>=64){ SelectScreE(2); //第10个字列的后2列j=j-64;SetLine(lin);SetColumn(j);for(i=4;i<6;i++) //在12864中第10个字列的最后两个字节{WriteByte(address[i]);}}}//第11-20个字列else if(10<column&&column<21){ column=column-11;SelectScreE(2);SetLine(lin);SetColumn((column<<3)-(column<<1)+2);for(i=0;i<6;i++)WriteByte(address[i]);}//第21个字列else if(column==21) //第21个字列{ j=(column<<3)-(column<<1);if(j<128) //第21个字列的前2列{ SelectScreE(2);SetLine(lin);SetColumn(j);for(i=0;i<2;i++){ WriteByte(address[i]);j++;}}if(j>=128){j=j-128;SelectScreE(3); //第21个字列的后4列 SetLine(lin);SetColumn(j);for(i=0;i<4;i++){ WriteByte(address[i]);}}}//第22-31个字列/* else{ column=column-22;SelectScreE(3);SetLine(lin);SetColumn((column<<3)-(column<<1)+4);for(i=0;i<6;i++)WriteByte(address[i]);}*/}//******************************************************************* ***********//显示8*6字符串此字体下对应的点阵为:宽x高=8x6 (已整理)//!!!只能显示在一行上即: 串长+column <=31 column(为6的字列,左屏前4列和右屏后4列不用作显示,两屏共19字列)//旋转90度:字模被竖着切分//lin:字行(0-8), column: 字列(0-31)// *string :指向字符串的首址.void ShowString86(unsigned char lin,unsigned char column, unsigned char *string) { unsigned char ch;unsigned char i=0;for(i=0;string[i]!='\0';i++){if(i+column >20) //保证字符不会起过可显示长度.break;ch=string[i]-0x20; //将ASC字符从32-127位置移到0-96位置,以对应ASC86.C中位置Show86(lin,i+column,ASCII86[ch]);}}//******************************************************************* ***********//反显一个8*6字块只适合LCD19264屏,芯片KS0108(HD61202)//lin:行(0-8), column: 列(0-31)void ReverseShow86(unsigned char lin,unsigned char column){ unsigned char i,j=0;unsigned char tab[6];if(column>31) //列地址大于31返回{return;}//第0-9个字列if(column<=9){ SelectScreE(1); //如果列数(0-9),则写在第一屏上(左屏)SetColumn((column<<3)-(column<<1)); //计算列地址,以6为倍数.每6列显示一个字符.SetLine(lin); //设置行//tab[0]=(ReadByte()); //空读!!!!! ,进行读操作前,必须空读一次for(i=0;i<6;i++) //读6个字节回来tab[i]=~(ReadByte());SetColumn((column<<3)-(column<<1)); //设回初始列for(i=0;i<6;i++) //写回来字节WriteByte(tab[i]);}//第10个字列else if(column==10){ j=(column<<3)-(column<<1); //暂存列值if(j<=63) //是否为第10个字列的前4列{SelectScreE(1); //前4列显示在左屏SetColumn(j);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<4;i++) //读4个字节回来{tab[i]=~ReadByte();j++; }SetColumn((column<<3)-(column<<1));for(i=0;i<4;i++) //写回来字节WriteByte(tab[i]);}if(j>=64){ column=column-10; //为第10个字列的后2列 SelectScreE(2); //显示在中屏SetColumn(column);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<2;i++) //读6个字节回来{tab[i]=~ReadByte();j++;}SetColumn((column<<3)-(column<<1));for(i=0;i<2;i++) //写回来字节WriteByte(tab[i]);}}//第11-20个字列else if(10<column&&column<21){ SelectScreE(2); //显示在中屏column=column-11; //如果列数(11-20),则写在第一屏上(中屏)SetColumn((column<<3)-(column<<1)+2); //计算列地址,以6为倍数SetLine(lin);//tab[0]=ReadByte(); //空读!!!!! ,进行读操作前,必须空读一次for(i=0;i<6;i++) //读6个字节回来tab[i]=~ReadByte();SetColumn((column<<3)-(column<<1)+2);for(i=0;i<6;i++) //写回来字节WriteByte(tab[i]);}//第21个字列 --对于192*64屏else if(column==21){ j=(column<<3)-(column<<1);if(j<=127){SelectScreE(2);SetColumn(j);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<2;i++) //读6个字节回来{tab[i]=~ReadByte();j++; }SetLine(lin);SetColumn((column<<3)-(column<<1));for(i=0;i<2;i++)WriteByte(tab[i]);}if(j>=128){ column=column-21; //计算字列SelectScreE(3); //显示右屏SetColumn(column);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<4;i++) //读6个字节回来 {tab[i]=~ReadByte();j++;}SetLine(lin);SetColumn((column<<3)-(column<<1));for(i=0;i<4;i++)WriteByte(tab[i]);}}/* //第22-31个字列--对于192*64屏else if(21<column&&column<=31){ SelectScreE(3);column=column-22;SetColumn((column<<3)-(column<<1)+4);SetLine(lin);tab[0]=ReadByte();for(i=0;i<6;i++)tab[i]=~ReadByte();SetLine(lin);SetColumn((column<<3)-(column<<1)+4);for(i=0;i<6;i++)WriteByte(tab[i]);}*/}//******************************************************************* ***********//反显某行某几个字符 LCD19264//lin:行(0-7), column: 列(0-15)void ReverseLinChar(unsigned char lin,unsigned char startcolumn,unsigned char ShowQuantity){ unsigned char i;for(i=0;i<ShowQuantity;i++){if(startcolumn+i>21) //列地址大于21返回return;ReverseShow86(lin,startcolumn+i);}}//******************************************************************* ***********。

LCD12864显示程序

LCD12864显示程序

本例程为【2 】经由过程用AT89C52芯片操作LCD12864显示的程序,应用的晶振为12M./**********************************************************程序解释:LCD12864显示主程序程序调试员:莫剑辉调试时光:2010-6-7**********************************************************/#include<reg52.h>#include"12864.c"void main(){Ini_Lcd(); //液晶初始化子程序Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序while(1);}这里我们经由过程挪用下面的头文件就可以了,如许的做法便利我们今后要用到LCD12864的程序的挪用./**********************************************************程序解释:LCD12864显示头文件程序调试员:莫剑辉调试时光:2010-6-7**********************************************************///#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DATA P2 //数据输出端0~7sbit 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<x;j++){for(i=0;i<120;i++); //延时X乘以120}}/********************************************* 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到DATADelay_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到DATADelay_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); //写入地址敕令到LCD12864while(i) //写入显示数据的大小{Write_Data(*(z++)); //写入显示数据到LCD12864i--;}}/********************************************* 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); //消除显示}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

/**********************************************************
程序说明:LCD12864显示主程序
程序调试员:莫剑辉
调试时间:2010-6-7
**********************************************************/
#include<reg52.h>
#include"12864.c"
void main()
{
Ini_Lcd(); //液晶初始化子程序
Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序
while(1);
}
这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。

/**********************************************************
程序说明:LCD12864显示头文件
程序调试员:莫剑辉
调试时间:2010-6-7
**********************************************************/
//#include<reg52.h>
#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<x;j++)
{
for(i=0;i<120;i++); //延时X乘以120
}
}
/*********************************************
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为写
DA TA=k; //输入数据K到DA TA
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为写
DA TA=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); //清除显示
}。

相关文档
最新文档