LCD1502驱动程序

发布者:caoda143最新更新时间:2018-01-16 来源: eefocus关键字:LCD1502  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

--------------------------------------------------------------------------------
;LCD部分用到的RAM  0200H~~~~021FH  用到的Rn有R15/R14
;LCD复位子程序(LCD_REST)不须要设事先置直接调用即可
;半屏显示子程序(LCD)在调用前必须送入页地址 例如:MOV.B #0B8H,LCD_PAGE_BRAM
;        CALL  #LCD    显示上屏
;       :MOV.B #0BAH,LCD_PAGE_BRAM
;        CALL  #LCD  显示下屏
;LCDUP_WORD0_BRAM~~~LCDUP_WORD6_RAM        是上屏显示字的代码寄存器一屏显示7个字
;LCDDOWN_WORD0_BRAM~~~LCDDOWN_WORD6_RAM    是下屏显示字的代码寄存器一屏显示7个字
;每屏显示是以中间为基准向两边平均显示   在调用半屏显示子程序时已经自动计算LCD的列地址
;清屏指令可分全屏清除(LCD_CLEAR_ALL)和半屏清除(LCD_CLEAR)
;注 全屏清除子程序不需入口直接调用就行  而半屏清除子程序在调用前入口与半屏显示子程序相同
#i nclude  "MSP430x14x.h"
NAME LCD
MODULE LCD
PUBLIC LCD
RSEG PROM
;=========LCD==================================
      ;A0=1为数据  A0=0为命令 
#define  A0   04H    
#define  E1   02H     
#define  E2   01H     
#define  BIT_OUT   P4OUT
#define  DATA_BUS  P2OUT
;=============LCD____8RAM的位定义===============
#define  LCD_COM_BRAM  0200H
#define  LCD_DATA_BRAM  0201H
#define  LCD_LIE_BRAM  0202H
#define  LCD_PAGE_BRAM  0203H
;=============LCD_UP_RAM============================
#define  LCDUP_WORD0_BRAM 0204H
#define  LCDUP_WORD1_BRAM 0205H
#define  LCDUP_WORD2_BRAM 0206H
#define  LCDUP_WORD3_BRAM 0207H
#define  LCDUP_WORD4_BRAM 0208H
#define  LCDUP_WORD5_BRAM 0209H
#define  LCDUP_WORD6_BRAM 020AH
;==========下面的RAM只是在测试状态下才会用到=====
#define  LCDUP_WORD7_BRAM 020BH
;=============LCD_DOWN_RAM=====================
#define  LCDDOWN_WORD0_BRAM 020CH
#define  LCDDOWN_WORD1_BRAM 020DH
#define  LCDDOWN_WORD2_BRAM 020EH
#define  LCDDOWN_WORD3_BRAM 020FH
#define  LCDDOWN_WORD4_BRAM 0210H
#define  LCDDOWN_WORD5_BRAM 0211H
#define  LCDDOWN_WORD6_BRAM 0212H
;==========下面的RAM只是在测试状态下才会用到=====
#define  LCDDOWN_WORD7_BRAM 0213H
;=============LCD_数据寄存器_RAM=================
#define  LCD_R0_BRAM  0214H 
#define  LCD_R1_BRAM  0215H 
;=============LCD____16RAM的位定义===============
#define  LCD_COUNT_WRAM  021CH
#define  LCD_WORD_WRAM  021EH
;=============LCD____BIT的位定义===============
#define  LCD_BIT_RAM  0220H
#define  LCD_E1_E2  0000H 
      ;是LCD左右屏选择为BIT=1选通左边  BIT=0选通右边 
#define  LCD_INV   02H 
                                             ;高电平时显示反白 
;---------------------------------------------------       
;=========================================================== 
LCD_E1_COM
        BIC.B  #A0,&BIT_OUT        ;A0置低 设为命令通道
MOV.B  LCD_COM_BRAM,&LCD_BUS ;输出命令
BIS.B  #E1,&BIT_OUT ;开E1
BIC.B  #E1,&BIT_OUT ;关E1
RET     ;反回

LCD_E2_COM
BIC.B  #A0,&BIT_OUT ;A0置低 设为命令通道
MOV.B  LCD_COM_BRAM,&LCD_BUS ;输出命令
BIS.B  #E2,&BIT_OUT ;开E2
BIC.B  #E2,&BIT_OUT ;关E2
RET     ;反回


