4位总线的液晶模块的驱动程序及初始化程序
12864液晶说明书(含源程序)
FYD12864液晶中文显示模块(一) (一)概述 (3)(二)(二)外形尺寸1 方框图 (3)2 外型尺寸图 (4)(三)(三)模块的接口 (4)(四)(四)硬件说明 (5)(五) 指令说明 (7)(五)(五)读写操作时序 (8)(六)(六)交流参数 (11)(七)(七)软件初始化过程 (12)(八)(八)应用举例 (13)(九)(九)附录1半宽字符表 (20)2 汉字字符表 (21)一、概述FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
基本特性:●●低电源电压(VDD:+3.0--+5.5V)●●显示分辨率:128×64点●●内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)●●内置 128个16×8点阵字符●●2MHZ时钟频率●●显示方式:STN、半透、正显●●驱动方式:1/32DUTY,1/5BIAS●●视角方向:6点●●背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 ●●通讯方式:串行、并口可选●●内置DC-DC转换电路,无需外加负压●●无需片选信号,简化软件设计●●工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃二、方框图3、外形尺寸图三、模块接口说明*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。
晶联讯电子 液晶模块 JLX19264G-333-PN 使用说明书
JLX19264G-333-PN使用说明书目 录序号 内 容 标 题 页码1 概述 22 特点 23 外形及接口引脚功能 3~44 基本原理 4~55 技术参数 56 时序特性 6~77 指令功能及硬件接口与编程案例 7~末页1.概述晶联讯电子专注于液晶屏及液晶模块的研发、制造。
所生产JLX19264G-333型液晶模块由于使用方便、显示清晰,广泛应用于各种人机交流面板。
JLX19264G-333可以显示192列*64行点阵单色图片,或显示12个/行*4行16*16点阵的汉字,或显示24个/行*8行8*8点阵的英文、数字、符号。
2.JLX19264G-333图像型点阵液晶模块的特性2.1结构轻、薄、带背光、焊接式FPC。
2.2 IC采用UC1604c,功能强大,稳定性好2.3功耗低:当电压为3.3V时,功耗低:不带背光1mW(3.3V*0.3mA),带背光不大于100mW(3.3V*30mA);2.4显示内容:(1)192*64点阵单色图片,或其它小于192*64点阵的单色图片;(2)可选用16*16点阵或其他点阵的图片来自编汉字,按照16*16点阵汉字来计算可显示12字*4行;(3)按照12*12点阵汉字来计算可显示15字*4行;(4)按照 8*16点阵汉字来计算可显示24字*4行;(5)按照 5*8点阵汉字来计算可显示31字*8行;2.5指令功能强:可软件调对比度、正显/反显转换、行列扫描方向可改(可旋转180度使用)。
2.6接口简单方便:串行接口。
2.7工作温度宽:-20℃ - +70℃;3.外形尺寸及接口引脚功能模块的接口引脚功能:符 号 名 称 功 能引线号1 CS0(CS) 片选 低电平片选2 RST 复位 低电平复位,复位完成后,回到高电平,液晶模块开始工作3 CD(RS) 寄存器选择信号 H:数据寄存器 0:指令寄存器4 SCK I/O 串行接口时:串行时钟(SCLK)5 SDA I/O 串行接口时:串行数据(SDA)6 VSS 接地 电源输入地7 VDD 供电电源正极 供电电源正极8 LDEA 背光电源 背光电源正极、同VDD电压(5V或3.3V)9 ROM_CS NC NC10 ROM_SCK NC NC11 ROM_OU NC NC12 ROM_IN NC NC表1:模块的接口引脚功能4.基本原理4.1液晶屏(LCD)在LCD上排列着192×64 点阵,192个列信号与驱动IC相连,64个行信号也与驱动IC相连,IC邦定在LCD玻璃上(这种加工工艺叫COG).4.2工作电图:图2是JLX19264G-333图像点阵型模块的电路框图,它由驱动UC1604c及几个电阻电容组成。
12864中文图形点阵液晶显示模块使用说明书
72us
读出 RAM
的值
1 1 D7
D6
D5
D4
D3
D2
D1
D0
从 内 部 RAM 读 取 数 据 (DDRAM/CGRAM/GDRAM)
72us
指令表 2:(RE=1:扩充指令集)
指令
指令码
RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
说明
执行 时间 (540K HZ)
功能:设定 CGRAM 地址到地址计数器(AC),需确定扩充指令中 SR=0(卷动地址或 RAM 地址选择)
地址
设定 CGRAM 地址到地址计数器(AC)
1 AC5 AC4 AC3 AC2 AC1 AC0 需确定扩充指令中 SR=0(卷动地址或 72us RAM 地址选择)
设定 DDRAM 0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 设定 DDRAM 地址到地址计数器(AC) 72us
I/O
DB5
I/O
DB6
I/O
DB7
I/O
PSB
I
NC
-
/RST
I
VEE
-
LED+
-
LED-
-
说明
电源地
逻辑电源正(+5V)
LCD 对比度调节电压
并行模式时选择数据或指令
H: 数据 L: 指令
串行模式时选择模块与否
H: 选择 L: 不选择
并行模式时控制读写
H: 读
L: 写
串行模式时输入数据
并行模式时使能端
L
L
L
H
DL
X
RE
X
1602 四线制驱动程序
/************************************************************************** 1602 四线制驱动程序--基于MSP430F149File Name: LCD1602x4_mps.hAuthor: HuNB***************************************************************************/#include<msp430x14x.h>#define set(x) P6OUT |=x#define clr(x) P6OUT &=~x#define rs BIT2 //RA1#define rw BIT3 //RA2#define e BIT4 //RA3/*--------------------------------------------------------------------------------------------------函数说明--------------------------------------------------------------------------------------------------*/void init(); //申明I/O口初始化函数void delay_nus(unsigned int n); //N nS延时函数void delay_nms(unsigned int n); //N mS延时函数void LCD_init(void); //LCD初始化函数void LCD_en_write(void); //LCD写入使能函数void LCD_write_command(unsigned char command) ; //LCD写入命令函数void LCD_write_data(unsigned char Recdata); //LCD写入数据函数void LCD_set_xy (unsigned char x, unsigned char y); //LCD设置显示位置函数void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata); //LCD显示字符函数int LCD_PutStr(unsigned char *DData,int pos); //LCD显示字符串函数//int LCD_PutNum(unsigned long num,int XS,int pos);//LCD显示数字函数int p=0;//---------------------------------------//---------------------------------------//I/O口初始化函数void init(){//ADCON1=0X07; //设置A口为普通I/O口//TRISA=0X00; //设置A口为输出//TRISD=0X00; //设置D口为输出P4DIR=0xff;P6DIR=0x1c; //设置A口为输出WDTCTL = WDTPW + WDTHOLD; //杀狗}void delay_1us(void) //1us延时函数{_NOP();}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}void LCD_en_write(void) //液晶使能{set(e);delay_nus(1);clr(e);}void LCD_write_command(unsigned char command) //写指令{unsigned char temp;temp=command>>4; //高四位移到低四位delay_nus(16);clr(rs); //RS=0 选择指令地址clr(rw); //RW=0 写操作P4OUT&=0Xf0; //清低四位P4OUT|=temp&0x0f; //写高四位//command&0x0f;LCD_en_write();P4OUT&=0xf0; //清高四位P4OUT|=command&0x0f; //写低四位LCD_en_write();set(rw); //RW=1 结束写操作}void LCD_write_data(unsigned char Recdata) //写数据{ unsigned char temp;temp=Recdata>>4; //高四位移到低四位delay_nus(16);set(rs); //RS=1 选择数据地址clr(rw); //RW=0 写操作P4OUT&=0Xf0; //清高四位P4OUT|=temp&0x0f; //Recdata&0xf0写高四位LCD_en_write();// Recdata=Recdata<<4; //低四位移到高四位P4OUT&=0Xf0; //清高四位P4OUT|=Recdata&0x0f; //写低四位LCD_en_write();set(rw); //RW=1 结束写操作}void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数{unsigned char address;if (y == 0) address = 0x80 + x;else address = 0xc0 + x;LCD_write_command(address);}void LCD_init(void) //液晶初始化{LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);LCD_en_write();delay_nus(40);LCD_write_command(0x28); //4位显示LCD_write_command(0x0c); //显示开LCD_write_command(0x01); //清屏delay_nms(5);}void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1{LCD_set_xy(X, Y); //写地址LCD_write_data(Recdata);}int LCD_PutStr(unsigned char *DData,int pos){unsigned char i;if(pos==-1){LCD_write_command(0x01); //清屏delay_nms(2);pos=0;}while((*DData)!='\0'){switch(*DData){case '\n': //如果是\n,则换行{if(pos<17){for(i=pos;i<16;i++)LCD_write_char(i%16, i/16, ' ');pos=16;}else{for(i=pos;i<32;i++) LCD_write_char(i%16, i/16, ' ');pos=32;}break;}case '\b': //如果是\b,则退格{if(pos>0) pos--;LCD_write_char(pos%16, pos/16, ' ');break;}default:{if((*DData)<0x20){*DData=' ';}LCD_write_char(pos%16, pos/16,*DData);pos++;break;}}DData++;}return(pos);}/*----------------------------以下函数用于输出数字---------------------int LCD_PutNum(unsigned long num,int XS,int pos){ //从右边数,保留几位小数unsigned long tmp=0;unsigned char numbits=0;if(pos==-1){LCD_write_command(0x01);delay_nms(2);pos=0;}if(num==0){LCD_write_char(pos%16, pos/16, '0');pos++;}else{if(num<0){LCD_write_char(pos%16, pos/16, '-');num*=(-1);pos++;}while(num){tmp=tmp*10+(num%10);num=num/10;numbits++;}while(tmp){LCD_write_char(pos%16, pos/16, (tmp%10)+48);tmp=tmp/10;pos++;numbits--;if(numbits==XS) pos=LCD_PutStr(".",pos); //显示小数点 }while(numbits--){LCD_write_char(pos%16, pos/16, '0');pos++;}}return(pos);}**/。
汉昇 HS12832-4 中文字库液晶模块中文说明书
HS12832-4液晶模块使用说明书感谢您关注和使用我们的液晶产品。
如果您在使用中有任何疑问,请拨打我们的客户服务热线寻求技术支持和获取相关资料,我们竭诚为您服务。
您可以登录我们的网站了解最新产品信息。
或者您可以在我公司网站的留言簿栏目留下您宝贵的意见。
深圳汉昇实业有限公司SHENZHEN HANSHENG INDUSTRIAL CO.,LTD地址:深圳市南山区西丽阳光社区米坑新锋工业园2栋5楼邮编:518055公司主页:电话:传真:第一章 HS12832-4中文图形液晶显示模块的主要特性HS12832-4中文图形液晶模块的软件特性主要由ST7920控制驱动器决定。
ST7920同时作为控制器和驱动器,它可提供32路com输出和64路seg输出。
在驱动器ST7921的配合下,最多可以驱动256×32点阵液晶。
ST7920产品硬件特性如下:z提供8位,4位并行接口及串行接口可选z并行接口适配M6800时序z自动电源启动复位功能z内部自建振荡源z64×16位字符显示RAM(DDRAM最多16字符×4行,LCD显示范围16×2行)z2M位中文字型ROM(CGROM),总共提供8192个中文字型(16×16点阵)z16K位半宽字型ROM(HCGROM),总共提供126个西文字型(16×8点阵)z64×16位字符产生RAM(CGRAM)z15×16位总共240点的ICON RAM(ICONRAM)ST7920产品软件特性如下:z文字与图形混合显示功能z画面清除功能z光标归位功能z显示开/关功能z光标显示/隐藏功能z显示字体闪烁功能z光标移位功能功能z显示移位功能z垂直画面旋转功能z反白显示功能z休眠模式中文字库选择:ST7920-0A内建BIG-5码繁体中文字型库ST7920-0B内建GB码简体中文字型库用户在选用之前务必注明。
51单片机驱动1602液晶(4线串行)
51单片机驱动1602液晶(4线串行) 2015-06-26 12:04:01 来源:51hei关键字:51单片机1602液晶4线串行/*单片机I/O 口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口实现更多的功能是单片机工程师追求的目标,现在的一些串行器件也为这一目标的实现添加了更多的可能性,比如I2C总线,MAXIM力推的1-WIRE等等,都可以以很少的I/O口实现更多的功能,当然这是以降低一定的速度为代价的。
废话少说,进入正题。
显示器件多见的是LED数码管,LCD液晶屏等。
一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。
LCD1602外接的控制接口有RS,R/W,E;数据接口为DB7--DB0。
总共有11跟线与单片机的I/O口连接,若使用标准的51单片机,至少占用了一个端口再加上另一个端口的部分I/O口。
这再很多应用场合是不大可取的。
所以很有必要减少连接数。
从其数据手册上介绍的4线连接方式可以达到只使用7个I/O口即可满足要求,其中为3个控制口RS,R/W,E和数据口的DB7--DB4;写入数据或指令的顺序是先写高半个字节,再写低半个字节。
其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分别接RS,R/W,E;下面给出驱动源程序*/#include <reg52.h>#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define TRUE 1#define FALSE 0#define nop _nop_()#define PtData P0 //定义连接口线,#define PtContr P3sbit RS="PtContr"^0;sbit RW="PtContr"^1;sbit E="PtContr"^2;void InitialLcd();void WriteLcdInstr(uchar);void WriteLcdData(uchar);void CheckLcdBusy();uchar HexToDdram(uchar);void Delay(unsigned int);main(){Delay(1000);InitialLcd();WriteLcdInstr(0x80); WriteLcdData('e');WriteLcdData('l');WriteLcdData('k');WriteLcdData('e');WriteLcdData('l');WriteLcdData('i');WriteLcdData('k');WriteLcdData('e');WriteLcdInstr(0xc0); WriteLcdData('L');WriteLcdData('C');WriteLcdData('D');WriteLcdData('1');WriteLcdData('6');WriteLcdData('0');WriteLcdData('2');while(1){WriteLcdInstr(0x0f);Delay(30000);WriteLcdInstr(0x08);Delay(40000);}}//----------------LCD1602函数---------------------////---初始化void InitialLcd(){Delay(600);//延时应大于15ms,不同的晶振使需要修改,本程序再6M下调试通过RS=0;RW=0;nop;E=0;nop;E=1;nop;PtData=0x20;//nop;E=0;Delay(200);//延时应大于4.1msE=1;nop;PtData=0x20;//nop;E=0;Delay(5);//延时应大于100usE=1;nop;PtData=0x20;//nop;E=0;//设置4位操作;WriteLcdInstr(0x01);//清屏WriteLcdInstr(0x28);//设置4位操作,1行显示,5x8WriteLcdInstr(0x02);//光标归位WriteLcdInstr(0x06);//AC自动加1,画面不动WriteLcdInstr(0x0f);//0x0f:光标闪烁开;}//---写指令void WriteLcdInstr(uchar Temp){CheckLcdBusy();RS=0;RW=0;E=0;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---写数据void WriteLcdData(uchar Temp) {CheckLcdBusy();RS=1;RW=0;E=0;nop;E=1;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---查忙void CheckLcdBusy(){uchar Temp,t;PtData=0xff;RW=1;RS=0;nop;E=0;nop;do{nop;E=1;nop;Temp=PtData;nop;nop;nop;E=0;nop;nop;t=PtData;nop;nop;nop;E=0;nop;nop;Temp&=0x80;}while(Temp==0x80);}//---delayvoid Delay(unsigned int N) {unsigned int i;for(i=0;i<N;i++){i=i;}}。
12864初始化
中显液晶12864.pdf这是中文资料,因为这种东西已经被使用的多的不能再多了,而且厂家众多,但是有细微差别,比如串行和并行,有的是焊点切换的,有的是软件切换的。
我这个是后者。
刚接线的时候还出了个笑话,太相信实物和datasheet和对应的了,结果屏幕的背光接反了,幸好没烧。
硬件方面,我选串行是因为它用线少,我很懒的。
:) P1.0口对应CS,P1.1口对应SID,P1.2口对应CLK.参考时序在datasheet上写的很清楚有这个当指导思想,照着写程序吧.动手之前,要先弄明白液晶屏是如何控制的,它内部也有控制芯片,这款的芯片是ST7920,对液晶的操作分为控制指令部分和数据传送部分。
指令呢,数据手册给了很多。
用到再看吧。
做了这么多铺垫,该说说程序了。
下面以子程序的形式逐一贴出来,这里面有的是我找的,有的是我自己编写的,就一个目的,好用。
//-----------------发送命令子程序----------------------- P1.0(cs),P1.1(SID),P1.2(CLK)void send_command(unsigned char command_data) //发送命令{unsigned char i;unsigned char i_data;i_data=0xf8; //串行方式,数据从MCU到LCD,倒数第二位L代表数据控制指令,H代表显示数据P1_0=1;P1_2=0;for(i=0;i<8;i++){P1_1=(bit)(i_data&0x80);P1_2=0;P1_2=1;i_data=i_data<<1;}i_data=command_data; //发送用户指定指令i_data&=0xf0;for(i=0;i<8;i++) //发送高位{P1_1=(bit)(i_data&0x80);P1_2=0;P1_2=1;i_data=i_data<<1;}i_data=command_data;i_data<<=4;for(i=0;i<8;i++) //发送低位{P1_1=(bit)(i_data&0x80);P1_2=0;P1_2=1;i_data=i_data<<1;}P1_0=0;delay_1ms(10);}//-----------------发送数据子程序----------------------- void send_data(unsigned char command_data){unsigned char i;unsigned char i_data;i_data=0xfa;P1_0=1;for(i=0;i<8;i++){P1_1=(bit)(i_data&0x80);P1_2=0;P1_2=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){P1_1=(bit)(i_data&0x80);P1_2=0;P1_2=1;i_data=i_data<<1;}i_data=command_data;i_data <<=4;for(i=0;i<8;i++){P1_1=(bit)(i_data&0x80);P1_2=0;P1_2=1;i_data=i_data<<1;}P1_0=0;delay_1ms(10);}这两段子程序结构差不多,功能也接近,就是通过拉高拉低CLK,送出发送数据和发送命令的指令,然后将用户的指令或者数据发出。
经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序(有程序)
网上下载的资料。
因为论坛不支持.doc文件,我就直接复制上来了。
==================================================================/******************************************************************************经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序文件名:1602.ccpu:STC12C5A32S2 晶振频率:11.0592Mhz编程者:BG1EQ@2011-8-25 测试通过*******************************************************************************LCD1602 实际硬件连接:LCM_RS-----P2^0; //1602定义引脚LCM_RW-----P2^1;LCM_E -----P2^7;LCM_DB0-----P0.0LCM_DB1-----P0.1LCM_DB2-----P0.2LCM_DB3-----P0.3LCM_DB4-----P0.4LCM_DB5-----P0.5LCM_DB6-----P0.6LCM_DB7-----P0.7*******************************************************************************/#include <reg52.h> //包含52头文件#include <string.h> //包含初试化头文件#include <intrins.h>//#include <stdlib.h> //包含标准函数库头文件#include "4bitlcm1602.h" //包含delay头文件#include "delay.h" //包含delay头文件#def ine uchar unsigned char#def ine uint unsigned int//------硬件端口定义--------------------------------//------函数(声明)--------------------------------void sys_init(void); //系统初始化函数(声明)/****************************************************************************************** * 函数名称:主程序* 功能描述:******************************************************************************************/ main() //主程序入口{// LCMInit(); //初始化LCDsys_init(); //系统初始化while(1){ //主程序循环(开始)LCD_cls(); //清屏DisplayListChar(0,0," MONITOR V1.0 "); //第1行显示DisplayListChar(0,1," APPLY IN CHINA "); //第2行显示Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();LCD_cls(); //清屏DisplayListChar(0,0," BG1EQ@ "); //第1行显示DisplayListChar(0,1," 2011Y 08M 25D "); //第2行显示Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();LCD_cls(); //清屏DisplayOneChar(0,0,'0'); //显示字符DisplayOneChar(1,0,'1'); //显示字符DisplayOneChar(2,0,'2'); //显示字符DisplayOneChar(3,0,'3'); //显示字符DisplayOneChar(4,0,'4'); //显示字符DisplayOneChar(5,0,'5'); //显示字符DisplayOneChar(6,0,'6'); //显示字符DisplayOneChar(7,0,'7'); //显示字符DisplayOneChar(8,0,'8'); //显示字符DisplayOneChar(9,0,'9'); //显示字符DisplayOneChar(10,0,'0'); //显示字符DisplayOneChar(11,0,'-'); //显示字符DisplayOneChar(12,0,'+'); //显示字符DisplayOneChar(13,0,'='); //显示字符DisplayOneChar(14,0,'#'); //显示字符DisplayOneChar(15,0,'$'); //显示字符Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();LCD_cls(); //清屏DisplayOneChar(0,1,'A'); //显示字符DisplayOneChar(1,1,'B'); //显示字符DisplayOneChar(2,1,'C'); //显示字符DisplayOneChar(3,1,'D'); //显示字符DisplayOneChar(4,1,'E'); //显示字符DisplayOneChar(5,1,'F'); //显示字符DisplayOneChar(6,1,'G'); //显示字符DisplayOneChar(7,1,'H'); //显示字符DisplayOneChar(8,1,'I'); //显示字符DisplayOneChar(9,1,'J'); //显示字符DisplayOneChar(10,1,'K'); //显示字符DisplayOneChar(11,1,'L'); //显示字符DisplayOneChar(12,1,'M'); //显示字符DisplayOneChar(13,1,'N'); //显示字符DisplayOneChar(14,1,'O'); //显示字符DisplayOneChar(15,1,'P'); //显示字符Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();} //主程序循环结束返回}/****************************************************************************************** * 函数名称:sys_init* 功能描述:系统初始化******************************************************************************************/ void sys_init(){Delay400Ms(); //上电后延时,让LCD1602进入稳定状态,LCMInit(); //初始化LCD1602}以上是C51主程序以下是C51 模块化4BITLCM1602.H函数程序/*--------------------------------------------------------------------------4BITLCM1602.H4位总线驱动LCD1602 头文件--------------------------------------------------------------------------*/#if ndef __4BITLCM1602_H__#def ine __4BITLCM1602_H__/*******************************************************************************///#include <reg52.h> //包含52头文件//#include <string.h> //包含初试化头文件//#include <intrins.h>//#include <stdlib.h> //包含标准函数库头文件#def ine uchar unsigned char#def ine uint unsigned int//------硬件端口定义--------------------------------sbit LCM_RS = P2^0; //1602定义引脚sbit LCM_R W = P2^1;sbit LCM_E = P2^7;sbit LCD7=P0^7;sbit LCD6=P0^6;sbit LCD5=P0^5;sbit LCD4=P0^4;uchar bdata lcdbuff; //声明,全局的、可以位寻址的变量sbit lcd_buff7=lcdbuff^7;sbit lcd_buff6=lcdbuff^6;sbit lcd_buff5=lcdbuff^5;sbit lcd_buff4=lcdbuff^4;sbit lcd_buff3=lcdbuff^3;sbit lcd_buff2=lcdbuff^2;sbit lcd_buff1=lcdbuff^1;sbit lcd_buff0=lcdbuff^0;//------函数(声明)--------------------------------void LCMInit(void); //LCM屏初始化void R_BF(); //读忙标志BFvoid w_com(uchar com); //写指令函数void w_cdata(void); //写数据函数void WriteDataLCM(unsigned char WDLCM); //LCM屏写数据函数(声明)void LCD_cls(void); //LCM屏清屏void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);/******************************************************************************************* 函数名称:WriteDataLCM* 功能描述:LCM写数据******************************************************************************************/void WriteDataLCM(uchar WDLCM){R_BF();lcdbuff = WDLCM;LCM_RS = 1;LCM_R W = 0;w_cdata(); //这里写入字符码}/****************************************************************************************** * 函数名称:DisplayListChar* 功能描述:按指定位置显示一串字符,原来的遇到空格0x20就不显示* 函数说明:******************************************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength,j; //定义局部变量ListLength = strlen(DData); //读取字符串长度X &= 0xF; //限制X不能大于15 Y &= 0x1; //限制Y不能大于1 if (X <= 0xF)//X坐标应小于0xF{f or(j=0;j<ListLength;j++){DisplayOneChar(X, Y, DData[j]); //显示单个字符X++;}}}/****************************************************************************************** * 函数名称:DisplayOneChar* 功能描述:按指定位置显示一个字符* 函数说明:******************************************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){X &= 0xF; //限制X不能大于15Y &= 0x1; //限制Y不能大于1if (Y) X |= 0x40; //如果Y是“1”,则合成显示第二行时地址码+0x40;X |= 0x80; //合成的、显示位置码,指令码:1Yxx xxxx (B)w_com(X); //写入地址码,X数据包含字符的显示位置WriteDataLCM(DData); //写入数据码,要显示的字符数据}/****************************************************************************************** * 函数名称:LCMInit* 功能描述:LCM初始化* 函数说明:LCM初始化******************************************************************************************/ void LCMInit(void){w_com(0x2c); //功能设置为:四位数据总线w_com(0x01); //清屏w_com(0x06); //设置显示输入模式(A C指针自加1,显示不移位)w_com(0x0c); //显示开/关设置(设置显示、光标和闪烁开关)}/****************************************************************************************** * 函数名称:R_BF* 功能描述:读忙标志BF* 函数说明:读忙标志BF*******************************************************************************************/ void R_BF(){LCD7=1; //BF端口在DB7,置LCD7为“1”等待测试本端口电平LCM_RS=0;LCM_R W=1;LCM_E=1; //RS=0;R W=1;E=1表示读忙标志BFwhile(LCD7); //若内部操作位BF忙CPU就等待BF不忙才能操作LCM_E=0;}/****************************************************************************************** * 函数名称:w_com* 功能描述:写命令* 函数说明:主要用来初始化一些设置显示、输入模式、显示开关、光标、移位、功能、地址*******************************************************************************************/ void w_com(uchar com){R_BF();lcdbuff = com;LCM_RS = 0;LCM_R W = 0;w_cdata();}/****************************************************************************************** * 函数名称:w_cdata* 功能描述:写命令的公共* 函数说明:四位数据总线, 每发送一字节,先发送高四位,再发送低四位*******************************************************************************************/ void w_cdata(void){//-----写命令的高4位LCD7 = lcd_buff7;LCD6 = lcd_buff6;LCD5 = lcd_buff5;LCD4 = lcd_buff4;LCM_E = 1;_nop_();LCM_E = 0;_nop_();_nop_();//-----写命令的低4位LCD7 = lcd_buff3;LCD6 = lcd_buff2;LCD5 = lcd_buff1;LCD4 = lcd_buff0;LCM_E = 1;_nop_();LCM_E = 0;}/****************************************************************************************** * 函数名称:LCD_cls* 功能描述:LCM清屏*******************************************************************************************/void LCD_cls(void){w_com(0x01); //清屏}#endi f以下是C51 模块化DELA Y.H 函数程序/*--------------------------------------------------------------------------DELA Y.H延时函数头文件--------------------------------------------------------------------------*/#if ndef __DELA Y_H__#def ine __DELA Y_H__#def ine uchar unsigned char#def ine uint unsigned int//------函数(声明)--------------------------------void Delay400Ms(void); //延时400mS函数(子程序)/******************************************************************************************* 函数名称:Delay400Ms* 功能描述:400ms延时******************************************************************************************/ void Delay400Ms(void){uchar TempCycA = 30; //1周期MPU用30, 12周期MPU用5uint TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}#endi f。
12864液晶屏驱动程序
BMPwith=*PicData;
PicData++;
BMPheight=(*PicData)/8;
PicData++;
//BMPLen=BMPheight/8*BMPwith
for(BMPheightLen=0;BMPheightLen<BMPheight;BMPheightLen++)
Series = Series << 1;
}
}
/***********************************
** 函数名称: Write_Data
** 功能描述: 传送数据
** 输 入: dat
** 输 出 : 无
** 全局变量:无
** 调用模块: Busy,
******************************************/
//图像反色显示 0 否 1是
bit LCD_DisplayReserve_Driver;
//定义LCD显示的全局变量
#define CS_Port P3_0
#define A0_Port P3_1
#define SI_Port P3_2
{
switch (PIN)
{
case CS :
CS_Port=1;
break;
case A0 :
A0_Port=1;
break;
case SI :
SI_Port=1;
break;
case SCL :
SCL_Port=1;
4 位段码液晶显示器模块原理与应用手册
EDM1190A
4位段码液晶显示器模块原理与应用手册
大连佳显电子有限公司
地址: 大连市沙河口区工华街 17号轩煌大厦六楼
邮编: 116021
电话: (0411)84619565
传真: (0411)84619585
网址:
一、概述
本段码式液晶显示器组件由LCD显示器,驱动电路,8位CPU接口构成。
主要技术参数:
电源: +5V
驱动方式: 静态
视角: 6点
显示容量: 4位数字(带小数点)
传输方式: 反射式
显示方式: 正显示
工作温度: 0--+55℃
存储温度: -20--+70℃
工作时间: >50000H
LOW
三、接口信号说明
段码式LCD组件接口信号与CMOS和TTL兼容。
2
3序号 名称 说 明
1 VDD
电源正极,+5V 。
2 DI
串行数据输入端。
3 VSS
电源地,0V 。
4 CL
串行时钟。
四、时序
五、外型尺寸。
320240A液晶屏详细说明
图形点阵液晶显示模块使用手册LCM320240ALCD MODULE USER MANUAL1一.概述适配 80 系列和 320240A 使用功能强大的 S1D13305(兼容 RaiO 8835)作为控制器。
68 系列 MPU 的两种操作时序电路,通过硬件设置,可选择二者之一。
4 位显示数据线, 传输数据迅速;具有强大的作图功能;支持文本显示、图形显示以及图形和文本混合显示; 具备简捷的 MPU 接口和功能齐全的控制指令集。
采用 COB 工艺制作,结构稳固,使用 寿命长。
1. 供电电压:5.0V±10% 2. 显示模式:320×240 图形点阵 3. 内部固化的 160 种 5×7 点阵的字符,用户最多可自建 64 个 5×7 点阵的字符 4. 文本显示、图形显示以及文本与图形混合显示功能二.外形尺寸1. 外形图160.0± 0.5 152.3± 0.3 141.0± 0.2 V.A.122.0 A.A.115.170 5.0 2-?2.15 4.0 8.54.0 11.0 25.011.00 6.40 1.602.50200.36 0.33109.0± 0.5 104.7± 0.3 101.0± 0.2 V.A.92.0 A.A.86.37 48.26J11 122.86J4 8? 40 3.714.14J2 11.0*23=23.024211.00.36 0.33320*240dots87.02. 主要外形尺寸项 模 视 点 点 距 大 块 体 目 积 域 离 小 标 准 尺 寸 单 mm mm dots mm mm 位 160L×109W×12H 122×92 320×240 0.36×0.36 0.33×0.33行 列 点 阵 数三.硬件说明1. 模块接口 1) 带控制器接口(J1)管脚名称 1 2 3 4 5 6 符号 VSS VDD V0 /WR /RD CS A0(=RS RESET ~ DB7 BLA VEE BLK 电平 0V 5.0V 负压 H/L H/L H/L H/L H/L H/L 5V 负压 0V 功能描述 电源地 电源电压 液晶显示对比度调节端 80 时序:写信号;低有效 /WR=R/W,读写选择信号端 时序:读信号;低有效 68 时序:/RD=E,操作使能信号 片选信号;高有效 高:选择指令寄存器 低:选择数据寄存器 复位信号;低有效 数据总线 背光正 负电源 背光负8 9 ~ 16 17,19 18 2032) 带控制器带触摸屏接口(J2)管脚名称 符号 1 RESET 2 3 4 5 6 ~ 13 14 15 16 17 18 19 20 21 22 23 24 /RD /WR CS A0(=RS ) DB0 ~ DB7 VDD VSS VEE V0 DCLK DOUT DIN T-CS PEN BLA BLK 电平 H/L H/L H/L H/L H/L H/L 5.0V 0V 负压 负压 H/L H/L H/L H/L H/L 5V 0V 功能描述 复位信号;低有效 80 时序:读信号;低有效 68 时序:/RD=E,操作使能信号 80 时序:写信号;低有效 68 时序:/WR=R/W,读写选择信号端 片选信号;高有效 高:选择指令寄存器 低:选择数据寄存器 数据总线 电源电压 电源地 负电源 液晶显示对比度调节端 ADS7843 串行时钟信号 ADS7843 串行数据输出 ADS7843 串行数据输入 ADS7843 片选信号,低有效 ADS7843 背光正 背光负3) 无控制器接口(J3)管脚名称 1-45符号 D0-D3 DIS.O FRM M LP CP VDD VSS VEE V0 F.G电平 H/L H/L H/L H/L H/L H/L 5V 0V 负压 负压 —功能描述 数据总线 显示开关 L:关 H:开 帧信号 交流驱动信号 行锁存信号 数据移位信号 电源电压 电源地 液晶驱动负电压输出 液晶显示对比度调节端 铁框地6 7 8 9 10 11 12 13 1444) 触摸屏接口(J4)管脚名称 1 2 3 4 5 6 7 8 符号 DCLK T-CS DIN BUSY DOUT PEN IN3 IN4 电平 H/L H/L H/L H/L H/L H/L H/L H/L 功能描述 ADS7843 串行时钟信号 ADS7843 片选信号,低有效 ADS7843 串行数据输入 ADS7843 忙信号输出 ADS7843 串行数据输出 ADS7843 中断信号 ADS7843 辅助输入一 ADS7843 辅助输入二2. 原理简图SRAMIC1X4SEG320S1D13305IC2X35V±10% 0V 30Vmax 0~Vdd5COM240320X240DOTSPOWER CIRCUITDC TO DC CIRCUITLED OR CCFL BACKLIGHT3. 最大工作范围1) 逻辑工作电压(Vdd): 2) 电源地(GND): 3) LCD 驱动电压(Vop): 4) 输入电压:4.电气特性(测试条件,Vdd=5.0±10%)1) 输入高电平(Vih) :0.8Vdd~Vdd 2) 输入低电平(Vil): Vss~0.2Vdd 3) 输出高电平(Voh): 2.4Vmin 4) 输出低电平(Vol): 0.4Vmax 5) 模块工作电流: <120mA (不含背光) 6) 侧白光工作电流: 140mA四.模块主要硬件构成说明1. SEL1 脚接低时选择 Intel8080 时序,接高时选择,M68002.忙标志(BF)MPU访问S1D13305不需要判断其是否“忙 , S1D13305随时准备接受MPU访问并在内部时序下及时地把MPU发来的数据、指令就位。
1602四线八线驱动程序,非常完整
/*--------------------------------------------------------------*///防止被重复定义#ifndef __LCD1602_8A_H__#define __LCD1602_8A_H__/*--------------------------------------------------------------*///模式选择(条件编译)#define Port_Type_Select 1 //=1, 选择八位数据模式//=0, 选择四位数据模式, LCD高四位接MCU端口高四位#defineInt_Transfer 1 //=1, 允许中断服务函数调用//=0, 不允许中断服务函数调用/*--------------------------------------------------------------*///LCD1602与单片机接口定义#define LCD_IO P0 //P0-0x80,P1-0x90,P2-0xA0,P3-0xB0; sbit LCD_RS = P1^0; //LCD数据/命令选择端(H/L)sbit LCD_RW = P1^1; //LCD 读/写选择端(H/L)sbit LCD_EN = P1^2; //LCD使能控制端/*--------------------------------------------------------------*///工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0x38); //两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); //单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); //两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINE LCD_cmd(0x20); //单行显示4-bits/*--------------------------------------------------------------*///输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); //数据读、写操作后,AC 自动加1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); //数据读、写操作后,AC自动减1#define LCD_MOVE_ENABLE LCD_cmd(0x07); //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE LCD_cmd(0x06); //数据读、写操作,画面不动/*--------------------------------------------------------------*///设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON LCD_cmd(0x0c); //LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08); //LCD关显示#define LCD_CURSOR_ON LCD_cmd(0x0e); //光标显示#define LCD_CURSOR_OFF LCD_cmd(0x0c); //光标不显示#define LCD_CURSOR_BLINK_ON LCD_cmd(0x0f); //光标闪烁#define LCD_CURSOR_BLINK_OFF LCD_cmd(0x0e); //光标不闪烁#define LCD_GO_HOME LCD_cmd(0x02); //AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR LCD_cmd(0x01); //LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*--------------------------------------------------------------*///光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE LCD_cmd(0x18); //LCD显示左移一位#define LCD_RIGHT_MOVE LCD_cmd(0x1c); //LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); //光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cmd(0x14); //光标右移一位/*--------------------------------------------------------------*///LCD1602地址相关/*#define LINE1_HEAD 0x80 //第一行DDRAM起始地址#define LINE2_HEAD 0xc0 //第二行DDRAM起始地址#define LINE1 0 //第一行#define LINE2 1 //第二行#define LINE_LENGTH 16 //每行的最大字符长度(40-DDRAM)/*--------------------------------------------------------------*///函数声明void LCD_busy (void); //检测LCD是否忙void LCD_init (void); //LCD初始化void LCD_cmd (unsigned char cmd); //写入指令void LCD_dat (unsigned char dat); //写入数据void LCD_pos (unsigned char x, unsigned char y); //显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c); //定位输出字符void LCD_prints(unsigned char x, unsigned char y, unsigned char *s); //定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num); //定位输出16位二进制数字unsigned char LCD_current_addr(void); //读出AC当前地址(DB6~DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(void); //读出AC当前地址的数据//unsigned char LCD_addr_dat(unsigned char x, unsigned char y); //读出AC指定地址的数据//void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat); //指定地址(x: 0-7)写入8bytes数据CGRAM/*--------------------------------------------------------------*/ //读出AC当前地址(DB6~DB0)或忙标志位DB7#if Port_Type_Select //选择八位数据模式unsigned char LCD_current_addr(void){unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0; //指令LCD_RW = 1; //读出LCD_IO = 0xff; //端口置为输入方式(P0)LCD_EN = 1;ac_addr = LCD_IO;LCD_EN = 0;return (ac_addr);}#else //选择四位数据模式unsigned char LCD_current_addr(void) {unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0; //指令LCD_RW = 1; //读出LCD_IO |= 0xf0; //端口置为输入方式(P0) LCD_EN = 1;ac_addr = LCD_IO & 0xf0; //高四位LCD_EN = 0;LCD_EN = 1;ac_addr |= LCD_IO >> 4; //低四位LCD_EN = 0;return (ac_addr);}#endif/*--------------------------------------------------------------*/ //检测LCD忙状态#if Int_Transfer //允许中断服务函数调用void LCD_busy(void)unsigned char ac_dat;unsigned char busy_flag;do{ac_dat = LCD_current_addr();busy_flag = ac_dat & 0x80;}while(busy_flag); //=1表示忙, =0表示空闲}#else //不允许中断服务函数调用void LCD_busy(void){unsigned char ac_dat;bit busy_flag;do{ac_dat = LCD_current_addr();busy_flag = (bit)(ac_dat & 0x80);}while(busy_flag); //=1表示忙, =0表示空闲#endif///*--------------------------------------------------------------*/ ////读出AC当前地址的数据//#if Port_Type_Select //选择八位数据模式//unsigned char LCD_current_addr_dat(void)//{//unsigned char addr_dat;//// unsigned char i;//LCD_busy(); //或者检查忙最可靠//// for(i = 0; i < 3; i++) //要连续读出三次才会有效//{//LCD_EN = 0;//LCD_RS = 1; //数据//LCD_RW = 1; //读出//LCD_IO = 0xff; //端口置为输入方式(P0)//LCD_EN = 1;//addr_dat = LCD_IO;//LCD_EN = 0;//}//return (addr_dat);//}//#else //选择四位数据模式//unsigned char LCD_current_addr_dat(void)//{//unsigned char addr_dat;//// unsigned char i;//LCD_busy(); //或者检查忙最可靠//// for(i = 0; i < 3; i++) //要连续读出三次才会有效//{ //LCD_EN = 0;//LCD_RS = 1; //数据//LCD_RW = 1; //读出//LCD_IO |= 0xf0; //端口置为输入方式(P0)//LCD_EN = 1;//addr_dat = LCD_IO & 0xf0; //高四位//LCD_EN = 0;//LCD_EN = 1;//addr_dat |= LCD_IO >> 4; //低四位//LCD_EN = 0;//}//return (addr_dat);//}//#endif/*--------------------------------------------------------------*/ //写入指令#if Port_Type_Select //选择八位数据模式void LCD_cmd(unsigned char cmd){LCD_busy(); //检测忙LCD_RS = 0; //指令LCD_RW = 0; //写入LCD_EN = 1;LCD_IO = cmd; //传指令LCD_EN = 0; //下降沿有效}#else //选择四位数据模式void LCD_cmd(unsigned char cmd) {LCD_busy(); //检测忙LCD_IO &= 0x0f; //清高四位LCD_RS = 0; //指令LCD_RW = 0; //写入LCD_EN = 1;LCD_IO |= cmd & 0xf0; //写高四位LCD_EN = 0; //下降沿有效cmd <<= 4; //低四位移到高四位LCD_IO &= 0x0f; //清高四位LCD_EN = 1;LCD_IO |= cmd & 0xf0; //写高四位LCD_EN = 0; //下降沿有效}#endif/*--------------------------------------------------------------*/ //写入数据#if Port_Type_Select //选择八位数据模式void LCD_dat(unsigned char dat){LCD_busy(); //检测忙LCD_RS = 1; //数据LCD_RW = 0; //写入LCD_EN = 1;LCD_IO = dat; //传数据LCD_EN = 0; //下降沿有效}#else //选择四位数据模式void LCD_dat(unsigned char dat) {LCD_busy(); //检测忙LCD_IO &= 0x0f; //清高四位LCD_RS = 1; //数据LCD_RW = 0; //写入LCD_EN = 1;LCD_IO |= dat & 0xf0; //写高四位LCD_EN = 0; //下降沿有效dat <<= 4; //低四位移到高四位LCD_IO &= 0x0f; //清高四位LCD_EN = 1;LCD_IO |= dat & 0xf0; //写高四位LCD_EN = 0; //下降沿有效}#endif/*--------------------------------------------------------------*///显示定位DDRAMvoid LCD_pos(unsigned char x, unsigned char y){if(y) LCD_cmd(x|0xc0);//y=1第二行显示,y=0第一行显示0<=x<16(40-DDRAM)else LCD_cmd(x|0x80);//数据指针=80+地址码(00H~27H,40H~67H) }///*--------------------------------------------------------------*/////指定地址(x: 0-7)写入8bytes数据CGRAM//void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat)//{//unsigned char i;//x <<= 3; //转化为6位数据的高三位,就是x*8;//x |= 0x40;//LCD_cmd(x); //写入地址//for(i = 0; i < 8; i++)//LCD_dat(CGRAM_dat[i]); //写入数据//}///*--------------------------------------------------------------*/////读出AC指定地址的数据//unsigned char LCD_addr_dat(unsigned char x, unsigned char y) //{//unsigned char addr_dat;//LCD_pos(x, y); //定位//addr_dat = LCD_current_addr_dat(); //读出数据//return (addr_dat);//}/*--------------------------------------------------------------*///定位输出字符void LCD_printc(unsigned char x, unsigned char y, unsigned char c) {LCD_pos(x, y);LCD_dat(c);}/*--------------------------------------------------------------*///定位输出字符串void LCD_prints(unsigned char x, unsigned char y, unsigned char *s) {LCD_pos(x, y);while(*s){LCD_dat(*s);s++;}}/*--------------------------------------------------------------*///定位输出16位二进制数字// 0<= num <65536void LCD_printn(unsigned char x, unsigned char y, unsigned int num) {char i=0;unsigned char ii=0;unsigned char dat[6]={0,0,0,0,0,0};for(i = 0; i < 6; i++) dat[i] = 0; i = 0; //初始化数据while(num / 10) //拆位{dat[i] = num % 10; //最低位num /= 10; i++;}dat[i] = num; //最高位ii = i; //保存dat的位数for(; i >= 0; i--) dat[i] += 48; //转化成ASCIILCD_prints(x, y, " "); //清显示区域LCD_pos(x, y);for(i = ii; i >= 0; i--) LCD_dat(dat[i]); //输出数字字符///*--------------------------------------------------------------*/////定位输出32位二进制数字//// 0<= num <65536//void LCD_print_long(unsigned char x, unsigned char y, unsigned long num)//{////char i;//unsigned char ii;//unsigned char dat[11];//for(i = 0; i < 11; i++) dat[i] = 0; i = 0; //初始化数据//while(num / 10) //拆位//{//dat[i] = num % 10; //最低位//num /= 10; i++;//}//dat[i] = num; //最高位//ii = i; //保存dat的位数//for(; i >= 0; i--) dat[i] += 48; //转化成ASCII//LCD_prints(x, y, " "); //清显示区域//LCD_pos(x, y);//for(i = ii; i >= 0; i--)// LCD_dat(dat[i]); //输出数字字符//}/*--------------------------------------------------------------*/ //LCD初始化void LCD_init(void){#if Port_Type_Select //选择八位数据模式LCD_DISPLAY8_DOUBLE_LINE //设置LCD为16X2显示,5X7点阵,八位数据接口#elseLCD_DISPLAY4_DOUBLE_LINE //设置LCD为16X2显示,5X7点阵,四位数据接口#endifLCD_AC_AUTO_INCREMENT //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)LCD_DISPLAY_ON //LCD开显示及光标设置(光标不闪烁,不显示"_")LCD_CLR //清屏}/*--------------------------------------------------------------*/ #endif。
12864液晶4位并行接口驱动程序
12864液晶4位并行接口驱动程序#include#include#include#include#define uchar unsigned char#define uint unsigned int#define DATA 1#define COMMAND 0sbit rs=P2^4;sbit rw=P2^5;sbit en=P2^6;sbit psb=P2^1;sbit rst=P2^3;sbit key=P1^0;uchar code AC_TABLE[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置};uchar code str1[]="黄河远上白云间,一片孤城万仞山。
羌笛何须怨杨柳,春风不度玉门关。
";uchar code bmp1[]={//********************************************************//// 位图点阵占用1024字节//********************************************************//0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0 xFF,0x FF,0xFF,0xFF,0x80,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x70,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x3F,0xC0,0x00,0x07,0x07,0x00,0x04,0x01,0x00,0x 00,0x38,0x60, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x78,0xE0,0x00,0x3F,0x83,0x80,0x06,0x03,0x80,0x 00,0x1C,0x70, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x02,0x38,0x70,0x00,0xFF,0x07,0x80,0x06,0x39,0x80,0x 00,0x1F,0x70, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x02,0x1C,0x30,0x00,0x7C,0x0E,0x00,0x06,0x19,0xC0,0 x00,0x1F,0x8 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x02,0x1C,0x30,0x00,0x3E,0x1C,0x00,0x06,0x1F,0xC0,0x 00,0x7F,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x03,0x3E,0x30,0x00,0x62,0x1A,0x00,0x0F,0x79,0x00,0x 03,0xFE,0x00 ,0x00,0x01,0x80,0x00,0x00,0x60,0x0F,0x00,0x3F,0x00,0x00,0x00,0x3C,0x 00,0xC0,0x00 ,0x00,0x01,0x80,0x07,0x76,0x18,0x00,0xC3,0xC1,0x00,0x1F,0xFB,0x00,0x 03,0xFE,0x0 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x3F,0xC0,0xF1,0xC0,0x00,0x00,0xF0,0x 01,0xC0,0x0 0,0x00,0x01,0x80,0x07,0x6E,0x18,0x00,0xCF,0xC1,0x80,0x7E,0x3F,0x80,0x 01,0xE2,0x0 0,0x00,0x01,0x80,0x00,0x07,0xE0,0x7F,0xE0,0xE0,0xE0,0x00,0x03,0xC0,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x07,0x7F,0x98,0x00,0xFE,0x83,0x81,0xFC,0x1E,0xC0,0x 00,0x83,0x0 0,0x00,0x01,0x80,0x00,0x0F,0xE0,0x63,0xE1,0xE0,0xE0,0x00,0x07,0x00,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x06,0xFF,0xD8,0x01,0xFA,0x87,0x00,0xFD,0xF8,0xC0,0x 01,0x73,0x0 0,0x00,0x01,0x80,0x00,0x01,0xE0,0xC1,0xE1,0xE0,0xE0,0x00,0x0F,0x00,0x 07,0xC0,0x0 0,0x00,0x01,0x80,0x0F,0xD9,0xD8,0x03,0xE3,0x0E,0x80,0xFE,0x7E,0xC0,0 x03,0xF9,0x8 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0xE1,0xF0,0xE0,0x00,0x1E,0x00,0x 0B,0xC0,0x0 0,0x00,0x01,0x80,0x0D,0xB8,0x18,0x1F,0xC3,0x08,0xC0,0x0E,0x6D,0x80,0 x03,0xF1,0x8 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0xE0,0xFD,0xC7,0xEF,0x9E,0x00,0x 13,0xC0,0x0 0,0x00,0x01,0x80,0x0D,0xFE,0x18,0x0F,0xC2,0x10,0xE0,0x1C,0x3F,0x00,0x 03,0xE0,0xC 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0xC0,0xFF,0x83,0xC6,0x1F,0xE0,0x 13,0xC0,0x0 0,0x00,0x01,0x80,0x0D,0xCE,0x18,0x06,0xC2,0x01,0xC0,0x38,0x3E,0x00,0 x00,0xE8,0xC 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0x80,0x3F,0x81,0xE4,0x3C,0x78,0x 23,0xC0,0x00 ,0x00,0x01,0x80,0x0C,0x4C,0x18,0x00,0xC2,0x03,0x80,0x78,0x1F,0xF0,0x 00,0xFC,0x6 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x03,0x80,0x3F,0xC1,0xE8,0x3C,0x78,0x 43,0xC0,0x0 0,0x00,0x01,0x80,0x0C,0x5E,0x18,0x00,0xC2,0x07,0x00,0x68,0x3F,0xF8,0x 03,0xFC,0x2 2,0x00,0x01,0x80,0x00,0x01,0xE0,0x03,0x00,0x6F,0xC0,0xF0,0x3C,0x3C,0x 83,0xC0,0x0 0,0x00,0x01,0x80,0x06,0x3F,0x38,0x01,0x82,0x0E,0x00,0x09,0xF8,0x00,0x 03,0xC0,0x32 ,0x00,0x01,0x80,0x00,0x01,0xE0,0x06,0x00,0xC3,0xE0,0x78,0x3C,0x3C,0 xFF,0xF0,0x0 0,0x00,0x01,0x80,0x07,0x10,0x38,0x00,0x82,0x1C,0x00,0x0B,0x99,0xC0,0 x03,0x00,0x1A ,0x00,0x01,0x80,0x00,0x01,0xE0,0x0C,0x11,0xC3,0xE0,0x78,0x3C,0x3C,0 xFF,0xF0,0x0 0,0x00,0x01,0x80,0x03,0xFF,0xF0,0x00,0x02,0x38,0x00,0x08,0x30,0xE0,0x 02,0x00,0x1E ,0x00,0x01,0x80,0x00,0x01,0xE0,0x08,0x11,0xC1,0xE0,0x7C,0x3C,0x3C,0 xFF,0xF0,0x0 0,0x00,0x01,0x80,0x01,0xEF,0xF0,0x00,0x00,0xE0,0x00,0x08,0xE0,0x60,0x 00,0x00,0x0E ,0x00,0x01,0x80,0x00,0x01,0xE0,0x1F,0xF1,0xC1,0xE0,0xBC,0x1C,0x3C,0 x03,0xC0,0x 00,0x00,0x01,0x80,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x 00,0x00,0x07, 0x00,0x01,0x80,0x00,0x01,0xE0,0x3F,0xE1,0xC1,0xC0,0x9E,0x1E,0x38,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x01, 0x00,0x01,0x80,0x00,0x01,0xF0,0x7F,0xE0,0xE3,0x83,0x1F,0x0E,0x70,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x0F,0xFC,0xFF,0xE0,0x3F,0x07,0xDF,0x83,0xE0,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x60,0x00, 0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0 xFF,0x FF,0xFF,0xFF,};void writeByte(uchar flag,uchar content);void delayUs(uint z){while(z--);}void delay1MS(uchar x){uchar k,j;x=x<<1;for(k=0;k<x;k++)< p="">for(j=0;j<255;j++)_nop_();}/*------------------------------------------------检测忙位------------------------------------------------*/void CheckBusy(){uchar temp1,temp2;do{en=0;delayUs(5);rs=0;rw=1;en=1;temp1=P0; //读高字节delayUs(10);en=0;delayUs(5);rs=0;rw=1;en=1;temp2=P0; //读低字节en=0;/*数据处理*/temp1=temp1&0xf0;temp2=(temp2&0xf0)>>4;temp1=(temp1+temp2);}while((temp1&0x80)==0x80);}void init(){rst=0;delayUs(40);rst=1;delayUs(40);psb=1;delayUs(8);writeByte(COMMAND,0x20); //基本指令集4bit数据delayUs(8);writeByte(COMMAND,0x01);delayUs(8);writeByte(COMMAND,0x06);delayUs(8);writeByte(COMMAND,0x0c);delayUs(8);}/************************************************************** ************************** *** 函数名称:SendByte* 功能描述:串口发送一个字节*flag=1,写入数据。
4位总线的液晶模块的驱动程序及初始化程序
A VR单片机用I/O口4位总线的字符型液晶显示模块的部分驱动程序及初始化程序pr1: ;写入指令代码子程cbi portd,3 ;RS=0sbi portd,4 ;R/W=1pr11:cbi ddrb,7 ;置B口高四位三态输入cbi portb,7cbi ddrb,6cbi portb,6cbi ddrb,5cbi portb,5cbi ddrb,4cbi portb,4sbi portd,5 ;E=1cbi portd,5 ;E=0in temp,pinb ;读B口高四位bst temp,7 ;T=BFsbi portd,5 ;E=1cbi portd,5 ;E=0brts pr11 ;T=1跳转到pr11cbi portd,4 ;R/W=0sbi ddrb,7 ;置B口为输出sbi ddrb,6sbi ddrb,5sbi ddrb,4rcall writ ;写指令高四位swap wdc ;写指令低四位rcall writretpr2:;写入显示数据子程cbi portd,3 ;RS=0sbi portd,4 ;R/W=1pr21:cbi ddrb,7 ;置B口高四位三态输入cbi portb,7cbi ddrb,6cbi portb,6cbi ddrb,5cbi portb,5cbi ddrb,4cbi portb,4sbi portd,5 ;E=1cbi portd,5 ;E=0in temp,pinb ;读B口高四位bst temp,7 ;T=BFsbi portd,5 ;E=1cbi portd,5 ;E=0brts pr21 ;T=1跳转到pr21sbi portd,3 ;RS=1 *******cbi portd,4 ;R/W=0sbi ddrb,7 ;置B口为输出sbi ddrb,6sbi ddrb,5sbi ddrb,4rcall writ ;写指令高四位swap wdc ;写指令低四位rcall writretwrit:;对LCD写四位指令代码或显示数据子程cbi portb,7 ;清portb7,6,5,4cbi portb,6cbi portb,5cbi portb,4sbrc wdc,7 ;把com7,6,5,4传送到portb,7,6,5,4sbi portb,7sbrc wdc,6sbi portb,6sbrc wdc,5sbi portb,5sbrc wdc,4sbi portb,4sbi portd,5 ;E下降沿写入LCDcbi portd,5retint:;初始化子程ldi temp,$ff ;设置B口输出out ddrb,tempout portb,tempcbi portb,7 ;工作方式设置指令代码$30cbi portb,6sbi portb,5sbi portb,4cbi portd,3 ;RS=0cbi portd,4 ;R/W=0ldi r19,3 ;3次循环,要写入3次iint1:sbi portd,5 ;E=1cbi portd,5 ;E=0,E下降沿写入指令代码rcall delaydec r19brne iint1cbi portb,4 ;设置工作方式指令代码$20,(地址增量,画面不动) sbi portd,5 ;E下降沿写入指令代码cbi portd,5ldi wdc,$28 ;工作方式设置为4位接口,两行显示rcall pr1ldi wdc,$01 ;设置请屏rcall pr1rcall delayldi wdc,$06 ;设置为数据读写后rcall pr1ldi wdc,$0d ;设置显示方式rcall pr1retdelt: push temp ;延时子程ldi temp,$ffdet1: dec tempbrne det1pop tempretdelay:push temp ;延时子程ldi temp,$80mm1: push tempmm2: push tempmm3:dec tempbrne mm3pop tempdec tempbrne mm2pop tempdec tempbrne mm1pop tempretcg_write: ;写自定义字符库子程ldi wdc,$40 ;设置CGRAM起始地址rcall pr1ldi r19,64 ;写入64字节(8个自定义字符)ldi r22,0 ;从第0个字节依次查表写入cg1:ldi ZH,high(cgtab*2)ldi ZL,low(cgtab*2)add ZL,r22lpmmov wdc,r0rcall pr2inc r22dec r19brne cg1ret。
MS12864F图形点阵液晶显示模块使用手册
2FM12864F128SEG/64COM DOT MXTIX LCD DRIVER————————————————————————————————————————————————————————————————————————————————2一.概述MS12864F 是一种图形点阵液晶显示器。
它主要采用动态驱动原理由行驱动器、控制器和列驱动器三部分组成了128()×64(行)的全点阵液晶显示。
此显示器采用了SMD 的硬封装方式,通过导电橡胶和压框连接LCD,使其寿命长,连接可靠。
二.特性1.工作电压为+5V ±10% ,可自带驱动LCD 所需的负电压。
2.全屏幕点阵,点阵数为128(列×64(行),可显示/行)×4(行)个(16× 16点阵)汉字,也可完成图形,字符的显示。
3.与CPU 接口采用4条位控制总线和8位并行数据总线输入输出,适配 Inter8080系列时序。
4.内部有显示数据锁存器,和用于文本显示的6×8和8×8的字符库。
5.简单的操作指令。
三.外形尺寸1.外形尺寸图2.主要外形尺寸四.硬件说明1.引脚特性2FM12864F128SEG/64COM DOT MXTIX LCD DRIVER————————————————————————————————————————————————————————————————————————————————June 2004 22.原理简图3.背光接线图LED 背光19 20EL 背光19 20 +5V 0VEL ~ EL ~五、IC 说明及指令表T6963C is LCD controller designed to be used for control LCD driverLCD driver LSIs and display data Memory, It has an 8 bit parallel data bus And control lines for reading or writing through a MPU I/F.It has 128 words character generator ROM with the capability to control External display RAM of up to 128K bytes. Allocation of text, graphicsAnd external generator RAM can be easily made and the display window canBe freely moved within the allocated memory range.It supports a very board range of LCD formats by selecting different Combinations on a set of programmable inputs. It can be used in text,graphic Modes and has various attribute functions.指令表:表 24FM12864F128SEG/64COM DOT MXTIX LCD DRIVER————————————————————————————————————————————————————————————————————————————————June 2004 2六、电气参数1.ABSOLUTE MAXIMUM RATING2.OPTICAL DATA Ta=25°CWave from is switched from one selected one (θ=10°,φ=90°)Note 2: Required time for blackening ratio of segment goes down from 100% to 10% When wave from is switched from one selected one (θ=10°,φ=90°) 3.TIMING CHARACTERISICS驱动波形图6FM12864F128SEG/64COM DOT MXTIX LCD DRIVER————————————————————————————————————————————————————————————————————————————————June 2004 2读写时序图5.EL Backlight Electrical Characteristics七、功能描述7.1 STATUS READBefore sending data(read/write),command it is necessary to check the Status. Status checkStatus of T6963c can read from data lines./RD L/WR H/CE LC/D HD0∽D7 Status wordT6963C status word format is followingFM12864F 128SEG/64COM DOT MXTIX LCD DRIVER(1)Cursor pointer setThe position of cursor is specified by X address. The cursor positionIs moved only by this command. The cursor pointer doesn't have the Function of increment and decrement. The shift of cursor set by this Command. X address, Y address are specified following.X address 00H - - - - 4FH(Low 7bits are valid)Y address 00H - - - - 1FH(Low 5bits are valid)1 Screen driveX address 00H - - - - 4FHY address 00H - - - - 0FH(2) Offset register setThe offset register is used to determine external character generator RAM area.T6963C has 16 bits address lines as follow:Middle 8 bits (ad10 - ad3) are determined by character code. TheLower 3 bit (ad2 - ad10) are determined by vertical counter. TheLower 5 bit of D1(data) are valid. The data format of external character Generator RAM.(3)Address pointer setThe address pointer set command is used to indication the start address10(1) Text home address and area setThe starting address of external display RAM for text display isDefined by this command. The text home address shows the left end and Most upper position .The relationship of external display RAM address and display position Example:Text home address: 0000H Text area: 00A0H MD2=0, MD3=0: 80 COLUMN DUAL=0, MDS=1, MD0=1, MD1=0: 28 LINES(2) Graphic home address and area setThe starting address of external display RAM for Graphic display is Defined by this command. The graphic home address shows the left end most Upper line.The relationship of external display RAM address and display position. Example:Graphic home address: 0000H Graphic area: 0020HMD2=H, MD3=H: 32 COLUMNS DUAL=H, MDS=L, MD0=H, MD1=H: 2 LINES Example:7.33 MODE SETThe display mode is defined by this command. The display mode don't have changed until to send next this command. Logically "OR","EXOR',"AND" of text and graphic display can be displayed. When internal character generator mode is selected, character code 00H - 7FH are selected from built-in character generator ROM. The character code 80H-FFH are automatically selected external character generator RAM.NOTE: Only text display is attributed, because attributed data is located. Attribute function"Reverse display", "Character blink" and "Inhibit" are called "Attribute".The attribute data is written in the graphic area defined by control word set command. The mode set command selects text display only and graphic the mode set command selects text display only and graphic display cannot be displayed. The attribute data of the 1STcharacter in text area————————————————————————————————————————————————————————————————————————————————June 2004 2auto mode , "Data write(or read)" command is not necessary between each data. "Data auto write (or read)" command should follow the "Address pointer set" and address pointer is automatically increment by + 1 after each data. After sending (or receiving) all data"Auto reset" is necessary to return normal operation because all data is regarded "Display data" and no command can be accepted in the auto mode.12Note: status check for auto mode(STA2,STA3 should be checked between each Data. Auto reset should be performed after checking (STA3=1 STA2=1)display RAM to MPU. Data write/data read should be executed after setting address by address(2) When /HALT has been "L", the oscillation is stopped. It is necessary To turn off power supply for LCD, because LCD goes down by DC bias. (3) The HALF function contains the RESET function. (4) After state of RESET/HALT.FM12864F128SEG/64COM DOT MXTIX LCD DRIVER————————————————————————————————————————————————————————————————————————————————June 2004 2L: Level LF: Floating (High impedance)KO: Internal state (TEXT data access) normally open VEND: End signal of V-counter(Line count) if MDS=H, T2=L, HEND (end signal of H-count) normally open.Note 1: In Attribute mode, H or L by state of Graphinc pointer. Note 2: In Attribute mode, DATA of Graphinc pointer.八.应用举例MS12864F 与单片机8031的一种接口如图.所示:注:V0为液晶驱动电压。
AVR单片机1602四线驱动程序
/*
//连线为低四位的写法
delay_nus(16);
LCD_RS_PORT|=LCD_RS; //RS=1
LCD_DATA_PORT&=0Xf0; //清高四位
LCD_DATA_PORT|=(data>>4)&0x0f; //写高四位
LCD_en_write();
LCD_DATA_PORT&=0Xf0; //清高四位
LCD_DATA_PORT|=command&0xf0;//写低四位
LCD_en_write();
/*
//连线为低四位的写法
delay_nus(16);S=0
LCD_DATA_PORT&=0xf0; //清高四位
LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
LCD_RS_PORT|=LCD_RS;//RS=1
LCD_DATA_PORT&=0X0f;//清高四位
LCD_DATA_PORT|=data&0xf0;//写高四位
LCD_en_write();
data=data<<4;//低四位移到高四位
LCD_DATA_PORT&=0X0f;//清高四位
LCD_DATA_PORT|=data&0xf0;//写低四位
#defineLCD_EN_DDR DDRC
#defineLCD_RS_PORT PORTC//以下2个要设为同一个口
#defineLCD_RS_DDR DDRC
#defineLCD_DATA_PORT PORTA//以下3个要设为同一个口
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A VR单片机用I/O口4位总线的字符型液晶显示模块的部分驱动程序及初始化程序pr1: ;写入指令代码子程
cbi portd,3 ;RS=0
sbi portd,4 ;R/W=1
pr11: cbi ddrb,7 ;置B口高四位三态输入
cbi portb,7
cbi ddrb,6
cbi portb,6
cbi ddrb,5
cbi portb,5
cbi ddrb,4
cbi portb,4
sbi portd,5 ;E=1
cbi portd,5 ;E=0
in temp,pinb ;读B口高四位
bst temp,7 ;T=BF
sbi portd,5 ;E=1
cbi portd,5 ;E=0
brts pr11 ;T=1跳转到pr11
cbi portd,4 ;R/W=0
sbi ddrb,7 ;置B口为输出
sbi ddrb,6
sbi ddrb,5
sbi ddrb,4
rcall writ ;写指令高四位
swap wdc ;写指令低四位
rcall writ
ret
pr2: ;写入显示数据子程
cbi portd,3 ;RS=0
sbi portd,4 ;R/W=1
pr21: cbi ddrb,7 ;置B口高四位三态输入
cbi portb,7
cbi ddrb,6
cbi portb,6
cbi ddrb,5
cbi portb,5
cbi ddrb,4
cbi portb,4
sbi portd,5 ;E=1
cbi portd,5 ;E=0
in temp,pinb ;读B口高四位
bst temp,7 ;T=BF
sbi portd,5 ;E=1
cbi portd,5 ;E=0
brts pr21 ;T=1跳转到pr21
sbi portd,3 ;RS=1 *******
cbi portd,4 ;R/W=0
sbi ddrb,7 ;置B口为输出
sbi ddrb,6
sbi ddrb,5
sbi ddrb,4
rcall writ ;写指令高四位
swap wdc ;写指令低四位
rcall writ
ret
writ: ;对LCD写四位指令代码或显示数据子程cbi portb,7 ;清portb7,6,5,4
cbi portb,6
cbi portb,5
cbi portb,4
sbrc wdc,7 ;把com7,6,5,4传送到portb,7,6,5,4
sbi portb,7
sbrc wdc,6
sbi portb,6
sbrc wdc,5
sbi portb,5
sbrc wdc,4
sbi portb,4
sbi portd,5 ;E下降沿写入LCD
cbi portd,5
ret
int: ;初始化子程
ldi temp,$ff ;设置B口输出
out ddrb,temp
out portb,temp
cbi portb,7 ;工作方式设置指令代码$30
cbi portb,6
sbi portb,5
sbi portb,4
cbi portd,3 ;RS=0
cbi portd,4 ;R/W=0
ldi r19,3 ;3次循环,要写入3次
iint1: sbi portd,5 ;E=1
cbi portd,5 ;E=0,E下降沿写入指令代码
rcall delay
dec r19
brne iint1
cbi portb,4 ;设置工作方式指令代码$20,(地址增量,画面不动) sbi portd,5 ;E下降沿写入指令代码
cbi portd,5
ldi wdc,$28 ;工作方式设置为4位接口,两行显示
rcall pr1
ldi wdc,$01 ;设置请屏
rcall pr1
rcall delay
ldi wdc,$06 ;设置为数据读写后
rcall pr1
ldi wdc,$0d ;设置显示方式
rcall pr1
ret
delt: push temp ;延时子程
ldi temp,$ff
det1: dec temp
brne det1
pop temp
ret
delay: push temp ;延时子程
ldi temp,$80
mm1: push temp
mm2: push temp
mm3: dec temp
brne mm3
pop temp
dec temp
brne mm2
pop temp
dec temp
brne mm1
pop temp
ret
cg_write: ;写自定义字符库子程
ldi wdc,$40 ;设置CGRAM起始地址
rcall pr1
ldi r19,64 ;写入64字节(8个自定义字符)
ldi r22,0 ;从第0个字节依次查表写入
cg1: ldi ZH,high(cgtab*2)
ldi ZL,low(cgtab*2)
add ZL,r22
lpm
mov wdc,r0
rcall pr2
inc r22
dec r19
brne cg1
ret。