导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→LCD1502驱动程序[哈佛]

 *第28995篇: LCD1502驱动程序

  
楼 主:哈佛 2005年1月9日12:39
 LCD1502驱动程序
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)
;注 全屏清除子程序不需入口直接调用就行  而半屏清除子程序在调用前入口与半屏显示子程序相同
#include  "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

 
 

  
2楼:szriley 2011年4月18日17:18
 [讨论]
支持楼主,学收中!

深圳市瑞利电子有限公司
杨先生  13544098165

专业代理分销驱动IC:SMD910/SMD911/SMD912/SMD913/SMD801/SMD802/SMD2576/SMD2596/SMD34063
/SMD733/SMD735/SMD736/SMD1117/SMD317/SMD3526/SMD431/SMD653/SMD78L05


TEL:0755-33133254 FAX:0755-83057565
MSN:szriley_ic@hotmail.com   QQ:1559341877
E-mail:szriley_ic@126.com

  
3楼:ic电子 2011年10月21日16:04
 光耦的输出类型分
最常用的分类是按光耦的输出类型分
代理销售品牌光电耦合器下面各类品牌    FAIRCHI、VISHAY、NEC、SHARP、TOSHIBA、LITE-ON、AVAGO
光耦输出类型有5种[/color]
1.三极管输出类型的光耦
2.高速输出类型的光耦;
3.逻辑IC输出类型的光耦;
4.可控硅输出类型的光耦;
5.继电器输出类型的光耦
LTV-357T-D
LTV-827#
MOC3063S-TA1
LTV-817S篇幅问题,未能详写,
深圳市路利斯科技有限公司
公司网站

联系人:陈先生,
联系电话:0755-82807689 
QQ:1043301669


>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:求windows键盘编码表

[下一篇主题]:求助:关于ftp出现错误