LCD_E1_DATA
BIS.B  #A0,&BIT_OUT ;A0置高 设为命令通道
MOV.B  LCD_DATA_BRAM,&LCD_BUS ;输出命令
BIS.B  #E1,&BIT_OUT ;开E1
BIC.B  #E1,&BIT_OUT ;关E1
RET     ;反回

LCD_E2_DATA
BIS.B  #A0,&BIT_OUT ;A0置高 设为数据通道
MOV.B  LCD_DATA_BRAM,&LCD_BUS ;输出命令
BIS.B  #E2,&BIT_OUT ;开E2
BIC.B  #E2,&BIT_OUT ;关E2
RET     ;反回
;================CLEAR_LCD_DISPALY==============
;每次直接调用程序就可以清全屏显示 不须入口
LCD_CLEAR_ALL
CLR  R15
CLR  R14
LCD_CLEAR_ALL_1
BIS.B  #0B8H,R15
MOV.B  R15,LCD_COM_BRAM
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM
MOV.B  #00H,LCD_COM_BRAM
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM
MOV.B  #61D,R14
LCD_CLEAR_ALL_2
MOV.B  #000H,LCD_DATA_BRAM
CALL  #LCD_E1_DATA
CALL  #LCD_E2_DATA
CLRZ
DEC.B  R14
JNZ  LCD_CLEAR_ALL_2
INC.B  R15
CLRZ
CMP.B  #0BCH,R15
JNE  LCD_CLEAR_ALL_1
RET
;================CLEAR_LCD_DISPALY=============
;每次直接调用程序就可以清半屏显示   
;调用前必须送入页地址到LCD_PAGE_RAM(页地址寄存器)
;例如:MOV.B #0B8H,LCD_PAGE_BRAM   
;      :CALL #LCD_CLEAR 就是清上半屏显示
;      :MOV.B #0BAH,LCD_PAGE_BRAM   
;      :CALL #LCD_CLEAR 就是清下半屏显示
LCD_CLEAR
CLR  R15
MOV.B  LCD_PAGE_BRAM,LCD_LIE_BRAM
ADD.B  #2D,LCD_LIE_BRAM
LCD_CLEAR_1
BIS.B  LCD_PAGE_BRAM,R15  
MOV.B  R15,LCD_COM_BRAM
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM
MOV.B  #00H,LCD_COM_BRAM
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM
MOV  #61D,R14
LCD_CLEAR_2
MOV.B  #00H,LCD_DATA_BRAM
CALL  #LCD_E1_DATA
CALL  #LCD_E2_DATA
CLRZ
DEC.B  R14
JNZ  LCD_CLEAR_2
INC.B  R15
CLRZ
CMP.B  LCD_LIE_BRAM,R15
JNZ  LCD_CLEAR_1
RET

;===============RESETTING_LCD_MODE=============
;调用此程序是使LCD复位并进入工作状态
LCD_REST
MOV.B  #0E2H,LCD_COM_BRAM ;复位
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM

MOV.B  #0A4H,LCD_COM_BRAM ;关闭休闲状态
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM

MOV.B  #0A9H,LCD_COM_BRAM ;设置1/32占空比
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM

MOV.B  #0A0H,LCD_COM_BRAM ;正向排序设置
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM

MOV.B  #0C0H,LCD_COM_BRAM ;设置显示起始行为第一行
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM

MOV.B  #0AFH,LCD_COM_BRAM ;开显示设置
CALL  #LCD_E1_COM
CALL  #LCD_E2_COM
RET

;查LCD PAGE #0B8H.#0B9H/#0BAH.#0BBH上屏须要显示的个数 
;这段程序已测试过  03-3-12 9:55
;R15/R14/R13
LCD_CHK
CLR  LCD_COUNT_RAM
MOV.B  #8,LCD_R0_RAM  ;查殉上屏须要显示的个数,一屏最多可以显示7个16X16
CLR.B  LCD_LIE_BRAM  ;清上屏查殉结果寄存器
MOV  LCD_WORD_RAM,R14 ;把须要检查字的首位16位地址放进R14.LCD_WORD_RAM
      ;定义时必须是16位地址
