历史上的今天
返回首页

历史上的今天

今天是:2025年01月16日(星期四)

正在发生

2018年01月16日 | LCD1502驱动程序

2018-01-16 来源:eefocus

--------------------------------------------------------------------------------
;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

推荐阅读

史海拾趣

Gigavac LLC公司的发展小趣事

对于数-模转换(D/A转换)用高稳定度稳压电源电路,网友可能提出多个方面的问题。以下是一些可能的问题及其详细回答:

问题一:为什么数-模转换需要高稳定度的稳压电源?

回答
数-模转换器(D/A转换器)将数字信号转换为模拟信号,其输出精度和稳定性直接受到供电电源的影响。高稳定度的稳压电源能够确保D/A转换器在转换过程中电压波动小,从而减小转换误差,提高转换精度。此外,稳定的电源还能保护D/A转换器免受电压波动可能引起的损坏,延长其使用寿命。

问题二:如何设计高稳定度的稳压电源电路?

回答
设计高稳定度的稳压电源电路通常需要考虑以下几个方面:

  1. 选择合适的稳压元件
    • 稳压二极管(齐纳二极管):具有稳定的反向击穿电压,可作为简单的稳压元件。
    • 线性稳压器(LDO):提供低噪声、高精度的输出电压,适用于对电源噪声敏感的场合。
    • 开关稳压器:效率高,但可能引入一定的纹波噪声,需要适当的滤波电路设计。
  2. 优化电源滤波
    • 在稳压电源的输出端加入滤波电容,以减小输出电压的纹波和噪声。
    • 对于开关稳压器,可能需要额外的LC滤波电路来进一步降低纹波。
  3. 考虑温度稳定性
    • 温度变化会影响元件的性能,因此在设计时应考虑元件的温度系数,并采取适当的温度补偿措施。
  4. 采用反馈控制
    • 通过引入电压反馈控制环路,可以实时监测输出电压并调整稳压元件的工作状态,以保持输出电压的稳定。
  5. 选用高质量的元件
    • 使用低漂移、高精度的电阻、电容等元件,以提高电源电路的整体稳定性。

问题三:如何评估稳压电源的稳定度?

回答
评估稳压电源的稳定度通常需要考虑以下几个方面:

  1. 输出电压的纹波和噪声
    • 使用示波器测量输出电压的纹波和噪声水平,确保其在可接受的范围内。
  2. 负载调整率
    • 在不同负载条件下测量输出电压的变化量,评估电源对负载变化的响应能力。
  3. 线性调整率
    • 在输入电压变化时测量输出电压的变化量,评估电源对输入电压变化的抵抗能力。
  4. 温度稳定性
    • 在不同温度条件下测量输出电压的变化量,评估电源的温度稳定性。
  5. 长期稳定性
    • 在长时间运行后测量输出电压的变化量,评估电源的长期使用稳定性。

问题四:有哪些常见的稳压电源故障及其解决方案?

回答
常见的稳压电源故障及其解决方案包括:

  1. 输出电压不稳定
    • 检查稳压元件是否损坏或老化。
    • 检查滤波电容是否失效或容量不足。
    • 检查反馈控制环路是否正常工作。
  2. 无输出电压
    • 检查输入电源是否正常。
    • 检查保险丝是否熔断。
    • 检查稳压元件是否短路或开路。
  3. 输出电压过高或过低
    • 调整稳压元件的工作参数。
    • 检查负载是否过大或过小。
    • 检查输入电压是否在正常范围内。
  4. 温度过高
    • 检查散热系统是否正常工作。
    • 考虑增加散热装置或降低负载。

通过以上问题和答案的梳理,可以帮助网友更全面地了解数-模转换用高稳定度稳压电源电路的设计、评估和维护等方面的知识。

Dynachip Corp公司的发展小趣事

Dynachip Corp深知品质对于电子产品的重要性,因此他们建立了严格的质量管理体系,从原材料采购到生产过程再到成品检测,每一个环节都严格把控。他们还引进了先进的生产设备和技术,确保产品的稳定性和可靠性。这种对品质的坚持使Dynachip Corp的产品在市场上获得了广泛认可,客户群逐渐扩大。

ADDtek公司的发展小趣事

