关于单片机液晶屏LCD12864的程序

关于单片机液晶屏LCD12864的程序,第1张

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

*程序名称:带汉字库的12864液晶显示模块驱动

*程序功能:显示字符 、汉字和图片

*开发工具:Kile

* MCU型号:AT89S52-24PU

*时钟频率:11.0592MHZ

*程序作者:yuan

*版权说明:yuan

*****************************************************************/改胡毕

#include<reg52.h>

#include "lcd.h"

#include "util.h"

sbit E=P1^5//脉冲使能

sbit RW=P1^6//读写选择

sbit RS=P1^7//数据命令选择

sbit rst=P3^6//12864复位

// 延时ms函数:

// 12864检查状态函数:

void Check12864State(void)

{

P0=0xff

E=0//读状态前核芹三控制线的状态

RS=0

RW=1

E=1//拉高,读状态

while((P0&0x80)==0x80)//等待空闲

E=0//写命令后三控制线的状态

RS=1

RW=0

}

// 12864写命令函数:

void Write12864Command( unsigned char com)

{

Check12864State()//检查状态

P0=com//赋值

E=0//写命令前三控制线的状态

RS=0

RW=0

E=1//拉高,写命令

E=0//写命令后三控制线的状态

RS=1

RW=1

}

//12864写数据函数:

void Write12864Data( unsigned char dat)

{

Check12864State()//检查状态

P0=dat//赋值

E=0//写数据前三控制线的状态

RS=1

RW=0

E=1//拉高,写数据

E=0//写数据后三控制线的状态

RS=0

RW=1

}

//在指定的位置显示字符串(汉字和ASCII码字符)函数:

void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)

//y-行数值0-3,x-列数值0-7,pstr-字符串指针

//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字

//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符

//为了实现自动换行功能,这个函数比较繁琐

{

unsigned char row,n=0

Write12864Command(0x30)//基本指令

Write12864Command(0x06)//地址计数器自动加以,光标右移

switch(y)//根据行号选择行地址

{

case 0:row=0x80break//第一行首地址

case 1:row=0x90break//第二行首地址

case 2:row=0x88break//第三行首地址

case 3:row=0x98break//第四行首地址

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()

{

unsigned char i,j

Write12864Command(0x34)//功能设定:8位控制方式,使用扩充指令

Write12864Command(0x36)//使用扩充指令,绘图显示控制

for(i=0i<32i++)

//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址相同第1行和第33行同属一行,以此类推

{

Write12864Command(0x80|i)//写行地址(垂直地址)

Write12864Command(0x80)//写列地址(水平地址)

for(j=0j<32j++)

Write12864Data(0x00)//清屏

}

}

//在任意位置显示任意大小的图片函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-图片宽度,py-图片高度,pp-指针指向图片数组

//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐

{

unsigned char i,j,k

Clear12864Screen()//清屏

if(y<32)//如果起始行在上半屏

{

k=32-y//算出上半屏的行数

for(i=0i<ki++,y++)//上半屏行数

{

Write12864Command(0x80|y)//写行地址(垂直地址)

Write12864Command(0x80|x)//写列地址(水平地址)

for(j=0j<px/8j++)

Write12864Data(pp[i*px/8+j])//写图片数据

}

y=0//下半屏起始行,接上半屏继续写数据

for(i<pyi++,y++)//下半屏剩下的行数

{

Write12864Command(0x80|y)//写行地址(垂直地址)

Write12864Command(0x80|(8+x))//写列地址(水平地址)

for(j=0j<px/8j++)

Write12864Data(pp[i*px/8+j])//写图片数据

}

}

else //如果起始行在下半屏

{

for(i=0i<pyi++,y++)//行数

{

Write12864Command(0x80|(y-32))//写行地址(垂直地址)

Write12864Command(0x80|(8+x))//写列地址(水平地址)

for(j=0j<px/8j++)

Write12864Data(pp[i*px/8+j])//写图片数据

}

}

}

void Clear12864Text()

{

Write12864Command(0x34)//清屏

DelayMs(5)

Write12864Command(0x30)//清屏

DelayMs(5)

Write12864Command(0x01)//清屏

DelayMs(5)

}

//12864初始化函数:

void Initialize12864()

{

rst=0//复位12864

DelayMs(30)

rst=1

DelayMs(20)

Write12864Command(0x30)//功能设定:8位控制方式,使用基本指令

Write12864Command(0x08)//显示关

Write12864Command(0x01)//清屏

Write12864Command(0x06)//地址计数器加一、光标右移

Write12864Command(0x0c)//显示开

}

带字库的驱动

#include <reg52.h>

#include <intrins.h>

#define uint unsigned int

#define uchar unsigned char

#define Nop() _nop_()

/*引脚端口定义*/

sbit LCD12864_RS_PORT = P1^7 /*LCD12864引脚定义*/

sbit LCD12864_RW_PORT = P1^6

sbit LCD12864_E_PORT= P2^3

#define LCD12864_DA_PORT P0

sbit led_en_port = P2^5/*发光二极管寄存器LE引脚*/

sbit sled_en_port = P3^6/*数码管寄存器LE引脚*/

uchar hanzi_buff1[]={" 液晶显示 "}

//////////////////以下是LCD12864驱动程序////////////////

void LCD12864_WaitIdle()

//LCD12864 忙 信号检测

{

LCD12864_DA_PORT = 0xff

LCD12864_RS_PORT = 0

LCD12864_RW_PORT = 1

LCD12864_E_PORT = 1

while((LCD12864_DA_PORT&0x80)==1)/*等待BF 不为困春哗1*/

LCD12864_E_PORT = 0

}

void LCD12864_COM_Write( uchar com_da)

/* 检测忙信号写入命令字

com_da 为待写入的命令字*/

{

LCD12864_WaitIdle()

LCD12864_RS_PORT = 0

LCD12864_RW_PORT = 0

LCD12864_DA_PORT = com_da

LCD12864_E_PORT = 1

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

LCD12864_E_PORT = 0

}

void LCD12864_NoWaitIdle_COM_Write(uchar com_da)

/* 不检测忙信号写森中入命令字

com_da 为待写入的命令汪行字*/

{

LCD12864_RS_PORT = 0

LCD12864_RW_PORT = 0

LCD12864_DA_PORT = com_da

LCD12864_E_PORT = 1

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

LCD12864_E_PORT = 0

}

void LCD12864_Data_Write(uchar da)

/* 数据写入

da 为待写入的8位数据*/

{

LCD12864_WaitIdle()/*检测忙信号*/

LCD12864_RS_PORT = 1

LCD12864_RW_PORT = 0

LCD12864_DA_PORT = da

LCD12864_E_PORT = 1

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

Nop()

LCD12864_E_PORT = 0

}

void lcd_delay_ms(uchar x)

{

uchar j

while(x--){

for(j=0j<125j++)

{}

}

}

void LCD12864_Reset()

/*LCD12864初始化*/

{

lcd_delay_ms(100)/*适当延时待LCD自动复位完成*/

LCD12864_NoWaitIdle_COM_Write(0x30)/*使用8位并口通讯*/

lcd_delay_ms(10)

LCD12864_NoWaitIdle_COM_Write(0x30)/*使用8位并口通讯*/

lcd_delay_ms(10)

LCD12864_NoWaitIdle_COM_Write(0x0c)/*显示开及光标设置*/

lcd_delay_ms(10)

LCD12864_NoWaitIdle_COM_Write(0x01)/*显示清屏*/

lcd_delay_ms(30)

LCD12864_NoWaitIdle_COM_Write(0x06)/*DDRAM的地址计数器(AC)加1*/

lcd_delay_ms(30)

}

void LCD12864_HANZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL)

//ST7920 汉字字符写入

//参数说明: xpos 待写入的X位置

//ypos 待写入的Y位置

//daH 待写入的汉字的高八位 daL待写入的汉字的低八位

{

uchar xy_pos

if((xpos>=8)||(ypos>=4) ) return/*X位置超出显示范围退出*/

if(ypos==0) xy_pos = 0x80 + xpos

else if(ypos==1) xy_pos = 0x90 + xpos/*计算转换地址*/

else if(ypos==2) xy_pos = 0x88 + xpos

else if(ypos==3) xy_pos = 0x98 + xpos

LCD12864_COM_Write(xy_pos)/*写地址*/

lcd_delay_ms(1)

LCD12864_Data_Write(daH)/*写高八位数据*/

lcd_delay_ms(1)

LCD12864_Data_Write(daL)/*写低八位数据*/

lcd_delay_ms(1)

}

//////////////////以上是LCD12864驱动程序////////////////

void main()

{

uchar i

LCD12864_Reset()/*LCD初始化*/

LCD12864_DA_PORT = 0xff /*释放P0端口*/

led_en_port = 0/*关闭发光二极管显示*/

sled_en_port = 0/*关闭数码管显示*/

while(1)

{

for (i=0i<6i++)

LCD12864_HANZI_WRITE(i,0,hanzi_buff1[i*2],hanzi_buff1[i*2+1])

}

}

要注意,你说的通用型其实并不通用,LCD模块中使用不同的控制器,其控制方法都不同!所有枣山的LCD模块含岩液都在Optoelectronics大类下。

1602是LM016L;

12232有好几种:

AGM1232G DISPLAY122x32 Graphical LCD with SED1520 controllers

EW12A03GLY DISPLAY122x32 Graphical LCD with SED1520 controllers

HDM32GS12-B DISPLAY122x32 Graphical LCD with SED1520 controllers, LED Backlight

HDM32GS12Y-3 DISPLAY122x32 Graphical LCD with SED1520 controllers, Selectable Interface, VAC LED Backlight

12864也有好几谈物种:

AMPIRE128X64DISPLAY128x64 Graphical LCD with KS0108 controllers

HDG12864F-1 DISPLAY128x64 Graphical LCD with SED1565 controller, Serial data input

HDG12864F-3 DISPLAY128x64 Graphical LCD with SED1565 controller, Parallel data input

HDG12864L-4 DISPLAY128x64 Graphical LCD with SED1565 controller, Parallel data input, LED Backlight

HDG12864L-6 DISPLAY128x64 Graphical LCD with SED1565 controller, Selectable Interface, LED Backlight

LGM12641BS1R DISPLAY128x64 Graphical LCD with KS0108 controllers

LM3228 DISPLAY128x64 Graphical LCD

LM4228 DISPLAY128x64 Graphical LCD

LM4265 DISPLAY128x128 Graphical LCD

PG128128A DISPLAY128x128 Graphical LCD Display

PG12864F DISPLAY128x64 Graphical LCD Display

TG126410GFSBDISPLAY128x66 Graphical LCD with SED1565 controllers, Bottom View


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12238524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存