LCD_CHK_0
DEC.B  LCD_R0_RAM
JZ  LCD_CHK_1  ;测试完成退出
CLRZ 
MOV.B  @R14+,LCD_COUNT_RAM
TST.B  LCD_COUNT_RAM  ;测试每个字寄存器是否为零
JZ  LCD_CHK_0  ;为零时转
INC.B  LCD_LIE_BRAM  ;大于零查殉结果寄存器加一
JMP  LCD_CHK_0  ;反回测试
LCD_CHK_1 
        CLR             LCD_COUNT_RAM
        MOV.B           LCD_LIE_BRAM,LCD_COUNT_RAM
MOV  LCD_COUNT_RAM,&MPY ;把检测的结果乘以16
MOV  #16D,&OP2
MOV  &RESLO,LCD_COUNT_RAM ;相乘的结果放回寄存器
MOV.B  LCD_COUNT_RAM,LCD_LIE_BRAM
RRA.B           LCD_LIE_BRAM             ;结果除2.放到上屏页的寄存器
MOV.B  #61D,LCD_COUNT_RAM
SUB.B  LCD_LIE_BRAM,LCD_COUNT_RAM
MOV.B  LCD_COUNT_RAM,LCD_LIE_BRAM
RET
;调用前必须把要显示屏第一个字的地址放在R15内 
;列:MOV  #LCDUP_WORD0_BRAM,LCD_WORD_RAM
       ;MOV  #LCDDOWN_WORD0_BRAM,LCD_WORD_RAM 
       ;用到的寄存器R15/R14
LCD
CLRZ
CMP.B  #0B8H,LCD_PAGE_BRAM
JNE  LCD_1
MOV  #LCDUP_WORD0_BRAM,LCD_WORD_RAM
JMP  LCD_0
LCD_1 MOV  #LCDDOWN_WORD0_BRAM,LCD_WORD_RAM
LCD_0 CALL  #LCD_CHK
BIS.B  #BIT0,LCD_BIT_RAM
MOV.B  #7D,LCD_R1_RAM  
;每次调用均连续显示7个16X16的字  而遇到字寄存器是
MOV  LCD_WORD_RAM,R15 ;零就反回因为字表里面是没有零的
LCD_DISPALY
CLR  R14
        MOV.B           @R15+,R14
TST  R14   ;R15是显示字首位地址寄存器,准备用于间接寻址
JZ  LCD_RET   ;字寄存器是零就反回
MOV  #32D,&MPY  ;查表然后吧结果送到寄存器
MOV  R14,&OP2
MOV  &RESLO,LCD_COUNT_RAM
ADD  #LCD_DB,LCD_COUNT_RAM
MOV  LCD_COUNT_RAM,R14
MOV.B  #32D,LCD_R0_RAM  ;R14用于放计算查找数据的个数
LCD_PAGE 
MOV.B  LCD_PAGE_BRAM,LCD_COM_BRAM;把页地址送到命令寄存器
CLRZ
BIT.B  #BIT0,LCD_BIT_RAM
;LCD_BIT_RAM的BIT0=LCD_E1_E2为高时转到E1发送,第就是E2
JZ  LCD_PAGE_E2  ;Z为零就转到E2  否则向下工作
LCD_PAGE_E1 
CALL  #LCD_E1_COM  ;向E1发送页地址
JMP  LCD_LIE   ;跳去列发送
LCD_PAGE_E2 
CALL  #LCD_E2_COM  ;向E2发送页地址
LCD_LIE 
MOV.B  LCD_LIE_BRAM,LCD_COM_BRAM;把列地址送到命令寄存器
CLRZ
BIT.B  #BIT0,LCD_BIT_RAM
;LCD_BIT_RAM为高时转到E1发送,第就是E2
JZ  LCD_LIE_E2  ;Z为零就转到E2  否则向下工作
LCD_LIE_E1 
CALL  #LCD_E1_COM  ;向E1发送列地址
JMP  LCD_DATA
LCD_LIE_E2 
CALL  #LCD_E2_COM  ;向E2发送列地址
LCD_DATA
CALL  #LCD_FIND_DATA  ;调用数据发送命令
CLRZ
BIT.B  #BIT0,LCD_PAGE_BRAM ;测试页寄存器的BIT0位
JNZ  LCD_PAGE_0  ;大于零(即是BIT0=1)就转
BIS.B  #BIT0,LCD_PAGE_BRAM ;把页寄存器的BIT0位置高(原来是低#0B8H/#0BAH)
JMP  LCD_RETURN  
LCD_PAGE_0 
BIC.B  #BIT0,LCD_PAGE_BRAM ;把页寄存器的BIT0位置低(原来是高#0B9H/#0BBH)
INC.B  LCD_LIE_BRAM  ;列地址加一
CLRZ
CMP.B  #61D,LCD_LIE_BRAM  ;检查列有没有超过61列
JNZ  LCD_RETURN  ;Z大于零就转  等于零就向下工作
CLR.B  LCD_LIE_BRAM  ;清列寄存器
CLRZ 
BIT.B  #BIT0,LCD_BIT_RAM ;测试LCD_BIT_RAM位  在E1就转为E2 在E2就立即反回 
JNZ  LCD_PAGE_1  ;Z为零就转到E2  否则向下工作
JMP  LCD_RET   ;转到子程序反回命令
LCD_PAGE_1 
BIC.B  #BIT0,LCD_BIT_RAM ;把LCD_BIT_RAM位置低  设为E2显示状态
JMP  LCD_PAGE  ;反回页传送命令地址
LCD_RETURN 
CLRZ 
DEC.B  LCD_R0_RAM  ;查找数据的个数寄存器减1
JNZ  LCD_PAGE  ;R14大于零转回页传送命令地址
CLRZ
DEC.B  LCD_R1_RAM  ;字个数寄存器减1
BIC.B  #BIT0,LCD_PAGE_BRAM
JNZ  LCD_DISPALY  ;反回主显示调用程序
LCD_RET
RET     ;反回主程序