Dynachip Corp公司成立于21世纪初,最初是由几位在半导体领域有深厚背景的科学家和工程师共同创立的。他们在大学实验室里共同研发出了一种新型的芯片技术,这种技术具有更高的集成度和更低的能耗。凭借这一创新技术,Dynachip Corp公司正式成立,并开始了从实验室到市场的转化过程。他们积极与投资者接洽,筹集资金,并建立了生产线,将这一技术转化为实际产品。

Heraeus公司的发展小趣事

Dynachip Corp公司成立于21世纪初,最初是由几位在半导体领域有深厚背景的科学家和工程师共同创立的。他们在大学实验室里共同研发出了一种新型的芯片技术,这种技术具有更高的集成度和更低的能耗。凭借这一创新技术,Dynachip Corp公司正式成立,并开始了从实验室到市场的转化过程。他们积极与投资者接洽,筹集资金,并建立了生产线,将这一技术转化为实际产品。

GeneSiC Semiconductor公司的发展小趣事

Dynachip Corp公司成立于21世纪初,最初是由几位在半导体领域有深厚背景的科学家和工程师共同创立的。他们在大学实验室里共同研发出了一种新型的芯片技术,这种技术具有更高的集成度和更低的能耗。凭借这一创新技术,Dynachip Corp公司正式成立,并开始了从实验室到市场的转化过程。他们积极与投资者接洽,筹集资金,并建立了生产线,将这一技术转化为实际产品。

GREATECS公司的发展小趣事

Dynachip Corp公司成立于21世纪初,最初是由几位在半导体领域有深厚背景的科学家和工程师共同创立的。他们在大学实验室里共同研发出了一种新型的芯片技术,这种技术具有更高的集成度和更低的能耗。凭借这一创新技术,Dynachip Corp公司正式成立,并开始了从实验室到市场的转化过程。他们积极与投资者接洽,筹集资金,并建立了生产线,将这一技术转化为实际产品。

问答坊 | AI 解惑

我郁闷的一年工作~

毕业于一所不出名的工科院校的电子信息工程专业,选择了一份和专业不靠谱的工作,浑浑噩噩的过了一年。公司做的是电动机,来公司之前,简单而又理所当然的认为差不多,等到了以后才发现自己的无知。这个时候,面临着诱惑,一个车间副主任的诱惑,我 ...…

查看全部问答>

与初学者谈电子制作

您一定玩过电子游戏机;使用过手电筒。如果让您亲手制作这些电子作品,您一定会感到很兴奋,很有趣。其实您只要花上几元钱,买几个电子元件,就可以通过自己的努力在几个小时内创造出自己的电子作品。通过一个小小电子产品的制作,不仅证明了您的智慧 ...…

查看全部问答>

如何学好rotel dxp2004

请教大家/我是一个刚开始学rotel dxp2004软件的。我应该从什么方面入手,学的过程应该注意些什么问题,大家有什么好的学习经验。对我们初学者指点下…

查看全部问答>

求助,关于含贴片元件的电路板制作

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 各位大侠,有没有人做过含贴片元件的印制电路板?是怎么打印到转印纸上的,怎么设置?我的pcb画在了toplayer上的  …

查看全部问答>

WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错

如题: WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错, 痛苦啊! 而且EDB容量还是比较小的,这是烦死了 …

查看全部问答>

急!!!怎么用platform builder生成lib文件!

手上已经有源码,请问怎么用PB5.0生成lib文件呢!!!很急!!!知道该怎么做的大哥大姐能不能把具体流程给我写一下!!!谢谢啦!!!…

查看全部问答>

一个关于DDS的问题

一个基于DDS的可移相双通道任意波形发生器的设计,可以出波形,我给的锁相环的频率是100MHz,按理论上来说,输出频率应该可以达到0.4*100MHz=40MHz,但是实际出的波形的频率却只有大概20MHz。我想请问各位大侠利用流水线设计的相位累加器可以提高输 ...…

查看全部问答>

无绳电话手机自动充电器电路图

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 …

查看全部问答>

STM32F107的千片价格估计能够做到多少?

                                 在淘宝上看到的都不便宜哦…

查看全部问答>

关于F28335

请问F28335中的16路12bitAD是指可以同时对16路不同的模拟信号进行采样吗? [ 本贴由 xiancheng_2005 于 2008-5-11 02:53 PM 最后编辑 ]…

查看全部问答>