最完整的12864测试程序
以下是RT12864引脚功能定义 引脚号
管脚 说明 1
Vss 电源地(0V)。 2
VDD 电源正(+5V)。 3
V0 LCD 驱动电压,应用时在VEE 与V0之间加一20K 可调电阻。 4 D/I 数据\指令选择:
高电平:数据D0-D7将送入显示RAM
低电平:数据D0-D7将送入指令寄存器执行。
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
VOUT LCD 驱动电源(-10V )。 19
LED+ 背光电源,LED+(+5V)。 20
LED- 背光电源,LED-(0V)。
以下是RT12864引脚功能定义
引脚号
管脚
说明
1
Vss
电源地(0V)。
2
VDD
电源正(+5V)。
3
V0
LCD驱动电压,应用时在VEE与V0之间加一20K可调电阻。4
D/I
数据\指令选择:
高电平:数据D0-D7将送入显示RAM
低电平:数据D0-D7将送入指令寄存器执行。
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
VOUT
LCD驱动电源(-10V )。
19
LED+
背光电源,LED+(+5V)。
20
LED-
背光电源,LED-(0V)。
/********************************************/ /* 12864系列测试程序*/
/********************************************/ #include
#include
#include
#include
#include
#include
/* LCD寄存器命令代码*/
#define Disp_On 0x3f
#define Disp_Off 0x3e
#define Col_Add 0x40
#define Page_Add 0xb8 //每页是8行
#define Start_Line 0xc0
//LCD和51连接
#define Lcd_Bus P0 //MCU P1<------> LCM
sbit Mcs=P2^6; //Master chip enable
sbit Scs=P2^5; //Slave chip enable
sbit Enable=P3^7; //mode Enable single
sbit Di=P2^4; //Data or Instrument Select
sbit RW=P2^3; //Write or Read
sbit Lcd_Rst=P1^0; //Lcm reset
char code HANZI[7][32]={
{0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00},//"电"
{0x10,0x60,0x01,0x86,0x60,0x04,0x44,0x64,0x55,0x4E,0x44,0x64,0xC4,0x04,0x04,0x00,
0x04,0x04,0xFC,0x03,0x40,0x30,0x0F,0x00,0x00,0x7F,0x00,0x3F,0x40,0x40,0x70,0x00},//"流"
{0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00},//"压"
{0x00,0xFF,0x11,0x29,0xC7,0x01,0xFE,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x00,0xFF,0x02,0x04,0x43,0x40,0x7F,0x42,0x42,0x42,0x42,0x42,0x7F,0x40,0x40,0x00},//"阻"
{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00},//温
{0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00},//度
{0x00,0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,
0x00,0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00} //力
};
char code shu[14][16]={
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//"0" {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//"1" {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},//"2" {0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},//"3" {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//"4" {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//"5" {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//"6" {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//"7" {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//"8" {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},//"9" {0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00},//"+"
{0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//"-" {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},//"." {0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00}//"v"
};
/*------------------延时子程序-----------------------------*/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i for(j=0;j<10;j++); } /********************************************************************** 数原型:void write_com(unsigned char cmdcode) 入口参数: cmdcode 写入的命令 出口参数: 无 返回值:无 说明:写命令到LCD **********************************************************************/ void write_com(unsigned char cmdcode) { Di=0; RW=0; Lcd_Bus=cmdcode; delay(0); Enable=1; delay(0); Enable=0; } /********************************************************************** 数原型:void write_data(unsigned char Dispdata) 入口参数: Dispdata 写入的数据 出口参数: 无 返回值:无 说明:写数据到LCD **********************************************************************/ void write_data(unsigned char Dispdata) { Di=1; RW=0; Lcd_Bus=Dispdata; delay(0); Enable=1; delay(0); Enable=0; } /********************************************************************** 数原型:Clr_Scr() 入口参数: 无 出口参数: 无 返回值:无 说明:清除显示内存 **********************************************************************/ void Clr_Scr() { unsigned char j,k; Mcs=1;Scs=1; write_com(Page_Add+0); write_com(Col_Add+0); for(k=0;k<8;k++) { write_com(Page_Add+k); for(j=0;j<64;j++)write_data(0x00); } } /********************************************************************** 数原型:DispChart(unsigned char CharType,unsigned char pag,unsigned char col, unsigned char code *MH) 入口参数: CharType: 显示的字符类型 1:16x16汉字 2:8x16 字符 3: 4x16 pag :显示在第几行; col :显示在第几列; MH : 显示的内容代码; 出口参数: 无 返回值:无 说明:在指定的行列显示字符,可以跨区域显示 **********************************************************************/ void DispChart(unsigned char CharType,unsigned char pag,unsigned char col, unsigned char code *MH) { unsigned char tcol,j=0,i=0; unsigned char twidth,tpag; tpag=pag; if (CharType==1) { tcol=48; // 16*16 汉字 twidth=16; } if (CharType==2) { tcol=56; // 8*16 字符 twidth=8; } if (col<=tcol) //1区够显示 { Mcs=1;Scs=0; for(j=0;j<2;j++) { write_com(Page_Add+tpag+j); write_com(Col_Add+col); for(i=0;i } } if (col>=64) //0区够显示 { Mcs=0;Scs=1; for(j=0;j<2;j++) { write_com(Page_Add+tpag+j); write_com(Col_Add+col-64); for(i=0;i } } if ((col>tcol)&&(col<64)) //介于1,0区之间显示 { for(j=0;j<2;j++) { Mcs=1;Scs=0; delay(10); write_com(Page_Add+tpag+j); write_com(Col_Add+col); for(i=0;i<(64-col);i++) write_data(MH[twidth*j+i]); Mcs=0;Scs=1; delay(10); write_com(Page_Add+tpag+j); write_com(Col_Add+0); for(i=(64-col);i } } } /********************************************************************** 数原型:void DISP_float(unsigned char pag,unsigned char col, float fData) 入口参数: pag :显示在第几行; col :显示在第几列; fData : 显示的数据; 出口参数: 无 返回值:无 说明:在指定的行列上显示数据,可以跨区域显示 **********************************************************************/ void DISP_float(unsigned char pag,unsigned char col, float fData) { unsigned long int tData; unsigned char wei,i,j,tbit,fuhao,dai; unsigned char wei_shu[5]; if (fData>0) fuhao=1; else fuhao=0; if ((fData<1) &&(fData>-1)) dai=1; else dai=0; tData=(unsigned int)(abs(fData*10)); if (tData<=9) wei=1; if ((tData>9) && (tData<=99)) wei=2; if ((tData>99) && (tData<=999)) wei=3; if ((tData>999) && (tData<=9999)) wei=4; if ((tData>9999) && (tData<=99999)) wei=5; for(i=wei;i>=1;i--) { tbit=tData%10; wei_shu[i-1]=tbit; tData/=10; } if (fuhao==0) //显示0>x { DispChart(2,pag,col,shu[11]); if (dai==1) //显示0>x>-1 { DispChart(2,pag,col+8,shu[0]); DispChart(2,pag,col+16,shu[12]); j=3; } else j=1; } else if (fuhao==1)//显示x>0 { if (dai==1)//显示1>x>0 { DispChart(2,pag,col,shu[0]); DispChart(2,pag,col+8,shu[12]); j=2; } else j=0; } for (i=0;i { DispChart(2,pag,col+j*8,shu[wei_shu[i]]); if ((i==(wei-1))&&(dai==0)) { DispChart(2,pag,col+j*8,shu[12]); DispChart(2,pag,col+(j+1)*8,shu[wei_shu[i]]); goto bbreak; } j=j+1; } bbreak: ; } /********************************************************************** 数原型:void init_lcd() 入口参数: 无 出口参数: 无 返回值:无 说明:初始化LCD屏 **********************************************************************/ void init_lcd() { Lcd_Rst=0; delay(100); Lcd_Rst=1; delay(100); Mcs=1; Scs=1; delay(100); write_com(Disp_Off); write_com(Page_Add+0); write_com(Start_Line+0); write_com(Col_Add+0); write_com(Disp_On); } //主程序 main() { unsigned char i=0; float ff; init_lcd(); Clr_Scr(); ff=-0.9; // ff=0.4; //ff=2121.4; //ff=-1452; DISP_float(0,55,ff); while(1) { DispChart(1,2,0,HANZI[4]); DispChart(1,2,15+10,HANZI[0]); DispChart(1,2,31+10,HANZI[1]); DispChart(2,2,47+10,shu[8]); DispChart(2,2,55+10,shu[4]); DispChart(2,2,63+10,shu[2]); DispChart(2,2,71+10,shu[4]); DispChart(2,2,79+10,shu[1]); DispChart(2,2,87+10,shu[0]); delay(1000); } } 由LCD12864初探嵌入式系统设计 --菜单设计 声明:本文来自互联网,由于年代久远未能找到出处,现整理如下希望大家喜欢,如有侵权请联系 真的好想你QQ: 1320249827 前言往往要解释写文章的动机和原因,同时给作者一个正题以外灌水的机会——本文也不例外。 1、为什么我要写这篇文章。 不可否认,我的确受到了Armok 的利诱影响,但是最近发生的一些事情却使我觉得写这篇文章是非常有必要的。在OurA VR 上看到很多版本的LCD 驱动程序,几乎每一个版本都只是简单的将全部或部分的显示数据Cover 到LCD 的显存上,完成一个字或者是图片的显示就等着大家喊“牛”了。其实要走的路还很远。对一个工程项目来说,增加n 多的成本来提供一个点阵屏作为用户接口,不是一两幅欢迎图片和Now Loading...Please Standy By 的提示能糊弄的过去的。用户希望你提供的是友好的图形界面GUI ,虽然比不过XP 和Apple 的华丽,但是由各种基本图形组成的窗口界面还是需要的。 当我们真的想实现一个图形界面的时候,很快就会发现,我们需要的不仅仅是一个被喊了“牛”的初级驱动,我们需要的是一个图形引擎——一个自定义的图形函数包,没有DirectX 的华丽,但是能绘制一个任意的直线或是矩形就够了——结果往往发现无所适从。这个时候,我们遇到的就是一个门槛,真正的嵌入式工程师和一个业余电子爱好者之间的门槛。 2、我如何写这篇文章 考虑到本人老王卖瓜的习惯,所以请大家一定无比在吃饭前看本人写的技术文章,同时保持耐心等待续集(绝对有续集)。本人现单身,个人问题众多,学习任务重,所以可能有时候写文章象羊拉屎,不对大家 胃口,请见谅。 硬件平台:A VR Mega8级 LCD : 不带字库的12864 软件平台:ICC 规范: 符合基本的C 编程规范 3、何时开始正文 其实,本文应该算是计算机图形学的一个具体分支,所以,计算机图形学的基本要求就是本文的基本要求,考虑到各位兄弟的胃口,我就多罗嗦下。 h t t p :// h i .b a i d u .c o m /b a l l 648500361 本例程为通过用A T89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include 在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108 T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C) 关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。 我们先来了解一下它的并行连接情况。 下面是电路连接图 从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W 是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。 通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。 看看并行模式下的写时序图: 根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。 读时序图如下: 根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。 下面让我们根据这些编写出它的驱动程序吧。 我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C 实际显示效果图片如下: 程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。[p][/p] #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P1^0 ; /////////////////////////////////////////////////////////// #include P35=1; delay(10); P35=0; } /////////write data写数据/////////////// void wdata(uchar c,uchar cs1,uchar cs2) { P34=cs1; P33=cs2; P37=1; P36=0; P1=c; P35=0; delay(10); P35=1; delay(10); P35=0; } ////////////set start设置起始行///////////// void set_startline(uchar i)//起始行。11A5A4A3A2A1A0 共有64行 // 液晶显示器的最底层为第一行 { i=0xc0+64-i;//此算法为把最顶层做为第一层 wcode(i,1,1); } ////////////set 页值设置,起始列值函数///////////// void set_adr(uchar x,uchar y) { x=x+0xb8;//页地址设置。10111A2A1A0 DDRAM的8行为一页,A0~A2为页码,LCD为64行8页 y=y+0x40;//列地址设置。01A5A4A3A2A1A0 两半屏分别有64列,A0~A5送入列地址计数器, //作为列(Y)地址指针。每读写一次其自动加一,指向下一列DDRAM单元wcode(x,1,1); wcode(y,1,1); } ///////////on/off开/关显示函数////////////// /****************************** 2012年5月19日 调试成功 编辑环境:ICCAVR 功能:用LCD12864显示汉字 ********************************/ #include 使用无字库12864液晶模块制作温湿度计 日历钟就摇身一变成为一个小小温湿度计啦。虽然气象要素很多,不过我们最常用的就是气温和湿度。一个是冷热程度,一个是环境空气中含水蒸气的多少。一般家用温度计很常见,湿度计就比较少,以前有一种干湿球温度计,但是用起来比较麻烦,准确度也不高。现在应用电子技术我们就可以做一个可以同时显示温度、湿度、时间的小仪器,放在家里以便随时监测我们的小环境。它的特点如下: 1.在单片机ATMega8L-8PU(以下简称M8)和日历钟电路DS1302的基础上,使用一个在工厂经过精密校准的数字式温度、湿度传感器AM2301作为探头; 2.当24小时连续工作时,纵然工作电流仅为几毫安,也不宜使用纽扣电池供电。这次选用可充电的 3.6V聚合物锂电池,使它的放置地点可以不受电源限制,可以在室内,也可以在不受阳光直射和雨水接触的室外; 3.具有文字和图形界面,可以显示温度和湿度数值,以及12小时内的湿度变化记录曲线,为什么是湿度曲线呢?因为气温的变化规律一般比较稳定,湿度就不一样了,我们可以从湿度变化趋势估计一下未来的晴雨可能,这比看燕子飞高飞低要靠谱些吧?两个界面用按键切换; 4.具备锂电池线性充电电路,通过USB接口从外部取得5V电源,一边供给充电,一边维持电路继续工作;全部元器件安装在一块70mm×90mm的小万用板上,正面、背面外形见图1、图2。正面左边那个黑色小乌龟壳就是温湿度探头。 图2 电路板背面元器件分布和连线 电路原理 电路见图3。图形点阵液晶、单片机M8、时钟电路DS1302和上次小小日历钟基本相同,不再重复。有两点稍稍不同:1.液晶的控制虽然还是通过M8的PD口,但具体接线有所改变,不再占用两根串口线PD0和PD1,目的是为今后可能和外部通信预留接口。这好办,编程时重新定义即可; Protues中单片机驱动lcd12864液晶显示屏仿真: Protues中lcd12864是无字库的,要让它显示一个数字或者汉字或者图片,都需要先对其取模。那么首先介绍介绍一款比较好用的取模软件,百度搜索“zimoV2.2”就可以了。下面先介绍这个取模软件的使用方法: 1.打开软件,界面如下: 2.通常我们显示汉字用的是16×16的像素大小,而显示数字用的是16×8的格式,那么选择文字输入区字体选择,弹出的界面选择如下: 3.其次在“其他选项”中,选择如下: 4.上面设置好之后我们就可以在文字输入区输入汉字了,以“Ctrl”+“Enter”结束: 的模存放在相应的数组中: 上面为取模软件的使用方法,下面开始正式教给读者单片机驱动lcd12864液晶显示屏的方法,在这之前,需要对无字库lcd12864液晶显示屏有个基础的了解,相关引脚如下:管脚名称LEVER 管脚功能描述 VSS 0 电源地 VDD +5.0V 电源电压 V0 - 液晶显示器驱动电压 D/I(RS) H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W=“L”,E=“H→L”数据被写到IR或DR E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0 R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 DB0 H/L 数据线 DB1 H/L 数据线 DB2 H/L 数据线 DB3 H/L 数据线 DB4 H/L 数据线 DB5 H/L 数据线 DB6 H/L 数据线 DB7 H/L 数据线 CS1 H/L H:选择芯片(右半屏)信号 CS2 H/L H:选择芯片(左半屏)信号 RET H/L 复位信号,低电平复位 VOUT -10V LCD驱动负电压 LED+ - LED背光板电源 LED- - LED背光板电源 通过控制CS1和CS2可以用来使能左半屏和右半屏,两个半屏的页和列都是相同的,如下图: #include "includes.h" u8 key=0,hua; extern u32 Second; extern u32 minite,hour,day,k,month,year,shan; u8 xingqi[]={"一二三四五六日"}; u8 ModeFlag=0,wei=0;//液晶界面选择 int main(void) { u8 PasswordIndex=0;//密码数组索引 u8 Password[4]={" "};//存储密码数组 BSP_Init();//初始化外部资源 ModeFlag=0; while(1) { //////////////////////////////////////// 界面一////////////////////////////////// if(ModeFlag==0) { LCD12864_Waddr(1,3); LCD12864_WPoss(0,"WELCOME!"); LCD12864_Waddr(2,2); LCD12864_WPoss(0,"--欢迎使用--"); Delay_1ms(8000); LCD12864_Clear(); } //////////////////////////////////////// 界面二////////////////////////////////// // ModeFlag=0; ///// 改 while(ModeFlag==0) //进入登录界面 { LCD12864_Waddr(1,1); LCD12864_WPoss(0,"请输入登陆密码:"); LCD12864_Waddr(2,3); //LCD12864_WPoss(0," "); LCD12864_Waddr(3,1); LCD12864_WPoss(0,"密码为四位数字"); LCD12864_Waddr(4,1); LCD12864_WPoss(0,"删除*"); AT89s52-LCD12864多页菜单按键选择操 作 这篇程序的代码还未理解清楚,再一次深刻发现自 己的算法水平不行。今天学到的东西还行,就是那些C 文件的一些知识。反正都是些优化的东西,以后肯定也 用的着,过几天有兴趣的话,再去学习一下AVR单片机。 程序代码:硬件上与前面一样,有点变化就是多了 两个翻页的按键。到现在一整天的饭都还没吃,该去吃了,干这个果然不会困。 #include #include sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; sbit PSB= P2^1; //串并口选择端并高串低 #define DataPort P0 sbit KEY_ADD=P3^3; //按键 sbit KEY_DEC=P3^4; unsigned char curr,currold;//全局变量,当前箭头位置 unsigned char code user16x16[]={ //箭头图片 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00 ,0x3E,0x00,0x3F,0x00,0x3F,0x80, 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00 ,0x38,0x00,0x30,0x00,0x20,0x00, }; unsigned char code *MainMenu[]= { {" 1.设置1"}, {" 2.设置2"}, {" 3.设置3"}, {" 4.设置4"}, {" 5.设置5"}, {" 6.设置6"}, {" 7.设置7"}, {" 8.设置8"}, {" 9.设置9"}, #include 以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD 驱动电压,应用时在VEE 与V0之间加一20K 可调电阻。 4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 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 VOUT LCD 驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。 以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD驱动电压,应用时在VEE与V0之间加一20K可调电阻。4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 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 VOUT LCD驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。 基于STM32--LCD12864驱动程序 STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼ 标签:杂谈 #ifndef LCD12864_H #define LCD12864_H #define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口 #define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口 #define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用 #define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13 #define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14 #define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15 #define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟 #define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟 #define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平 #define LCD_RS_0 LCD_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_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平 #define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平 原理图: 原程序: #include<> #define uchar unsigned char #define uint unsigned int #define Port P0 //DB0~DB7数据口 sbit EN=P2^2;//使能 sbit RW=P2^1;//读写 sbit RS=P2^0;//数据/命令 sbit CS2=P2^3;//片选 sbit CS1=P2^4; /*图片“生活不易,知行合一”*/ unsigned char code tu[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00, 0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xE0,0xE0,0xF0,0xF0,0xF0,0xF8,0xF8,0xF 8,0xF8, 0x7C,0x7C,0x7C,0x7C,0x3E,0x3E,0x3E,0x3E,0x3E,0x3F,0x1F,0x1F,0x1F,0x1F,0x1 F,0x1F, 0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0 F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x3E,0x3E,0x3E,0x3 E,0x3E, 0x7C,0x7C,0x7C,0x7C,0xF8,0xF8,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,0xC 0,0xC0, 0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF0,0xF8,0xFC,0xF E,0x7E, 0x3F,0x3F,0x1F,0x0F,0x0F,0x07,0x07,0x07,0x03,0x83,0x61,0x39,0x29,0x20,0x2 0,0xFC, 0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x64,0xC8,0x10,0x40,0x48,0x48,0x4 8,0x48, 0xF8,0x48,0x44,0x44,0x44,0x40,0x00,0x04,0x04,0x04,0x04,0x84,0x64,0xF4,0x0 C,0x84, 0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x7C,0x54,0xD4,0x54,0x54,0x54,0x54,0x5 4,0x54, 0x54,0xFC,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x03,0x07,0x0 7,0x0F, 0x0F,0x1F,0x1F,0x3F,0x7E,0x7E,0xFC,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x0 0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00, 51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include LCD12864原理与应用 1、LCD12864简介: LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。 下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。 与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。此液晶有8页,一页有8行点阵点,左右各64列,共128列。如下图所示: 2、LCD12864中的几条重要指令 (一)行(line)设置命令: 由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。(二)页(page)设置指令: 起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。 (三)列(column)地址设置指令 每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。 (四)读状态指令 3、用LCD12864显示汉字(一) 由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址https://www.360docs.net/doc/365256544.html,/),LCD1602显示自定义字符的时候也是用它。在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在https://www.360docs.net/doc/365256544.html,/下载到关于字模提取原理文档) 字体选择默认的“宋体,常规,小四号”,小四号为16*16大小,如下图所示: 辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理…… 芯片:YM12864R P-1 控制芯片:ST7920A 带中文字库 初步小结: 1、控制芯片不同,寄存器定义会不同 2、显示方式有并行和串行,程序不同 3、含字库芯片显示字符时不必对字符取模了 4、对芯片的结构地址一定要理解清楚 5、显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚 6、显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚 7、显示汉字时的二级单元(一级为八位数据写入单元)要清楚 8、显示图片时的二级单元(一级为八位数据写入单元)要清楚 12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。 为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。(注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息,每页包括64个存储单元。因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。 编写者:董新凯2011.7.20 仅供交流 #include #include 由LCD12864初探嵌入式菜单设计(完全资料)
LCD12864显示程序
玩转12864液晶(1)--显示字符
很好用的12864驱动程序
LCD12864写字符串程序及其头文件
使用无字库12864液晶模块制作温湿度计
Protues中单片机驱动12864仿真
12864并行多级菜单程序
AT89s52LCD12864多页菜单按键选择操作
protues中无字库12864汉字显示程序
最完整的12864测试程序
基于STM32--LCD12864驱动程序
无字库12864使用protues仿真
51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)
LCD12864原理与应用(源程序+原理图+proteus仿真)
12864讲解
基于12864的菜单设计
12864液晶显示程序(图案+文字)