;=================================================== 
LCD_FIND_DATA  
MOV.B  @R14+,LCD_DATA_BRAM 
CLRZ
BIT.B  #INV_BIT,LCD_BIT_RAM
JZ  NO_INV
INV.B  LCD_DATA_BRAM
NO_INV CLRZ
BIT.B  #BIT0,LCD_BIT_RAM ;测试LCD_BIT_RAM位  在E1就转为E2 在E2就立即反回
JZ  LCD_FIND_E2  ;Z为零就转到E2  否则向下工作
CALL  #LCD_E1_DATA  ;调用E1数据发送子程序
JMP  LCD_FIND_DATA_RET
LCD_FIND_E2 
CALL  #LCD_E2_DATA  ;调用E2数据发送子程序
LCD_FIND_DATA_RET 
RET
END LCD

关键字:LCD1502  驱动程序 引用地址:LCD1502驱动程序

上一篇:51单片机汉字液晶子程序 液晶屏分为4行*12列汉字
下一篇:水泵定时控制实验

推荐阅读最新更新时间:2024-03-16 15:53

PIC16Fxxx的LCD驱动程序(适用于HD44780兼容的驱动器)
P IC 16Fxxx的 LCD 驱动程序(适用于HD44780兼容的驱动器) ;************************************************ ;* LCD.ASM * ;************************************************ ;* Contains subroutines to control an external * ;* lcd panel in 4-bit mode. These routines * ;* were designed specifically for the panel on * ;* t
[单片机]
在HCS08系列MCU上用软件实现仪表步进电机的驱动
步进电机由于具有角位移和输入脉冲数成正比并且没有累积误差的特点,而被广泛的用作汽车仪表的显示部件,其中具有代表性的是伟力驱动技术(深圳)有限公司的VID29系列步进电机。在多数情况下,人们会使用专用的驱动芯片来驱动步进电机,主控制器只需要给出方向控制信号和控制转动步数的脉冲就行了。另外,也有集成了步进电机驱动电路的MCU,如Freescale的MC9S12HY系列,其使用方法也比较简单。然而,在很多较低端的汽车仪表,如微型车、农用车、三轮货车和摩托车的仪表上,人们为了降低成本,希望能够不用专用驱动芯片或相对较贵的带驱动电路的MCU,而是用普通的MCU直接去驱动步进电机。本应用笔记介绍了在Freescale的HCS08系列MC
[汽车电子]
在HCS08系列MCU上用软件实现仪表步进电机的驱动
10-S3C2440驱动学习(四)嵌入式linux-LCD驱动程序
核心层的代码以fbmem.c为主,核心层包括许多与具体硬件无关的代码,并且提供了API给用户空间。用户空间使用系统调用,系统调用会使用相应的API函数,最后会调用驱动层实现功能。最终操作到硬件,对于不同的设备,驱动层的代码将有所不同。 一、LCD内核驱动实现分析 内核中包含了LCD驱动程序S3c2410fb.c,通过platform平台驱动框架实现,参考其现在自己写。 字符设备驱动编写往往包括,那么LCD也不例外: 应用程序open的时候,会调用fbmem里面file_operation的open,这个open里面会调用硬件注册进来的结构体的一些函数和属性。 1、fbmem.c分析(内核写好的LCD驱
[单片机]
10-S3C2440驱动学习(四)嵌入式linux-LCD<font color='red'>驱动程序</font>
NAND Flash的驱动程序设计
  引言   当前各类嵌入式系统开发设计中,存储模块设计是不可或缺的重要方面。NOR和 NAND是目前市场上两种主要的非易失闪存技术。NOR Flash存储器的容量较小、写入速度较慢,但因其随机读取速度快,因此在嵌入式系统中,常用于程序代码的存储。与NOR相比,NAND闪存的优点是容量大,但其速度较慢,因为它的I/O端口只有8或16个,要完成地址和数据的传输就必须让这些信号轮流传送。NAND型Flash具有极高的单元密度,容量可以比较大,价格相对便宜。   本文以三星公司的 K9F2808UOB芯片为例,介绍了NAND Flash的接口电路与驱动的设计方法。文中介绍了开发NAND Flash驱动基本原理,意在简化嵌入式系统
[单片机]
NAND Flash的<font color='red'>驱动程序</font>设计
按键扫描驱动程序
unsigned char key,key_h,kpush; unsigned int key_l; //按键连接到p1.0、p1.1、p1.2 void int_t0(void) interrupt 1 { unsigned char dd,i; TL0=TL0+30;TH0=0xfb; //800 /* 按键判别 */ if ((P1&0x7)==0x7) { if ((key_l 30)&&(key_l 800)&&(key_h 30)) { //释放按键,如果之前按键时间少于1秒,读入键值 key=kpush; } if ((++key_h) 200) key_h=200; key_l=0; if
[单片机]
12864实际应用的驱动程序
一下程序在使用时,紧紧结合每句后面的注释进行修改,比如端口的衔接问题 这是一个12864结合ST168进行方位显示的程序: 使用技巧:只需从中复制有关12864的驱动程序,修改相关参数即可 #include reg52.h #define uchar unsigned char #define uint unsigned int //宏定义 sbit SID = P2^1; //串行数据RW端口 sbit SCLK = P2^2; //串行同步时钟 E sbit cs=P2^0; //为写rs端口 sbit psb=P2^3; uchar code display1 ={ 123 }, //定义一个要显示的
[单片机]
I2C(24C64)驱动程序
/* ******************************************************************** ******************************************************************** */ //总结: SCL为高电平时, SDA上的数据才有效 // 传输数据 SCL = 1; SDA = 1 或 SDA = 0 要求是稳定的数据 // 启动信号 SCL = 1; SDA = 1 --- 0 // 停止信号 SCL = 1; SDA = 0 --- 1 // 主要用proteus调试查看每次总线上的数据 //
[单片机]
基于嵌入式的故障诊断专家系统驱动程序设计
电子设备的故障诊断系统大多采用由传感器、工业PC、工业以太网、远程专家组成的诊断模式。现有诊断现场仪器众多、连接复杂,使得系统可靠性和稳定性难以得到保证。另一方面,要求诊断人员具备专业知识,其中包括各类传感器的固定、连接与信号处理,难以实现“现场无人,远程诊断”目标。因此有必要从现有的硬件和软件组成模式的角度出发,探索一种新的诊断系统组成模式。本文设计了基于嵌入式的故障诊断专家系统,使得对电子设备的检测及维修变得更为方便有效。 本文根据实际需要选取Windows CE.Net作为本系统的操作系统平台。在Windows CE嵌入式系统的平台开发中,设备驱动程序的开发是其很重要的一部分,它们用于驱动嵌入式系统硬件平台上的各个设备接
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved