LCD12864的驱动
51单片机LCD_12864驱动
![51单片机LCD_12864驱动](https://img.taocdn.com/s3/m/8db8716addccda38376bafa3.png)
LCD_RST=0; //复位
delay(1); //延时
LCD_RST=1; //复位置高
delay(10);
}
/*********************************************************
* *
* 清屏函数 *
/* */
/* LCD初始化设定 */
/* */
* *
*********************************************************/
void LCD_ClearScreen()
{
LCD_wcmd(0x34); //扩充指令操作
lcd_delay(5);
LCD_wcmd(0x30); //基本指令操作
lcd_delay(5);
LCD_wcmd(0x01); //清屏
lcd_delay(5);
}
/*******************************************************************/
LCD_wcmd(0x30); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(100); //大于100uS的延时程序
LCD_wcmd(0x30); //Function Set
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
lcd_delay(3);
LCD12864驱动源代码
![LCD12864驱动源代码](https://img.taocdn.com/s3/m/e45c08d77f1922791688e853.png)
Transfer_command(0xa0); /*列扫描顺序:从左到右*/
Transfer_command(0xaf); /*开显示*/
clear_screen();
}
//===============clear all dot martrics=============
Transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高4 位
Transfer_command(column&0x0f); //设置列地址的低4 位
}
/*=========延时=====================*/
void Delay(int i)
{
char i;
CS_0(); //CS_PIN=0
RS_0(); //CS_PIN=0
for(i=0;i<8;i++)
{
SCLK_0();
if(data1&0x80) DIN_1();
else DIN_0();
SCLK_1();
data1=data1<<=1;
void Initial_Lcd()
{
RST_0(); //reset=0
P2DIR |=RST_PIN | SPI_MOSI_PIN| SPI_CLK_PIN|RS_PIN|CS_PIN ;
Delay(50);
RST_1(); //reset=1
Delay(50);
{
CS_0(); //CS_PIN=0
LCD12864的驱动
![LCD12864的驱动](https://img.taocdn.com/s3/m/dbcab8c0da38376baf1faeb2.png)
LCD12864驱动LCD12864在市面上主要分为两种,一种是采用st7920控制器的,它一般带有中文字库字模,价格略高一点。
另一种是采用KS0108控制器,它只是点阵模式,不带字库。
很可惜,我的这块就是KS0108控制器不带汉字库的,不过不打算用它专门显示文本,也就无所谓了。
LCD12864模块的20个引脚定义如下:1。
Vss 逻辑电源地2。
VDD 逻辑电源正5v3。
V0 LCD驱动电压4。
RS 数据/指令选择:高电平为数据,低电平为指令5。
R/W 读/写选择:高电平为读数据,低电平为写数据6。
E 读写使能,高电平有效,下降沿锁定数据7。
DB0 数据输入输出引脚8。
DB1 数据输入输出引脚9。
DB2 数据输入输出引脚10。
DB3 数据输入输出引脚11。
DB4 数据输入输出引脚12。
DB5 数据输入输出引脚13。
DB6 数据输入输出引脚14。
DB7 数据输入输出引脚15。
CS1 片选择号,低电平时选择前64列16。
CS2 片选择号,低电平时选择后64列17。
RET 复位信号,低电平有效。
18。
VEE 输出-15v电源给V0提供驱动电源19。
A 背光电源LED正极20。
K 背光电源LED负极具体电路图如下:制做如下:接口说明:装上12864具体的电路还是两个电阻。
一个背光限流电阻。
一个液晶驱动电压调节电阻。
背光电阻还是任何时候在19、20脚与电源之间串上个100欧电位器接上电源。
调节电位器到合适亮度。
具体值最好是到调试完程序能够正常显示后再将阻值确定换成固定电阻。
液晶驱动电压的调整在数据线、电源线接好的前提下是在Vee(-15v)和地之间接一个电位器。
中间接V0,通过调节电位器来调节V0上的电压。
当V0上为-15V时为全暗(液晶显示为全黑)。
当V0为0V 时为全亮。
调节电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。
待屏幕显示正常后,进行对比度的细调,然后测量这两边的阻值在地和V0之间、V0和Vee之间换成两个固定电阻焊上就好了。
LCD12864(T6963)驱动程序
![LCD12864(T6963)驱动程序](https://img.taocdn.com/s3/m/96cb4f3dcec789eb172ded630b1c59eef8c79ab2.png)
液晶显示模块的应用一、结构特点内藏T6963C 的液晶显示模块上已经实现了T6963C 与行、列驱动器及显示缓冲区RAM 的接口,同时也已用硬件设置了液晶屏的结构(单双屏、数据传输方式、显示窗口长度、宽度等等。
我们常用的液晶显示模块一般都是单屏结构,因此我们这里只讨论单屏结构的液晶显示模块。
内藏T6963C 的单屏结构点阵图形液晶显示模块的方框图如下:二、T6963C 的特点(1) T6963C 是点阵式液晶图形显示控制器它能直接与8 位微处理器接口;(2) T6963C 的字符字体可由硬件或软件设置,其字体有4 种5X8 、6X8、7X8、8X8;(3) T6963C 的占空比可从1/16 到1/128;(4) T6963C 可以图形方式、文本方式及图形和文本合成方式进行显示,以及文本方式下的特征显示,还可以实现图形拷贝操作等等;(5) T6963C 具有内部字符发生器CGROM,共有128 个字符。
T6963C 可管理64K显示缓冲区及字符发生器CGRAM,并允许MPU 随时访问显示缓冲区,甚至可以进行位操作。
三、该类液晶模块的管脚定义见下表:说明:对于单电源模块,标志为V0/POFF。
当该管脚为高或悬空时,内部DC/DC功能开启;为低时,内部DC/DC 功能关闭。
该功能可用作屏幕保护和休眠方式。
如果用其直接替代双电源模块,该管脚直接悬空即可。
四、液晶显示模块的供电说明1. 如果您所选用的液晶模块是双电源(VDD/V0)供电的就需要提供一个负电压(液晶驱动电压V0/VEE),用以调节对比度,接在液晶模块的V0 引脚上。
因为液晶材料的物理特性,液晶的对比度会随着温度的变化而相应变化,所以,您加的负电压值应该随温度作相应的调整,大致是温度变化10°C 电压变化1伏左右。
为满足这一要求您要选择较大值的负电源,然后做一个温度补偿电路,或者安排一个电位器调整负电压值。
例如对于QH12864T-HT-LED04,当室温(VDD=5V)时,V0=-10.5V,如果要用到-20°C,液晶驱动电压将要变到V0=-14.5V,再考虑到负载消耗所以您提供的负电源应该为-16V 左右。
lcd12864 绘图功能实现驱动
![lcd12864 绘图功能实现驱动](https://img.taocdn.com/s3/m/25f763748e9951e79b892783.png)
} i = 0x80; for(j = 0;j < 32;j++) { Write_Cmd(i++); Write_Cmd(0x88); for(k = 0;k < 16;k++) { Write_Data(*ptr++); } } Write_Cmd(0x36); Write_Cmd(0x30); //打开绘图显示 //回到基本指令集
} /******************************************* 函数名称:Draw_TX 功 能:显示一个 16*16 大小的图形 参 数:Yaddr--Y 地址 Xaddr--X 地址 dp--指向图形数据存放地址的指针 返回值 :无 ********************************************/ void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) { uchar j; uchar k=0; Write_Cmd(0x01); //清屏,只能清除 DDRAM Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示 for(j=0;j<16;j++) { Write_Cmd(Yaddr++); //Y 地址 Write_Cmd(Xaddr); //X 地址
本文作者:林子木 本人学历有blog/item/48bff5dbb38e452332fa1ce4.html 的补充,是基于 430 的实现,很简单的可以移植到 51 上去
如果想具体的实现,请先看上面网址的文章
} /******************************************* 函数名称:Delay_Nms 功 能:延时 N 个 1ms 的时间 参 数:n--延时长度 返回值 :无 ********************************************/ void Delay_Nms(uint n) { uint i; for(i = n;i > 0;i--) Delay_1ms();
LCD12864驱动程序(带字库的)
![LCD12864驱动程序(带字库的)](https://img.taocdn.com/s3/m/853ab001b52acfc789ebc9fb.png)
{
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;
液晶12864的驱动(带注释)
![液晶12864的驱动(带注释)](https://img.taocdn.com/s3/m/c4945a45f7ec4afe04a1df5f.png)
//写主函数的时候直接调用以下部分子函数就行了#include<reg51.h>#include"intrins.h"#define uint unsigned int#define uchar unsigned char#define LCD_data P0sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;sbit lcd_en=P2^7;sbit lcd_psb=P3^2; //串/并方式控制sbit lcd_rst=P3^7; //液晶复位端口void delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=120;j>0;j--);}void delay_nop(){_nop_();_nop_();_nop_();_nop_();}/* 以下是lcd忙碌检查函数,result为1时,忙;* result为0时,闲;可写指令与数据。
*/bit lcd_busy(){bit result;lcd_rs=0;lcd_rw=1;lcd_en=1;delay_nop();result=(bit)(P0&0x80);lcd_en=0;return(result);}/**** 以下是写指令函数**** */void lcd_wcmd(uchar cmd){while(lcd_busy());lcd_rs=0;lcd_rw=0;lcd_en=0;_nop_();_nop_();P0=cmd;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下是写数据函数**** */void lcd_wdat(uchar dat){while(lcd_busy());lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下lcd初始化函数**** */void lcd_init(){lcd_psb=1;lcd_rst=0;delay_ms(3);lcd_rst=1;delay_ms(3);lcd_wcmd(0x34);delay_ms(5);lcd_wcmd(0x30); //基本指令操作delay_ms(5);lcd_wcmd(0x0c); //显示开,关光标delay_ms(5);lcd_wcmd(0x01); //清楚lcd显示的内容delay_ms(5);}/**** 以下是lcd清屏函数**** */void lcd_clr(){lcd_wcmd(0x01);delay_ms(5);}/* 以下是设定显示位置函数* 变量X表示行,Y表示列**/void lcd_pos(uchar x,uchar y){uchar pos;if(x==1) {x=0x80;}else if(x==2) {x=0x90;}else if(x==3) {x=0x88;}else if(x==4) {x=0x98;}pos=x+y;lcd_wcmd(pos);}/* 以下是设定显示位置函数* 变量i表闪烁次数*/void flash(uint i){delay_ms(1000);for(;i>0;i--){lcd_wcmd(0x08); //关闭显示delay_ms(500);lcd_wcmd(0x0c); //开显示delay_ms(500);}}。
LCD12864液晶驱动编程指南
![LCD12864液晶驱动编程指南](https://img.taocdn.com/s3/m/1e56f327453610661ed9f47b.png)
二、显示图片
显示图片和显示汉字的原理是一样的, 只不过是大小的问题! 现在我们就以一张 128*64 分辨率的图片进行取模。 取模图片:
现在我们主要看一下显isplay_BMP(uchar a[][64])//显示图形的左边部分 { uchar i,j; for(j=0;j<8;j++) { SelectScreen(1); Set_page(j); Set_column(0); for(i=0;i<64;i++) //显示左屏 { write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据 } SelectScreen(2); Set_page(j); Set_column(0); for(i=0;i<64;i++) //显示右屏 { write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据 } } } 取出图片的数据是二维数组形式!注意,液晶是先显示左半屏,再显示右半屏, 但 是取数组中的元素是逐个往下取出的, 所以是对于一个半屏而言, 每隔一行取数组中的元素, 而隔去的那一行是另一个半屏要取的数据!这一点一定要注意。 还有一点要补充的就是,这个取模软件只能识别 BMP 和 ICO 格式的单色图片,如果我 们选择的图片不是 128*64 大小的话, 可以通过软件将其改成 128*64 大小的, 如果我们直接 用软件取模的话,显示的会是乱码,解决办法是我们可以通过 windows 自带的画图工具, 什么也不做修改,将大小设置好的图片另存为 BMP 单色文件就行了,然后再用取模软件取 模就 OK 了,=^_^ = !算了,给大家截个图
LCD_databusrite_LCD_command(column);//列位置 } void SetOnOff(uchar onoff) //显示开关 函数:0x3E 是关显示,0x3F 是开显示 { onoff=0x3e|onoff; //0011 111x,onoff 只能为 0 或者 1 write_LCD_command(onoff); } void SelectScreen(uchar screen) //选屏 { switch(screen) { case 0: CS1=0;CS2=0;break; //全屏 case 1: CS1=0;CS2=1;break;//左半屏 case 2: CS1=1;CS2=0;break;//右半屏 default:break; } } void ClearScreen(uchar screen) { uchar i,j; SelectScreen(screen); for(i=0;i<8;i++)//控制页数 0-7,共 8 页 { Set_page(i); Set_column(0); for(j=0;j<64;j++) //控制列数 0-63,共 64 列 { write_LCD_data(0x00); //写入 0,地址指针自加 1 } } } void InitLCD() { Read_busy(); SelectScreen(0); SetOnOff(0); //关显示 SelectScreen(0); SetOnOff(1); //开显示 SelectScreen(0); //LCD 的初始化 } void main() { InitLCD(); ClearScreen(0); Set_line(0); Display(1,0,2*16,huan);//欢 Display(1,0,3*16,ying);//迎 Display(2,0,0*16,fang);//访 Display(2,0,1*16,wen);//问 Display(1,2,0*16,da);//大 Display(1,2,1*16,hai);//海 Display(1,2,2*16,xiang);//橡 Display(1,2,3*16,shu);//树 Display(2,2,0*16,bai);//百 Display(2,2,1*16,du);//度 Display(2,2,2*16,kong);//空 Display(2,2,3*16,jian);//间 While(1); } //初始化 //清屏 //显示开始行 } //清屏 据输出 { write_LCD_data(p[i+16]); //汉字的下半部分 上半部分 } Set_page(page+1); //写下半页 Set_column(column); for(i=0;i<16;i++) //控制列 //控制 16 列的数 } void Display(uchar ss,uchar page,uchar column,uchar *p) { uchar i; SelectScreen(ss); Set_page(page); for(i=0;i<16;i++) 的数据输出 { write_LCD_data(p[i]); //汉字的 //写上半页 //控制 16 列 Set_column(column); //控制列 //显示汉字 ClearScreen(0);//清屏 Set_line(0); //开始行:0
LCD12864驱动程序(STM32F103RCT6)
![LCD12864驱动程序(STM32F103RCT6)](https://img.taocdn.com/s3/m/d270e00c0740be1e650e9a85.png)
CS_LOW; RS_DATA; for(i=0;i<8;i++) {
SCLK_LOW; if(data&0x80) {
SDA_HI; } else {
SDA_LOW; } SCLK_HI; data <<= 1; } } /************************************************************************ 函 数 名:void JLX12864_Init(void) 功 能:12864 初始化 入口参数:无 返 回 值:无 说 明: 作 者:Joe 日 期:2015/1/13 16:33:38 修 改:XX 修改说明:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
************************************************************************/ void JLX12864_Init(void) {
GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);
/************************************************************************ 函 数 名:JLX12864_ClearScreen(void) 功 能:清屏 入口参数:无 返 回 值:无 说 明: 作 者:Joe 日 期:2015/1/13 16:33:38 修 改:XX 修改说明:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ************************************************************************/ void JLX12864_ClearScreen(void) {
LCD12864 并口液晶驱动
![LCD12864 并口液晶驱动](https://img.taocdn.com/s3/m/26da1893fd0a79563c1e7247.png)
#include "LCD12864.h"/*原程序参考于网络,原作者不明,liangjin2807修改适用于MSP430单片机,驱动MGLS12864液晶屏,HD61202芯片*/typedef unsigned char uchar;typedef unsigned int uint;uchardigital[21][16]={{0x00,0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x0F,0x1F,0x30,0x20,0x30,0x1F, 0x0F},/*"0",0*/{0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x3F,0x20,0x20,0x00},/*"1",1*/ {0x00,0x70,0x78,0x08,0x08,0x88,0xF8,0x70,0x00,0x30,0x38,0x2C,0x26,0x23,0x31,0x30},/*"2",2* /{0x00,0x30,0x38,0x88,0x88,0xC8,0x78,0x30,0x00,0x18,0x38,0x20,0x20,0x31,0x1F,0x0E},/*"3",3* /{0x00,0x00,0xC0,0xE0,0x30,0xF8,0xF8,0x00,0x00,0x07,0x07,0x24,0x24,0x3F,0x3F,0x24},/*"4",4*/ {0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x19,0x39,0x21,0x20,0x31,0x1F,0x0E},/*"5",5*/ {0x00,0xE0,0xF0,0x98,0x88,0x98,0x18,0x00,0x00,0x0F,0x1F,0x31,0x20,0x31,0x1F,0x0E},/*"6",6*/ {0x00,0x38,0x38,0x08,0xC8,0xF8,0x38,0x08,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00},/*"7",7*/ {0x00,0x70,0xF8,0x88,0x08,0x88,0xF8,0x70,0x00,0x1C,0x3E,0x23,0x21,0x23,0x3E,0x1C},/*"8",8* /{0x00,0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x00,0x31,0x33,0x22,0x33,0x1F,0x0F},/*"9",9*/ {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/*"A",0* /{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},/*"B",1*/ {0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*"C",2* /{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},/*"D",3*/ {0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},/*"E",4*/ {0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},/*"F",5*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",6*/ {0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*":",7*/ {0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00},/*"/",8* /{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",9*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*"-",10 */};/*"*",12*//**************宏定义***************/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = P6.3#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = P6.4#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = P6.5#define SET_EN P6OUT|=BIT5;#define CLR_CS1 P6OUT&=~BIT0; //RW = 6.0#define SET_CS1 P6OUT|=BIT0;#define CLR_CS2 P6OUT&=~BIT1; //EN = 6.1#define SET_CS2 P6OUT|=BIT1;/***********************************************函数名称:DispStr功能:让液晶从某个位置起连续显示一个字符串参数:x--位置的列坐标y--位置的行坐标ptr--指向字符串存放位置的指针返回值:无***********************************************/void DispStr(uchar x,uchar y,uchar *ptr){uchar *temp;uchar i;temp = ptr;//计算字符串有效字符的个数LocateXY( x, y );for (i=0;i<64;i++) //连续显示4个16*16字符{LcdWriteData( temp[i] );}}/***********************************************函数名称:DispDigital功能:让液晶从某个位置显示一个数字,上列数组寻址方式,不建议使用参数:x--位置的列坐标y--位置的行坐标返回值:无***********************************************/void DispDigetal(uchar x,uchar y,uchar n){uchar i;uchar x_1;if(x<64){LcdChoiceL();LocateXY( x, y );for (i=0;i<8;i++)LcdWriteData( digital[n][i] );LocateXY( x, y+1 );for (i=8;i<16;i++)LcdWriteData( digital[n][i] );}else{x_1=x-64;LcdChoiceR();LocateXY( x_1, y );for (i=0;i<8;i++)LcdWriteData( digital[n][i] );LocateXY( x_1, y+1 );for (i=8;i<16;i++)LcdWriteData( digital[n][i] );}}/*********************************************** 函数名称:DispHex功能:让液晶从某个位置显示四个十六进数字参数:x--位置的列坐标y--位置的行坐标ptr--指向字符串存放位置的指针返回值:无***********************************************/ void DispHex(uchar x,uchar y,uint temp){uchar n;n=temp/0x1000;DispDigetal(x,y,n);n=(temp/0x100)%0x10;DispDigetal(x+8,y,n);n=(temp/0x10)%0x10;DispDigetal(x+16,y,n);n=temp%0x10;DispDigetal(x+24,y,n);}/*******************************************函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x--位置的列坐标y--位置的行坐标返回值:无********************************************/ void LocateXY(uchar x,uchar y){uchar tempx;uchar tempy;tempx=x|0x40;tempy=y|0xb8;LcdWriteCommand(tempx,1);LcdWriteCommand(tempy,1);}/*******************************************函数名称:DispNChar功能:在某个位置显示一个字符12864参数:x--位置的列坐标y--位置的行坐标n--显示的字个数data--显示的字符数据返回值:无********************************************/void DispNChar(uchar x,uchar y,uchar n,uchar (*ptr)[64]) { uchar i;uchar x_1;for(i=0;i<(16*n);i++)//输入总共的字符数{if(x<64){LcdChoiceL();//指定左屏LocateXY( x, y );//定位地址LcdWriteData( *(*ptr+i) );LocateXY( x, y+1 );LcdWriteData( *(*(ptr+1)+i) );}else {if(x<128)//如果64<X<128,则选择右屏{x_1=x-64;LcdChoiceR();LocateXY( x_1, y );LcdWriteData( *(*ptr+i) );LocateXY( x_1, y+1 );LcdWriteData( *(*(ptr+1)+i) );}else {x=0;y+=2;if(y<8){LcdChoiceL();LocateXY( x, y );LcdWriteData( *(*ptr+i) );LocateXY( x, y+1 );LcdWriteData( *(*(ptr+1)+i) );}else{y=0;LcdChoiceL();LocateXY( x, y );LcdWriteData( *(*ptr+i) );LocateXY( x, y+1 );LcdWriteData( *(*(ptr+1)+i) );}}}x++;}}/******************************************* 函数名称:LcdChoiceL功能:对12864液晶模块左侧参数:无返回值:无********************************************/ void LcdChoiceL(void){SET_CS2;//片选命令,选择左侧CLR_CS1;}/*******************************************函数名称:LcdChoiceR功能:对12864液晶模块右侧参数:无返回值:无********************************************/void LcdChoiceR(void){SET_CS1;//片选命令,选择右侧CLR_CS2;}/*******************************************函数名称:LcdStop功能:对12864液晶模块禁止参数:无返回值:无********************************************/void LcdStop(void){SET_CS1;//片选命令,禁止SET_CS2;}/*******************************************函数名称:LcdReset功能:对12864液晶模块进行复位操作参数:无返回值:无********************************************/void LcdReset(void){CtrlDir |= 0x3B; //控制线端口设为输出状态DataDir = 0xFF; //数据端口设为输出状态LcdChoiceL();//选择右侧LcdWriteCommand(0x3f, 1); //设置显示屏数据开LcdWriteCommand(0xc0, 1);//设置显示屏0行为第一行//LcdWriteCommand(0x40, 1);//设置显示屏0列为第一列/*_NOP();_NOP();_NOP();*/Delay5ms();LcdChoiceR();//选择左侧LcdWriteCommand(0x3f, 1); //设置显示屏数据开LcdWriteCommand(0xc0, 1);//设置显示屏0行为第一行//LcdWriteCommand(0x40, 1);//设置显示屏0列为第一列//显示模式设置}/*******************************************函数名称:LcdLine功能:改变lCD显示的第一行,从而实现滚屏效果参数:Line 取值0-63之间,增大向上滚,减小向下滚返回值:无********************************************/void LcdLine(uchar Line){if(Line<64){Line=Line+0xc0;LcdChoiceL();//选择右侧LcdWriteCommand(Line, 1);//设置显示屏0行为第一行//LcdWriteCommand(0x40, 1);//设置显示屏0列为第一列/*_NOP();_NOP();_NOP();*/Delay5ms();LcdChoiceR();//选择左侧LcdWriteCommand(Line, 1);//设置显示屏0行为第一行//LcdWriteCommand(0x40, 1);//设置显示屏0列为第一列}//显示模式设置}/*******************************************函数名称:LcdClear功能:对12864液晶模块屏幕清屏参数:无返回值:无********************************************/void LcdClear(void){ uchar k;uchar n;for(k=0;k<8;k++){for(n=0;n<64;n++){ LcdChoiceL();//选择左侧LocateXY( n,k );LcdWriteData(0x00);LcdChoiceR();//选择右侧LocateXY( n,k );LcdWriteData(0x00);}}}/*******************************************函数名称:LcdWriteCommand功能:向液晶模块写入命令12864参数:cmd--命令,chk--是否判忙的标志,1:判忙,0:不判返回值:无********************************************/void LcdWriteCommand(uchar cmd,uchar chk){if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort = cmd; //将命令字写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data--显示字符数据返回值:无********************************************/void LcdWriteData( uchar data ){WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();_NOP();_NOP();_NOP();DataPort = data; //将显示数据写入数据端口_NOP();_NOP();_NOP();_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;DataPort =0xff;}/*******************************************函数名称:WaitForEnable功能:等待12864液晶完成内部操作参数:无返回值:无********************************************/ void WaitForEnable(void){P2DIR &= 0x00; //将P2口切换为输入状态SET_RW;CLR_RS;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); //检测忙标志CLR_EN;P2DIR |= 0xFF; //将P2口切换为输出状态}/*******************************************函数名称:Delay5ms功能:延时约5ms参数:无返回值:无********************************************/void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/************************************************************函数名:LCD_Write_16X16Font*功能:写一个16X16的汉字*参数:x , y , c[2] x:0-83 y:0-5*返回值:无*备注:***********************************************************/void LCD_Write_16X16Font(unsigned char x,unsigned char y,unsigned char c[2]) {unsigned char i,k;if(x<64){LcdChoiceL();LocateXY(x,y);}else{LcdChoiceL();x=x-64;LocateXY(x,y);}for(k=0; k<70; k++) //K的值表示汉字库最多存放的字的数量(可改大){if((font16X16[k].Index[0]==c[0])&&(font16X16[k].Index[1]==c[1])){for(i=0; i<32; i++){LcdWriteData(font16X16[k].Msk[i]);if(i==16){y++;LocateXY(x,y);}}}}}/************************************************************函数名:DisplarString*功能:写一行的中文字符*参数:*返回值:无*备注:***********************************************************/void DisplarString(unsigned char x,unsigned char y,unsigned char n,unsigned char *MemuTemp) {uchar a,b,i,x_1,y_1;for(a=0;a<n*2;a+=2) //计数列,每列7个字符{for(b=0;b<70;b++) //50个字符内搜索需要显示的字符{if((font16X16[b].Index[0]==MemuTemp[a])&&(font16X16[b].Index[1]==MemuTemp[a+1])) //找到需要显示的字符,显示{if((a*8+x)<64){LcdChoiceL();x_1=a*8+x;y_1=y;}else{ if((a*8+x)<128){LcdChoiceR();x_1=a*8+x-64;y_1=y;}else{LcdChoiceL();x_1=a*8+x-128;y_1=y+2;}}LocateXY(x_1,y_1);for(i=0; i<32; i++){if(i==16) //如果已经传送16个字节,换行传送字符下半部分{LocateXY(x_1,y_1+1);}LcdWriteData(font16X16[b].Msk[i]);}break;}}}}/*******************************************函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息,按照像素点定位行参数:x--位置的列坐标y--位置的行坐标返回值:无********************************************/void LocateXY_1(uchar x,uchar y){uchar tempx;uchar tempy;tempx=x|0x40;tempy=y|0xC0;LcdWriteCommand(tempx,1);LcdWriteCommand(tempy,1);}/************************************************************函数名:DisplarString2*功能:写指定个数的汉字,按照像素点定位行*参数:x列数,y行数,n显示汉字个数,MemuTemp汉字字符串*返回值:无*备注:***********************************************************/void DisplarString2(unsigned char x,unsigned char y,unsigned char n,unsigned char *MemuTemp) {uchar a,b,i,x_1,y_1;for(a=0;a<n*2;a+=2) //计数列,每列7个字符{for(b=0;b<70;b++) //50个字符内搜索需要显示的字符{if((font16X16[b].Index[0]==MemuTemp[a])&&(font16X16[b].Index[1]==MemuTemp[a+1])) //找到需要显示的字符,显示{if((a*8+x)<64){LcdChoiceL();x_1=a*8+x;y_1=y;}else{ if((a*8+x)<128){LcdChoiceR();x_1=a*8+x-64;y_1=y;}else{LcdChoiceL();x_1=a*8+x-128;y_1=y+2;}}LocateXY_1(x_1,y_1);for(i=0; i<32; i++){if(i==16) //如果已经传送16个字节,换行传送字符下半部分{LocateXY_1(x_1,y_1+1);}LcdWriteData(font16X16[b].Msk[i]);}break;}}}}/************************************************************函数名:DisplarFont8x16_2*功能:写一行的指定个数的字母*参数:x列数,y行数,n显示汉字个数,MemuTemp汉字字符串*返回值:无*备注:***********************************************************/void DisplarFont8x16_2(unsigned char x,unsigned char y,unsigned char d,unsigned char *MemuTemp){uchar a,b,i,x_1,y_1;uchar n;n=d*8;for(a=0;a<n;a++) //计数列,每列7个字符{if((a*8+x)<64) //判断是否在左侧屏幕{LcdChoiceL(); //选择左侧x_1=a*8+x; //定位坐标y_1=y;}else{ if((a*8+x)<128) //在右侧屏幕{LcdChoiceR();x_1=a*8+x-64;y_1=y;}else //超出右侧屏幕{if(a*8+x-128<64){LcdChoiceL(); //选择左侧屏幕x_1=a*8+x-128;y_1=y+2; //行下移一行}else{if(a*8+x-192<64){LcdChoiceR(); //选择右侧侧屏幕x_1=a*8+x-192;y_1=y+2; //行下移一行}}}}LocateXY(x_1,y_1);for(b=0;b<94;b++) //50个字符内搜索需要显示的字符{if(font8x16[b][0]==MemuTemp[a]) //找到需要显示的字符,显示{for(i=1; i<17; i++){if(i==9) //如果已经传送16个字节,换行传送字符下半部分{LocateXY(x_1,y_1+1);}LcdWriteData(font8x16[b][i]);}break;}}}}/************************************************************函数名:DisplarFont8x16*功能:写一行的字母*参数:*返回值:无*备注:***********************************************************/void DisplarFont8x16(unsigned char x,unsigned char y,unsigned char *MemuTemp) {uchar a,b,i,x_1,y_1;uchar n=0;while(MemuTemp[n]!='\0')n++;for(a=0;a<n;a++) //计数列,每列7个字符{if((a*8+x)<64) //判断是否在左侧屏幕{LcdChoiceL(); //选择左侧x_1=a*8+x; //定位坐标y_1=y;}else{ if((a*8+x)<128) //在右侧屏幕{LcdChoiceR();x_1=a*8+x-64;y_1=y;}else //超出右侧屏幕{if(a*8+x-128<64){LcdChoiceL(); //选择左侧屏幕x_1=a*8+x-128;y_1=y+2; //行下移一行}else{if(a*8+x-192<64){LcdChoiceR(); //选择右侧侧屏幕x_1=a*8+x-192;y_1=y+2; //行下移一行}}}}LocateXY(x_1,y_1);for(b=0;b<94;b++) //50个字符内搜索需要显示的字符{if(font8x16[b][0]==MemuTemp[a]) //找到需要显示的字符,显示{for(i=1; i<17; i++){if(i==9) //如果已经传送16个字节,换行传送字符下半部分{LocateXY(x_1,y_1+1);}LcdWriteData(font8x16[b][i]);}break;}}}}/************************************************************函数名:DisplarFont8x16Left*功能:写左侧一行的字母,y参数为1-4之间数字,字符组MemuTemp包含8个字符*参数:*返回值:无*备注:***********************************************************/void DisplarFont8x16Left(unsigned char y,unsigned char *MemuTemp){uchar a,b,i,x;y=2*y-2;uchar n=0;LcdChoiceL(); // 清除所选择行数据开始LocateXY( 0,y);for(n=0;n<64;n++)LcdWriteData(0x00);LocateXY( 0,y+1);for(n=0;n<64;n++)LcdWriteData(0x00); // 清除所选择行数据结束for(a=0;a<8;a++) //计数每行字节,每行7个字符{for(b=0;b<94;b++) //50个字符内搜索需要显示的字符{if(font8x16[b][0]==MemuTemp[a]) //找到需要显示的字符,显示{x=a*8; //计算LocateXY(x,y); //开始定位y 行0位上半部分for(i=1; i<17; i++){if(i==9) //如果已经传送16个字节,换行传送字符下半部分LocateXY(x,y+1); ////开始定位y 行0位下半部分LcdWriteData(font8x16[b][i]);}break;}}}}/*******************************************函数名称:LcdChoiceLine功能:对12864液晶指定行进行清除参数:无返回值:无********************************************/void LcdClearLine(uchar y){uchar n;LcdChoiceL();//选择左侧LocateXY( 0,y);for(n=0;n<64;n++)LcdWriteData(0x00);LocateXY( 0,y+1);for(n=0;n<64;n++)LcdWriteData(0x00);LcdChoiceR();//选择右侧LocateXY( 0,y);for(n=0;n<64;n++)LcdWriteData(0x00);LocateXY( 0,y+1);for(n=0;n<64;n++)LcdWriteData(0x00);}typedef struct{unsigned char Index[2];unsigned char Msk[32];}TYPE_FONT16X16;const TYPE_FONT16X16 font16X16[]={"宁",0x20,0x18,0x88,0x88,0x88,0x88,0x89,0x8E,0x88,0x88,0x88,0x88,0x88,0x28,0x18,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,"波",0x10,0x60,0x02,0x0C,0xC0,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00, 0x04,0x04,0x7C,0x03,0x80,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,"钢",0x20,0x10,0x2C,0xE7,0x24,0x24,0x00,0xFE,0x12,0x62,0x82,0x72,0x02,0xFE,0x00,0x00, 0x01,0x01,0x01,0x7F,0x21,0x11,0x00,0xFF,0x08,0x06,0x01,0x4E,0x80,0x7F,0x00,0x00,"铁",0x20,0x10,0x2C,0xE7,0x24,0x24,0x40,0x3C,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,0x00, 0x01,0x01,0x01,0x7F,0x21,0x11,0x80,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x00,"有",0x04,0x04,0x04,0x84,0xE4,0x3C,0x27,0x24,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00, 0x04,0x02,0x01,0x00,0xFF,0x09,0x09,0x09,0x09,0x49,0x89,0x7F,0x00,0x00,0x00,0x00,"限",0x00,0xFE,0x22,0x5A,0x86,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00, 0x00,0xFF,0x04,0x08,0x07,0x00,0xFF,0x40,0x20,0x03,0x0C,0x14,0x22,0x41,0x40,0x00,"公",0x00,0x80,0x40,0x20,0x18,0x06,0x80,0x00,0x07,0x18,0x20,0x40,0x80,0x00,0x00,0x00, 0x01,0x00,0x20,0x70,0x28,0x26,0x21,0x20,0x20,0x24,0x38,0x60,0x00,0x01,0x01,0x00,"司",0x00,0x10,0x12,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x12,0x02,0xFE,0x00,0x00,0x00, 0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x3F,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,"能",0x08,0xCC,0x4A,0x49,0x48,0x4A,0xCC,0x18,0x00,0x7F,0x88,0x88,0x84,0x82,0xE0,0x00, 0x00,0xFF,0x12,0x12,0x52,0x92,0x7F,0x00,0x00,0x7E,0x88,0x88,0x84,0x82,0xE0,0x00,"环",0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0x04,0x84,0xE4,0x1C,0x84,0x04,0x04,0x00, 0x20,0x60,0x20,0x1F,0x10,0x10,0x04,0x02,0x01,0x00,0xFF,0x00,0x00,0x01,0x06,0x00,"部",0x40,0x44,0x54,0x65,0x46,0x44,0x64,0x54,0x44,0x40,0xFE,0x02,0x22,0xDA,0x06,0x00, 0x00,0x00,0x7E,0x22,0x22,0x22,0x22,0x7E,0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,"煤",0x80,0x70,0x00,0xFF,0x20,0x10,0x04,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x04,0x00,0x80,0x60,0x18,0x07,0x08,0x30,0x44,0x24,0x15,0x0D,0xFF,0x0D,0x15,0x24,0x44,0x00,"气",0x20,0x10,0x4C,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x04,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00,"排",0x10,0x10,0x10,0xFF,0x90,0x08,0x88,0x88,0xFF,0x00,0x00,0xFF,0x88,0x88,0x08,0x00,0x02,0x42,0x81,0x7F,0x00,0x08,0x08,0x08,0xFF,0x00,0x00,0xFF,0x08,0x08,0x08,0x00,"水",0x00,0x20,0x20,0x20,0xA0,0x60,0x00,0xFF,0x60,0x80,0x40,0x20,0x18,0x00,0x00,0x00, 0x20,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,0x00,0x01,0x02,0x04,0x08,0x10,0x10,0x00,"器",0x80,0x80,0x9E,0x92,0x92,0x92,0x9E,0xE0,0x80,0x9E,0xB2,0xD2,0x92,0x9E,0x80,0x00, 0x08,0x08,0xF4,0x94,0x92,0x92,0xF1,0x00,0x01,0xF2,0x92,0x94,0x94,0xF8,0x08,0x00,"报",0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0xFE,0x82,0x82,0x82,0x92,0xA2,0x9E,0x00,0x00, 0x04,0x44,0x82,0x7F,0x01,0x00,0x00,0xFF,0x80,0x43,0x2C,0x10,0x2C,0x43,0x80,0x00,"警",0x12,0xEA,0xAF,0xAA,0xEA,0x0F,0xFA,0x02,0x88,0x8C,0x57,0x24,0x54,0x8C,0x84,0x00, 0x02,0x02,0xEA,0xAA,0xAA,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xEA,0x02,0x02,0x00,"CO",0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00C, 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,"信",0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x04,0x00, 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xF9,0x49,0x49,0x49,0x49,0x49,0xF9,0x00,0x00,"号",0x80,0x80,0x80,0xBE,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xBE,0x80,0x80,0x80,0x00, 0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x44,0x84,0x44,0x3C,0x00,0x00,0x00,0x00,"正",0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00, 0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,"常",0x20,0x18,0x08,0xEA,0xAC,0xA8,0xA8,0xAF,0xA8,0xA8,0xAC,0xEA,0x08,0x28,0x18,0x00, 0x00,0x00,0x3E,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,0x00,"在",0x08,0x08,0x88,0xC8,0x38,0x0C,0x0B,0x08,0x08,0xE8,0x08,0x08,0x08,0x08,0x08,0x00,0x02,0x01,0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00,"发",0x00,0x00,0x18,0x16,0x10,0xD0,0xB8,0x97,0x90,0x90,0x90,0x92,0x94,0x10,0x00,0x00, 0x00,0x20,0x10,0x8C,0x83,0x80,0x41,0x46,0x28,0x10,0x28,0x44,0x43,0x80,0x80,0x00,"送",0x40,0x40,0x42,0xCC,0x00,0x88,0x89,0x8E,0x88,0xF8,0x88,0x8C,0x8B,0x88,0x80,0x00, 0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x48,0x46,0x41,0x42,0x44,0x58,0x40,0x40,0x00,"短",0x90,0x88,0x87,0xFC,0x84,0x84,0x80,0x02,0xF2,0x12,0x12,0x12,0x12,0xF2,0x02,0x00, 0x80,0x60,0x18,0x07,0x08,0x30,0x00,0x40,0x45,0x59,0x41,0x41,0x51,0x4D,0x40,0x00,"成",0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00, 0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00,"功",0x00,0x04,0x04,0x04,0xFC,0x04,0x14,0x14,0x10,0x90,0x7F,0x10,0x10,0xF0,0x00,0x00, 0x04,0x0C,0x04,0x04,0x03,0x42,0x22,0x11,0x0C,0x23,0x20,0x60,0x20,0x1F,0x00,0x00," ",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,"手",0x00,0x24,0x24,0x24,0x24,0x24,0x24,0xFE,0x22,0x22,0x22,0x22,0x22,0x20,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,"机",0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00, 0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00,"卡",0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x02,0x04,0x0C,0x38,0x10,0x00,0x00,"错",0x40,0x30,0x2C,0xE7,0x24,0x24,0x40,0x48,0x7F,0x48,0x48,0x7F,0x48,0x48,0x40,0x00, 0x01,0x01,0x01,0xFF,0x41,0x21,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,"误",0x40,0x41,0xCE,0x04,0x00,0x40,0x5F,0x51,0x51,0xD1,0x51,0x51,0x5F,0x40,0x00,0x00, 0x00,0x00,0x3F,0x10,0x88,0x42,0x22,0x12,0x0A,0x07,0x0A,0x12,0x22,0xE2,0x42,0x00,/*********************************************/"强",0x02,0xE2,0x22,0x22,0x3E,0x00,0x80,0x9E,0x92,0x92,0xF2,0x92,0x92,0x9E,0x80,0x00, 0x00,0x43,0x82,0x42,0x3E,0x40,0x47,0x44,0x44,0x44,0x7F,0x44,0x44,0x54,0xE7,0x00,"度",0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00, 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,"中",0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00, 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00,"国",0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x4A,0x4C,0x48,0x40,0xFF,0x00,0x00,"移",0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0x10,0x08,0x94,0x67,0x24,0x94,0x0C,0x00,0x00, 0x08,0x06,0x01,0xFF,0x01,0x06,0x00,0x89,0x89,0x44,0x4A,0x33,0x12,0x0A,0x06,0x00,"动",0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00, 0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,"联",0x02,0xFE,0x92,0x92,0xFE,0x02,0x00,0x10,0x11,0x16,0xF0,0x14,0x13,0x10,0x00,0x00, 0x10,0x1F,0x08,0x08,0xFF,0x04,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x00,"通",0x40,0x42,0xCC,0x00,0x00,0xE2,0x22,0x2A,0x2A,0xF2,0x2A,0x26,0x22,0xE0,0x00,0x00, 0x80,0x40,0x3F,0x40,0x80,0xFF,0x89,0x89,0x89,0xBF,0x89,0xA9,0xC9,0xBF,0x80,0x00,"服",0x00,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0xFE,0x82,0x82,0x92,0xA2,0x9E,0x00,0x00, 0x80,0x60,0x1F,0x02,0x42,0x82,0x7F,0x00,0xFF,0x40,0x2F,0x10,0x2C,0x43,0x80,0x00,"务",0x00,0x00,0x90,0x88,0x4C,0x57,0xA4,0x24,0x54,0x54,0x8C,0x84,0x00,0x00,0x00,0x00, 0x01,0x01,0x80,0x42,0x22,0x1A,0x07,0x02,0x42,0x82,0x42,0x3E,0x01,0x01,0x01,0x00,"串",0x00,0x00,0x3C,0x24,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0x24,0x3C,0x00,0x00,0x00, 0x00,0x1F,0x09,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x09,0x1F,0x00,0x00,"口",0x00,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00, 0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,"通",0x40,0x42,0xCC,0x00,0x00,0xE2,0x22,0x2A,0x2A,0xF2,0x2A,0x26,0x22,0xE0,0x00,0x00, 0x80,0x40,0x3F,0x40,0x80,0xFF,0x89,0x89,0x89,0xBF,0x89,0xA9,0xC9,0xBF,0x80,0x00,"讯",0x40,0x40,0x42,0xCC,0x00,0x82,0x82,0xFE,0x82,0x82,0x02,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x00,0x00,0x00,0x0F,0x30,0x40,0xF8,0x00,"异",0x00,0x00,0x7E,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x9E,0x80,0xE0,0x00,0x00, 0x08,0x88,0x48,0x28,0x1E,0x08,0x08,0x08,0x08,0x08,0xFE,0x08,0x08,0x08,0x08,0x00,"修",0x40,0x20,0xF8,0x07,0xF0,0xA0,0x90,0x4C,0x57,0x24,0xA4,0x54,0x4C,0x80,0x80,0x00, 0x00,0x00,0xFF,0x00,0x1F,0x80,0x92,0x52,0x49,0x29,0x24,0x12,0x08,0x00,0x00,0x00,//修0,"改",0x04,0x84,0x84,0x84,0x84,0xFC,0x40,0x30,0xCC,0x0B,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x7F,0x20,0x10,0x10,0x08,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00,//改1,"码",0x04,0x84,0xE4,0x5C,0x44,0xC4,0x00,0x02,0xF2,0x82,0x82,0x82,0xFE,0x80,0x80,0x00,0x02,0x01,0x7F,0x10,0x10,0x3F,0x00,0x08,0x08,0x08,0x08,0x48,0x88,0x40,0x3F,0x00,//码2,"电",0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,//电3,"话",0x40,0x40,0x42,0xCC,0x00,0x00,0x20,0x24,0x24,0x24,0xFE,0x22,0x23,0x22,0x20,0x00,0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0xFE,0x42,0x42,0x43,0x42,0x42,0xFE,0x00,0x00,//话4,"接",0x10,0x10,0x10,0xFF,0x10,0x50,0x44,0x54,0x65,0xC6,0x44,0x64,0x54,0x44,0x40,0x00,0x04,0x44,0x82,0x7F,0x01,0x82,0x82,0x4A,0x56,0x23,0x22,0x52,0x4E,0x82,0x02,0x00,//接5,"收",0x00,0xFC,0x00,0x00,0xFF,0x00,0x40,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00,0x00,0x0F,0x04,0x02,0xFF,0x00,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00,//收6,"息",0x00,0x00,0x00,0xFC,0x54,0x54,0x56,0x55,0x54,0x54,0x54,0xFC,0x00,0x00,0x00,0x00,0x40,0x30,0x00,0x03,0x39,0x41,0x41,0x45,0x59,0x41,0x41,0x73,0x00,0x08,0x30,0x00,//息7,"数",0x90,0x52,0x34,0x10,0xFF,0x10,0x34,0x52,0x80,0x70,0x8F,0x08,0x08,0xF8,0x08,0x00,0x82,0x9A,0x56,0x63,0x22,0x52,0x8E,0x00,0x80,0x40,0x33,0x0C,0x33,0x40,0x80,0x00,//数8,"量",0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00, 0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00,//量9,"存",0x04,0x04,0x84,0xE4,0x1C,0x07,0x24,0x24,0x24,0x24,0xA4,0x64,0x24,0x04,0x04,0x00,0x02,0x01,0x00,0xFF,0x00,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x00,//存10,"储",0x80,0x60,0xF8,0x87,0x84,0x98,0x00,0x20,0x24,0xA4,0x7F,0x24,0x34,0x28,0x24,0x00,0x00,0x00,0xFF,0x00,0x00,0x7F,0x24,0x12,0x01,0xFF,0x49,0x49,0x49,0xFF,0x00,0x00,//储11,"无",0x00,0x40,0x42,0x42,0x42,0xC2,0x7E,0x42,0xC2,0x42,0x42,0x42,0x40,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,0x00,};/************************************************************说明:该font.h 文件中包含的是5110显示所用的ASCII、部分汉字、及图片字模。
LCD12864液晶驱动程序
![LCD12864液晶驱动程序](https://img.taocdn.com/s3/m/8f0823df7f1922791688e81f.png)
/ void LCD_12864_Write_Data(uchar dat) { LCD_12864_BUSY_WAIT(); LCD_12864_RS_1(); LCD_12864_RW_0(); LCD_12864_DATA=dat; LCD_12864_E_1(); LCD_12864_E_0(); } /****************************************************************************** * Function:void LCD_12864_Init(void) Description:液晶初始化 Calls:LCD_12864_Write_Command(); CallS By:Sytem_Init.c 中的 System_Init() Input: None Output:None Others: ******************************************************************************* / void LCD_12864_Init(void) { /*光标的移动方向*/ LCD_12864_Write_Command(0x06); /*开显示,关游标*/ LCD_12864_Write_Command(0x0C); /*开显示,开游标*/ //LCD_12864_Write_Command(0x0F); /*基本指令动作*/ LCD_12864_Write_Command(0x30); } /****************************************************************************** * Function:void LCD_12864_Clean_GDRAM(void) Description:清屏,GDRAM 填满 0 Calls:LCD_12864_Init(); LCD_12864_Write_Command(0x36); LCD_12864_Write_Data(0x00);
液晶显示屏LCD12864驱动解析
![液晶显示屏LCD12864驱动解析](https://img.taocdn.com/s3/m/164d54d7ce2f0066f533225b.png)
液晶显示器LCD12864驱动程序#include<msp430g2553.h>#include "lcd12864.h"#include "typedef.h"#define cyCS BIT0 //P2.0,片选信号#define cySID BIT1 //P2.1,串行数据#define cyCLK BIT2 //P2.2,同步时钟#define cyPORT P2OUT#define cyDDR P2DIRvoid Write_8bits(u8 W_bits){u8 i;cyDDR |= cyCLK + cySID; //设置输出方向for(i = 0; i < 8; i++){if(( W_bits << i )&0x80){cyPORT |= cySID;}else{cyPORT &= ~cySID;}delay_ms(1);cyPORT |= cyCLK;delay_ms(1);delay_ms(1);cyPORT &= ~cyCLK;}}void w_1byte(u8 RS, u8 w_data){u8 H_Data,L_Data;u8 tmp_Data = 0xf8;cyDDR |= cyCS; //设置CS口为输出if(RS == 0) tmp_Data &= ~0x02;else tmp_Data |= 0x02;H_Data = w_data; //高位数据H_Data &= 0xf0;L_Data = w_data; //低位数据L_Data &= 0x0f;L_Data <<= 4;cyPORT |= cyCS;Write_8bits(tmp_Data);Write_8bits(H_Data);Write_8bits(L_Data);cyPORT &= ~cyCS;}void init_Lcd(void){cyDDR |= cyCLK + cySID + cyCS; //相应的位端口设置为输出delay_ms(10); //延时等待液晶完成复位w_1byte(0,0x30);delay_ms(1);w_1byte(0,0x02);delay_ms(5);w_1byte(0,0x0c);delay_ms(1);w_1byte(0,0x01);delay_ms(5);w_1byte(0,0x06);delay_ms(1);}//清屏void clear_lcd(void){delay_ms(1);w_1byte(0,0x01);delay_ms(5);}void lcd_pos(u8 x,u8 y)//定位{u8 pos;switch(x){case 1:pos=0x80;break;case 2:pos=0x90;break;case 3:pos=0x88;break;case 4:pos=0x98;break;default:pos=0x80;}pos += y;w_1byte(0,pos);}//显示汉字void Disp_HZ(const u8 * pt,u8 num){u8 i;for(i = 0;i < num*2;i++){w_1byte(1,*(pt++));}}//显示字符void Disp_Ch(const u8 ch){w_1byte(1, ch);}//汉字和字符混合显示void disp_lcd_str(u8 x, u8 y, const u8 *str, u8 len) {u8 i;lcd_pos(x, y);for(i = 0;i < len && *str; ){if(*(str) >= 0x80){w_1byte(1,*(str++));w_1byte(1,*(str++));i++;i++;}else{w_1byte(1,*(str++));i++;}}}。
LCD12864驱动
![LCD12864驱动](https://img.taocdn.com/s3/m/bdb9cc4be518964bcf847c67.png)
/*此版本程序为专门针对DP-51PROC试验箱上的12864点阵液晶设计。
由于原试验箱将12864液晶设置成了统一编址模式,学生对于液晶底层操作原理不能很好理解,所以这里将硬件结构改为间接访问模式,硬件接法如下:CS=P1^2; //LCD_A2RW=P1^1; //LCD_A1DI=P1^0; //LCD_A0E=P1^4; //CS_LCDRST=P1^5;//RST_LCD操作液晶期间,单片机引脚WR(P3.6)\RD(P3.7)必须有一个为低电平P3=0X7F)*/#ifndef _12864_#define _12864_#include <AT89X51.h>#define uchar unsigned char#define uint unsignedint/********************ASCII字库********************/uchar code ascii[16*96];/********************汉字库(需自己取模)********************/uchar code hz[10*32];/*******Interface of hardware*****************/sbitp_cs=P1^2; //LCD_A2sbitp_rw=P1^1; //LCD_A1sbitp_di=P1^0; //LCD_A0sbitp_e=P1^4; //CS_LCDsbitp_rst=P1^5;//RST_LCD#define lcm P0 //PULL UP P0/********************************************/#define enable 0 //enable=0时针对实验箱真实连接#define disable 1#define right 0#define left 1/*******routine declare********************/void delay(unsigned long v);voidwcode(ucharc,ucharcsl,ucharcsr);voidwdata(ucharc,ucharcsl,ucharcsr);voidset_startline(uchari);voidsetxy(ucharx,uchar y);voiddison_off(uchar o);void reset(void);voidlcd_init(void);voidlcd_clr(void);voidlw(ucharx,uchary,uchardd);void dh(ucharxx,ucharyy,ucharn,ucharfb);void ds(ucharxx,ucharyy,ucharq,ucharfb); voidprintchars(ucharxx,ucharyy,uchar *q,ucharfb); voiddisp_bmp(ucharnum,full,l,fb);/*********busy routine********************/ voidlcd_busy(void){p_di=0;p_rw=1;lcm=0xff;while(1){p_e=enable;if(lcm<0x80) break;p_e=disable;}p_e=disable;}/*********delay routine********************/ void delay(unsigned long v){while(v!=0)v--;}/*********write code routine**************/ voidwcode(ucharc,ucharcsl,ucharcsr){if(csl){p_cs=left;lcd_busy();p_di=0;p_rw=0;lcm=c;p_e=enable;p_e=disable;}if(csr){p_cs=right;lcd_busy();p_di=0;p_rw=0;lcm=c;p_e=enable;p_e=disable;}}/*********write data routine**************/ voidwdata(ucharc,ucharcsl,ucharcsr){if(csl){p_cs=left;lcd_busy();p_di=1;p_rw=0;lcm=c;p_e=enable;p_e=disable;}if(csr){p_cs=right;lcd_busy();p_di=1;p_rw=0;lcm=c;p_e=enable;p_e=disable;}}/*********set startline routine************/ voidset_startline(uchari){i+=0xc0;wcode(i,1,1);}/***********set xy routine****************/ voidset_xy(ucharx,uchar y){x+=0x40;y+=0xb8;wcode(x,1,1); //set colunme addresswcode(y,1,1); //set page address}/********display on or off routine*********/ voiddison_off(uchar o){o+=0x3e;wcode(o,1,1); //'0'is off;'1'is on}/***************reset routine*************/ void reset(void){p_rst=0;delay(20);p_rst=1;delay(20);}/************lcm initial routine**********/voidlcd_init(void){ucharx,y;P3=0x7f;reset();set_startline(0);dison_off(0);for(y=0;y<8;y++)/*页*/{for(x=0;x<128;x++){lw(x,y,0);}dison_off(1);}}/************clr screen routine**********/voidlcd_clr(void){ucharx,y;for(y=0;y<8;y++){for(x=0;x<128;x++){lw(x,y,0);}}}/*********wirte data to lcm routine********/voidlw(ucharx,uchary,uchardd){if(x>=64){set_xy(x-64,y);wdata(dd,0,1);}else{set_xy(x,y);wdata(dd,1,0);}}/*********************显示汉字函数**************************/void dh(ucharxx,ucharyy,ucharn,ucharfb) //n:the number of china characters { //xx:colunmeyy:pagefb:anti-white display uchari,j,dx;for(i=0;i<16;i++){dx=hz[i+n*32];if(fb) dx=255-dx;lw(xx*16+i,yy,dx);}for(j=0;j<16;j++){dx=hz[j+16+n*32];if(fb) dx=255-dx;lw(xx*16+j,yy+1,dx);}}/*******在指定位置显示一个ASCII字符*************************/void ds(ucharxx,ucharyy,ucharq,ucharfb) //q:Theascii characters to display.{ //xx:colunme(0~15) yy:page(0~7) uchari,j,dx; //fb:anti-white displayfor(i=0;i<8;i++){dx=ascii[i+(q-0x20)*16];if(fb) dx=255-dx;lw(xx*8+i,yy,dx);}for(j=0;j<8;j++){dx=ascii[j+8+(q-0x20)*16];if(fb) dx=255-dx;lw(xx*8+j,yy+1,dx);}}/**************显示字符串函数***************************/ voidprintchars(ucharxx,ucharyy,uchar *q,ucharfb)//q:Theascii characters to display. { //xx:colunme(0~15) yy:page(0~7) uchari,j,k,dx; //fb:anti-white displayfor(k=0;*q!='\0';k++){//if(k%16==0)for(i=0;i<8;i++){dx=ascii[i+(*q-0x20)*16];if(fb) dx=255-dx;lw((xx+k%16)*8+i,yy+(k/16)*2,dx);}for(j=0;j<8;j++){dx=ascii[j+8+(*q-0x20)*16];if(fb) dx=255-dx;lw((xx+k%16)*8+j,yy+(k/16)*2+1,dx);}q++;}}/******display128*64 bmp picture routine*************************void disp_bmp(ucharnum,full,l,fb) //num:第几幅图;full:是否全屏图{ //l(0~7):从何页开始显示uchari,j,k,dx;if(full) k=8;else k=4 ;for(j=0;j<k;j++){for(i=0;i<128;i++){dx=bmp[num][i+j*128];if(fb) dx=255-dx;lw(i,j+l,dx); //l:page}}}*/uchar code ascii[16*96]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/ 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,/*"!",1*/ 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/ 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,/*"#",3*/ 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,/*"$",4*/ 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,/*"%",5*/ 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,/*"&",6*/ 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/ 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,/*"(",8*/ 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,/*")",9*/0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,/*"*",10*/0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,/*"+",11*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,/*",",12*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/*"-",13*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*".",14*/ 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/*"/",15*/ 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",16*/ 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",17*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",18* /0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",19* /0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",20*/ 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",21*/ 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",22*/ 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",23*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",24* /0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",25*/ 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/*":",26*/ 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,/*";",27*/0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,/*"<",28* /0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*"=",29* /0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,/*">",30* /0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,/*"?",31*/0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,/*"@",32 */0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,/*"A",33* /0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,/*"B",34*/0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,/*"C",35* /0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",36*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,/*"E",37*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,/*"F",38*/0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,/*"G",39* /0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,/*"H",40*/0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"I",41*/0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,/*"J",42*/0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,/*"K",43*/0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,/*"L",44*/0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,/*"M",45*/0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",46*/0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",47*/0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,/*"P",48*/0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,/*"Q",49*/0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,/*"R",50*/0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,/*"S",51* /0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"T",52*/ 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,/*"U",53*/0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,/*"V",54* /0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,/*"W",55* /0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,/*"X",56* /0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"Y",57*/0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,/*"Z",58* /0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,/*"[",0*/ 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,/*"\",1*/ 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,/*"]",2*/ 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",3*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,/*"_",4*/ 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",5*/ 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,/*"a",6*/ 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"b",7*/ 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,/*"c",8*/ 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,/*"d",9*/0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,/*"e",10*/0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"f",11*/0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,/*"g",12* /0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"h",13*/ 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"i",14*/ 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,/*"j",15*/ 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,/*"k",16*/ 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"l",17*/ 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,/*"m",18*/ 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"n",19*/ 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,/*"o",20*/ 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,/*"p",21*/ 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,/*"q",22*/ 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,/*"r",23*/ 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,/*"s",24*/ 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,/*"t",25*/ 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,/*"u",26*/ 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,/*"v",27*/ 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,/*"w",28*/ 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,/*"x",29*/ 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,/*"y",30*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,/*"z",31*/0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,/*"{",32*/ 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,/*"|",33*/ 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,/*"}",34*/0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",35* /0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*" ",36*/ };uchar code hz[10*32]={/*-- 文字: * --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/“取模”/*-- 文字: * --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/“取模”/*-- 调入了一幅图像:C:\Documents and Settings\Administrator\桌面\未命名.bmp --*//*-- 宽度x高度=16x16 --*/0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xFC,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x00,0x00,0x00,0x00,/*-- 调入了一幅图像:这是您新建的图像--*//*-- 宽度x高度=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};#endif。
LCD12864液晶驱动编程指南
![LCD12864液晶驱动编程指南](https://img.taocdn.com/s3/m/bee7dd4a591b6bd97f192279168884868762b800.png)
LCD12864液晶驱动编程指南
1.连接硬件:
2.初始化液晶:
在开始使用液晶之前,需要进行初始化。
初始化过程包括设置液晶的
工作模式、显示模式和其他参数。
通过向液晶发送一系列的指令,可以完
成初始化过程。
3.编写驱动程序:
液晶驱动程序的主要目的是将需要显示的内容以及液晶的控制指令发
送给液晶屏。
根据液晶屏的通信方式,可以采用单片机的IO口直接控制
液晶屏,也可以通过SPI或I2C等接口芯片间接控制。
4.显示图形:
5.显示文本:
除了图形外,液晶还可以显示文本。
可以通过设置显示位置和发送需
要显示的文本来实现。
6.更新显示:
当需要更新液晶上的内容时,可以通过重新设置显示的内容和刷新液
晶来实现。
可以定时刷新液晶,或者通过检测外部事件来触发刷新。
7.扩展功能:
除了基本功能外,还可以实现一些扩展功能,如显示动画、滚动显示、倒计时等。
只需要根据需求编写相应的代码即可实现。
总结:
注意事项:
在编写驱动程序时,需要注意及时更新液晶上的内容,避免频繁刷新导致的卡顿现象。
同时,为了保证程序的可移植性,可以将液晶驱动程序与其他功能模块进行分离,便于代码的维护和移植。
12864 LCD驱动程序
![12864 LCD驱动程序](https://img.taocdn.com/s3/m/7d9dba1c55270722192ef7a1.png)
/*LCD.C128×64 LCD驱动程序*/#include <INTRINS.H>#include <ABSACC.H>#include "LCD.H"//定义屏幕光标(取值0~63,光标本身不可见)unsigned char LcdCursor;/*函数:LcdLightOn()功能:点亮背光灯*/void LcdLightOn(){LCD_BL = 1;}/*函数:LcdLightOff()功能:熄灭背光灯*/void LcdLightOff(){LCD_BL = 0;}/*函数:LcdGetBF()功能:读出状态位BF返回:BF=1,表示忙,不可进行任何操作BF=0,表示不忙,可以进行正常操作*/bit LcdGetBF(){unsigned char dat;dat = XBYTE[0xD002]; //XBYTE的定义见<ABSACC.H>return (bit)(dat & 0x80);}/*函数:LcdWriteCmd()功能:向LCD发送命令参数:cmd:命令字,详见器件的数据手册*/void LcdWriteCmd(unsigned char cmd){while ( LcdGetBF() );XBYTE[0xD000] = cmd;}/*函数:LcdWriteDat()功能:向LCD写入数据参数:dat,要写入的数据说明:目标地址由地址计数器AC隐含指定,写完后AC自动加1*/void LcdWriteDat(unsigned char dat){while ( LcdGetBF() );XBYTE[0xD001] = dat;}/*函数:LcdReadDat()功能:从LCD读出数据返回:读出的数据*//*unsigned char LcdReadDat(){volatile unsigned char dat;while ( LcdGetBF() );dat = XBYTE[0xD003];dat = XBYTE[0xD003]; //需要连续执行两次才能够读出真正的数据return dat;}*//*函数:LcdSetAC()功能:设置DDRAM(显示数据RAM)的AC(地址计数器)值参数:ac:地址计数器值,范围0~63*/void LcdSetAC(unsigned char ac){ac &= 0x3F;ac |= 0x80;LcdWriteCmd(ac);}/*函数:LcdClear()功能:LCD清屏,并使光标回到0*/void LcdClear(){LcdWriteCmd(0x01); //清屏命令LcdCursor = 0;}/*函数:LcdDelay()功能:延时(t*100)个机器周期*/void LcdDelay(unsigned char t){unsigned char n;do{n = 49;while ( --n != 0 );} while ( --t != 0 );}/*函数:LcdInit()功能:LCD初始化*/void LcdInit(){LcdWriteCmd(0x30); //设置基本指令集LcdDelay(3);LcdWriteCmd(0x30); //设置基本指令集(需要再执行一次)LcdDelay(1);LcdWriteCmd(0x0C); //开启显示LcdDelay(3);LcdClear(); //清屏LcdDelay(250);LcdWriteCmd(0x06); //设置进入点LcdDelay(10);}/*函数:LcdCheckAC()功能:根据光标位置调整AC*/void LcdCheckAC(){switch ( LcdCursor ){case 16:LcdSetAC(16);break;case 32:LcdSetAC(8);break;case 48:LcdSetAC(24);break;case 64:LcdCursor = 0;LcdSetAC(0);break;default:break;}/*函数:LcdPutChar()功能:显示ASCII码参数:c为可显示的ASCII码(0x20~0x7F)*/void LcdPutChar(unsigned char c){LcdWriteDat(c);LcdCursor++;LcdCheckAC();}/*函数:LcdPutHZ()功能:显示汉字参数:ch,cl:汉字编码*/void LcdPutHZ(unsigned char ch, unsigned char cl){if ( LcdCursor & 0x01 ){//显示汉字时,必须偶地址对准,即光标位置不能是奇数LcdPutChar(' '); //额外输出一个空格}LcdWriteDat(ch);LcdWriteDat(cl);LcdCursor += 2;LcdCheckAC();}/*函数:LcdPuts()功能:显示字符串参数:*s:要显示的字符串(可同时包含ASCII码和汉字)*/void LcdPuts(unsigned char *s){unsigned char ch, cl;for (;;){ch = *s++;if ( ch == '\0' ) break;if ( ch < 0x80 ){LcdPutChar(ch);}else{cl = *s++;LcdPutHZ(ch,cl);}}}。
LCD12864(ST7920)串行驱动程序
![LCD12864(ST7920)串行驱动程序](https://img.taocdn.com/s3/m/e1f6a3254b35eefdc8d33322.png)
0xf8为写命令的命令字;0xfa为写数据的命令字,这里用的是TI_F28027
在编写和调试过程中借鉴了一些网上的程序,在此表示感谢,
这里是已经调好的,在移植过程中,调试时注意先要通过示波器对函数
void send_data(Uint16 D_Ctrl,Uint16 D_data)
void send_data(Uint16 D_Ctrl,Uint16 D_data)
//LCD_CLK一个脉冲写一位
{
Uint16 i,j;
Uint16 temp;
//LCD_CS=1; //片选使能
GpioDataRegs.GPADAT.bit.GPIO16=1;
send_data (0xf8,y+j*2);
send_data (0xf8,x+i);
send_data (0xf8,0x30);
send_data (0xfa,data1);
send_data (0xfa,data1);
for(i=0;i<3;i++) // 串行数据的传送
{
if(i==0) //写第一个字节 格式1111 1ABC
{
temp=D_Ctrl;
}
if(i==1) //写第二个字节 第一次写 高四位放在第一次传送的高四位
{
temp=(D_data&0xf0);
功能:
实现在任意坐标写一个字
X列;Y行
===========================================================================*/
LCD12864驱动函数
![LCD12864驱动函数](https://img.taocdn.com/s3/m/e7be83220722192e4536f6aa.png)
}
//写指令
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_RS = 0;
LCD_RW = 0;
WriteCommandLCD((0x80+i),1); //行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1);
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
case 2:X2|=0X90;break;
case 3:X2|=0X88;break;
case 4:X2|=0X98;break;
}
WriteCommandLCD(X2, 1); //发送地址码
while (DData[ListLength]>=0x20) //若到达字串尾则退出
/*屏幕闪动 */void LCDFlash(void);
/*显示一个字符*/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
/*显示一串字符*/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
{
unsigned char ListLength,X2;
基于STM32--LCD12864驱动程序.doc
![基于STM32--LCD12864驱动程序.doc](https://img.taocdn.com/s3/m/2163efc6f524ccbff12184d9.png)
基于 STM32--LCD12864驱动程序STM32 LCD12864 驱动程序(头文件)(2012-05-29 21:25:08) 转载▼标签:杂谈#ifndef LCD12864_H#define LCD12864_H#define LCD_CONTROL GPIOD//默认LCD12864的控制口在 PD口#define LCD_DATAPORTGPIOD//默认LCD12864的数据口在 PD口#define LCD_RESET_PinGPIO_Pin_12 // 默认LCD12864的复位引脚连接到 PD.12 也可不用#define LCD_RS_Pin GPIO_Pin_13 // 默认LCD12864 RS -- PD.13#define LCD_RW_PinGPIO_Pin_14 // 默认LCD12864 RW -- PD.14#define LCD_EN_Pin GPIO_Pin_15 // 默认LCD12864 E -- PD.15#define LCD_CONTROL_CLOCKRCC_APB2Periph_GPIOD //默认 LCD12864的控制口时钟#define LCD_DATAPORT_CLOCKRCC_APB2Periph_GPIOD //默认 LCD12864的数据口时钟#define LCD_RS_1LCD_CONTROL->BSRR&=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS 置高电平#define LCD_RS_0LCD_CONTROL->BRR&=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS 置低电平#define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR|=LCD_RW_Pin //RW 置高电平#define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR|=LCD_RW_Pin //RW 置低电平#define LCD_EN_1LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR|=LCD_EN_Pin //EN 置高电平#define LCD_EN_0LCD_CONTROL->BRR&=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN 置低电平#define LCD_RESET_0 LCD_CONTROL->BRR= LCD_RESET_Pin // 复位#define LCD_RESET_1 LCD_CONTROL->BSRR= LCD_RESET_Pin // 复位脚拉高#define DATAOUT LCD_DATAPORT->ODR&=0xff00;LCD_DATAPORT->ODR // 数据输出寄存器#define DATAIN LCD_DATAPORT->IDR //数据输入寄存器#define LCD_BF((DATAIN)&0x0080)//忙状态void LCD_delayus(unsigned long n); //n(us)void LCD_delayms(unsigned long n); //n(ms)void LCD_WriteInitcmd(uint8_t initcmd); 延时延时//写初始化命令void LCD_WaitLaisure(void); //一直等待到 LCD内部操作完成,变为空闲状态void LCD_Writecmd(uint8_t cmd); //写命令到 LCD12864void LCD_WriteByte(uint8_t byte); //写一字节数据到 LCD12864void LCD_pos(uint16_t pos); //LCD显示位置设置col);// void 设定 LCD12864的显示地址,根据习惯LCD_DispChar(char ch); //显示一个字符voidrow,uint16_tLCD_Setpos_DispChar(uint16_t col,char ch);//在指定位置显示一个字符void LCD_DispString(char str[]); // 显示一个字符串,显示位置需提前设定//在指定位置显示一个字符串void LCD_Setpos_DispString(uint16_t row,uint16_t col,char str[]);void LCD_Dispnum(uint32_t num); //显示一个不超过 8 位的整数,显示位置需提前设置//在指定位置显示一个不超过 8 位的整数void LCD_Setpos_Dispnum(uint16_t row,uint16_t col,uint32_t num);void LCD_DispDecimal(uint32_t num,uint16_tdot);// 显示一个有效位不超过 8 位的浮点数 , 显示位置需要提前设定//在指定位置显示一个有效位不超过 8 位的浮点数void LCD_Setpos_DispDecimal(uint16_t row,uint16_t col,uint32_t num,uint16_t dot);//显示日历,显示日期与时间void LCD_DispDateTime(uint32_t year,uint16_t month,uint16_t day,uint16_t hour,uint16_tmin,uint16_t sec);void LCD_DispPicture(const unsigned char picture[]); //显示一幅图像128*64//屏幕整体左移一格,用于滚动显示void LCD_ShiftLeft(void);//屏幕整体右移一格,用于滚动显示void LCD_ShiftRight(void);//清屏,清除显示void LCD_Clear(void);//使光标还回原点位置void LCD_Return(void);//关显示void LCD_Close(void);//开显示void LCD_Open(void);void LCD_FlickerChar(uint16_t row,uint16_t col);//关闭字符闪烁void LCD_CloseFlicker(void);//屏幕秒闪烁一次void LCD_FlickerScreen(void);void LCD_PORT_Init(void);//LCD连接端口初始化void LCD_Init(void);//LCD配置初始化#endif#include "stm32f10x.h"#include "stm32f10x_gpio.h"#include "LCD12864.h"#include "picture.h"// 延时 n(us)void LCD_delayus(unsigned long n) {unsigned long j;while(n--){ j=8;while(j--);}}// 延时 n(ms)void LCD_delayms(unsigned long n) {while(n--)LCD_delayus(1100);}//写初始化命令void LCD_WriteInitcmd(uint8_t initcmd){LCD_RS_0;LCD_RW_0;LCD_EN_1;DATAOUT |= initcmd;LCD_delayus(600);LCD_EN_0;LCD_RW_1;}//一直等待到 LCD内部操作完成,变为空闲状态void LCD_WaitLaisure(void){uint16_t flag=0x00;LCD_RS_0;LCD_RW_1;do{LCD_EN_0;LCD_delayus(5);LCD_EN_1;LCD_delayus(5);flag=(uint16_t)LCD_BF;}while(flag);}// 写命令到 LCD12864void LCD_Writecmd(uint8_t cmd){LCD_WaitLaisure();LCD_RS_0;LCD_RW_0;LCD_EN_1;DATAOUT |= cmd;LCD_delayus(600); //经过测试,取600。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
& 0x80)后就一直读不到 0 了,陷入死循环。当用 while(0) 时反而能正常工作,不知道有没有人能解释
E = 0;
_nop_();
}
/********************************************************/
/*根据设定的坐标数据,定位 LCM 上的下一个操作单元位置 */
下面对上图的指作解释: 1.显示开关控制(DISPLAY ON/OFF)
D=1:开显示(DISPLAY ON) 意即显示器可以进行各种显示操作 D=0:关显示(DISPLAY OFF) 意即不能对显示器进行各种显示操作 2.设置显示起始行(DISPLAY START LINE)
前面在 Z 地址计数器一节已经描述了显示起始行是由 Z 地址计数器控制的。A5~A0 6 位地址自动送入 Z 地址计 数器,起始行的地址可以是 0~63 的任意一行。 例如: 选择 A5~A0 是 62,则起始行与 DDRAM 行的对应关系如下: DDRAM 行:62 63 0 1 2 3 ·················28 29 屏幕显示行: 1 2 3 4 5 6················· 31 32 3.设置页地址(SET PAGE “X ADDRESS”)
case 0x40:
{BusyR();break;}/*右区 */
}
x = Col&0x3F|0x40;
/* col.and.0x3f.or.Set Y Address*/
y = Page&0x07|0xB8; /* row.and.0x07.or.set Page */
CheckBusy();
/* waitting for enable */
//使能 //左片选 //右片选 //页 地址 //列 地址 //一幅图 //12×12 阵点字模 //5×7 阵点字模
/********************函数定义*******************/
void BusyL(void);
//左屏检测忙
void BusyR(void);
//右屏检测忙
LCD12864 模块的 20 个引脚定义如下:
1。Vss
逻辑电源地
2。VDD 逻辑电源正 5v
3。V0 LCD 驱动电压
4。RS 数据/指令选择:高电平为数据,低电平为指令
5。R/W 读/写选择:高电平为读数据,低电平为写数据
6。E 读写使能,高电平有效,下降沿锁定数据
7。DB0 数据输入输出引脚
}
void CheckBusy(void)
{
RS = 0;
//指令
RW = 1;
DataPort= 0xFF;
//输出 0xff 以便读取正确
E = 1;
_nop_();
while(0); //DataPort & 0x80); //Status Read Bit7 = BUSY 这地方有点问题,用了 while(//DataPort
2.读操作时序
时序参数表:
又帖了这么多指令呀时序图什么的,看了就头晕。我也和你一样不爱看这些枯燥的东西。 下面实际写些程序让屏幕亮起来。 运行:
不要走开哦!我会不断补全的。。。 7.自制单片机之七……LCD12864 的驱动之源代码 今天将 LCD12864 的源代码发上来。
//LCD12864
E = 0;
_nop_();
}
/***************************/
/*写指令
*/
/***************************/
6.写显示数据(WRITE DISPLAY DATE)
D7~D0 为显示数据,此指令把 D7~D0 写入相应的 DDRAM 单元,Y 地址指针自动加 1。 7.读显示数据(READ DISPLAY DATE)
此指令把 DDRAM 的内容 D7~D0 读到数据总线 DB7~DB0,Y 地址指针自动加 1。 再帖一下接口时序图 1.写操作时序
8。DB1 数据输入输出引脚
9。DB2 数据输入输出引脚
10。DB3 数据输入输出引脚
11。DB4 数据输入输出引脚
12。DB5 数据输入输出引脚
13。DB6 数据输入输出引脚
14。DB7 数据输入输出引脚
15。CS1 片选择号,低电平时选择前 64 列
16。CS2 片选择号,低电平时选择后 64 列
void WriteCommandR( uchar CommandByte ); //向右屏写入指令
uchar ReadData( void );
//读数据
void WriteData( uchar DataByte ); //写数据
void LcmClear( void );
//清屏
void LcmInit( void );
6. 自制单片机之六……LCD12864 的驱动
LCD12864 的驱动 LCD12864 在市面上主要分为两种,一种是采用 st7920 控制器的,它一般带有中文字库字模,价格略高一点。另一种是 采用 KS0108 控制器,它只是点阵模式,不带字库。很可惜,我的这块就是 KS0108 控制器不带汉字库的,不过不打算 用它专门显示文本,也就无所谓了。
//初始化
void LcmPutBMP( uc图
void LcmReverseBMP( void );
//将整屏反显
void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个 12×12 汉字
uchar * uchartostr(unsigned char unm);
/********************************************************/
void Locatexy(void)
{
uchar x,y;
switch (Col&0xc0)
/* col.and.0xC0
*/
{
/*条件分支执行
*/
case 0:
{BusyL();break;}/*左区 */
所谓页地址就是 DDRAM 的行地址,8 行为一页,模块共 64 行即 8 页,A2~A0 表示 0~7 页。读写数据对地址没有影 响,页地址由本指令或 RST 信号改变复位后页地址为 0。页地址与 DDRAM 的对应关系见 DDRAM 地址表。 4.设置 Y 地址(SET Y ADDRESS)
此指令的作用是将 A5~A0 送入 Y 地址计数器,作为 DDRAM 的 Y 地址指针。在对 DDRA M 进行读写操作后,Y 地址指 针自动加 1,指向下一个 DDRAM 单元。
//将值转成字符串
void LcmPutAsc( uchar asc ); //显示一个 5×7 的 ASC 字符
void LcmPutstr( uchar row,uchar y,uchar * str );
//在设定位置显示字符串
void LcmPutpoint( uchar ro,uchar lie,uchar colour ); //在设定位置显示一个点
5.读状态(STATUS READ)
当 R/W=1 D/I=0 时,在 E 信号为“H”的作用下,状态分别输出到数据总线(DB7~DB0)的相应位。
BF:
前面已叙述过(见 BF 标志位一节)。
ON/OFF: 表示 DFF 触发器的状态(见 DFF 触发器一节)。
RST:
RST=1 表示内部正在初始化,此时组件不接受任何指令和数据。
//**********************************************************
//连线表: CPU=89C51 SysClock=12MHz
*
//RS=P1.0 R/W=P1.1 E=P1.2 CS1=P1.3 CS2=P1.4 *
//DB0-DB7=P0.0-P0.7
17。RET 复位信号,低电平有效。
18。VEE 输出-15v 电源给 V0 提供驱动电源
19。A 背光电源 LED 正极
20。K 背光电源 LED 负极
具体电路图如下:
制做如下: 接口说明: 装上 12864
具体的电路还是两个电阻。一个背光限流电阻。一个液晶驱动电压调节电阻。背光电阻还是任何时候在 19、20 脚与电 源之间串上个 100 欧电位器接上电源。调节电位器到合适亮度。具体值最好是到调试完程序能够正常显示后再将阻值 确定换成固定电阻。液晶驱动电压的调整在数据线、电源线接好的前提下是在 Vee(-15v)和地之间接一个电位器。中间 接 V0,通过调节电位器来调节 V0 上的电压。当 V0 上为-15V 时为全暗(液晶显示为全黑)。当 V0 为 0V 时为全亮。调节 电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。待屏幕显示正常后,进行对比度的细调,然后测量这两边 的阻值在地和 V0 之间、V0 和 Vee 之间换成两个固定电阻焊上就好了。注意在 V0 的电压是在一个很小的范围有效。我 的就是在-2.2——-2.5 这个范围。仔细调节 V0 和地之间的电阻使 V0 上的电压在 2.3V。
sbit RS =P2^0;
//数据指令
sbit RW =P2^1;
//读写
sbit E =P2^2; sbit CSL =P2^3; sbit CSR =P2^4; uchar Page; uchar Col; uchar code BMP1[]; uchar code HZK_12[]; uchar code ASC_5x7[]; uchar str[4];
/***************************/