ljt4810 发表于 2007-11-29 22:20:33

一段关于LCM128647写数据/指令的程序,谁能帮忙解释一下

马老师你好:
    我最近用MEGA64调试LCM128647,有段程序不懂,马老师能否帮忙解释一下?
;****************************************************************************************
;        写LCD模块左半部分指令
;        指令输入:r17
;****************************************************************************************
WriteLeftLCDIns:
;
                lds r16, LCDCRAddrL
                sbrc r16, LCDBusy
                rjmp WriteLeftLCDIns
;
                sts LCDCWAddrL, r17
;
                ret
;****************************************************************************************
;        写LCD模块左半部分数据
;        数据输入:r17
;****************************************************************************************
WriteLeftLCDData:
                lds r16, LCDCRAddrL
                sbrc r16, LCDBusy
                rjmp WriteLeftLCDData
;
                sts LCDDWAddrL, r17
                ret
1.其中LCDCRAddrL和LCDCWAddrL及LCDDWAddrL是指什么?怎么定义?谢谢!

machao 发表于 2007-11-30 20:16:52

照搬的程序?自己有汇编的基础吗?没有先老老实实的学,把基础打好.

1.查看搬来程序的头部,或.H文件,里面应该有LCDCRAddrL和LCDCWAddrL及LCDDWAddrL的定义.

2.LCDCRAddrL和LCDCWAddrL及LCDDWAddrL应该是定义的3个RAM空间地址,该地址对应LCD的3个接口.从字面看
LCDCRAddrL 为LCD的控制寄存器读地址的低8位
LCDCWAddrL 为LCD的控制寄存器写地址的低8位
LCDDWAddrL 为LCD的数据存器写地址的低8位

能明白吗?另外知道LCDBusy是什么吗?

ljt4810 发表于 2007-11-30 21:28:22

1.这是老板以前写的一个框架,里面没有三个参数的定义.我以前用51调试过12232的液晶,读状态和写指令,数据都是通过I/O口和时序操作,原理很明朗.其实我知道三个参数的意思,但不知道是怎么定义,与什么有管?马老师能否拿其中一参数具体讲讲?
   2.LCDBusy是测忙碌的,这个俺知道.
   3.液晶可以不用时序读写数据吗?

machao 发表于 2007-12-1 00:28:25

从这段代码分析,可能使用的AVR带并口总线扩展的,LCD是采用并口总线连接使用(速度快),不是采用I/O方式操作的.

在指令中LCDCRAddrL是内存空间(外扩)的地址,估计是映射到LCD控制寄存器的低8位,读该地址即读LCD控制寄存器低字节.


;****************************************************************************************
;      写LCD模块左半部分指令
;      指令输入:r17
;****************************************************************************************
WriteLeftLCDIns:
;
                lds r16, LCDCRAddrL ;读LCDCRAaddL(内存空间单元)数据到寄存器r16
                sbrc r16, LCDBusy   ;LCDBusy应该是LCDCR寄存器中的一位,上面在r16中读到了该寄存器的数,
                                    ;本句判断LCDBusy是否为为"0";"1"表示忙.sbrc指令为判寄存器某位为0则跳过一条指令执行.
                rjmp WriteLeftLCDIns;不为"0"执行该句,转上句循环读
;
                sts LCDCWAddrL, r17 ;为"0"跳过上句,执行本句.
;
                ret

ljt4810 发表于 2007-12-1 11:00:55

.equ        LCDPORT                = PORTC       
.equ        LCDA0                = PINE3
.equ        LCDRD                = PINE4
.equ        LCDWR                = PINE5
.equ        LCDCS1                = PINE6
.equ        LCDCS2                = PINE7
.equ        LCDELEN                = PINF0
硬件复位,这种接法不是I/O口间接访问吗? AVR带并口总线扩展是不是指的地址总线方式? 51里P0为低地址,P2为高地址,那AVR中地址是怎么分配呢?

machao 发表于 2007-12-1 20:41:03

只有第一个定义是一个寄存器:PORTC,其它是数字3\4\5\6\7\0.

还需要硬件图和更多东西定义才能知道.另外,你需要先好好学习AVR,这样才能真正看懂AVR的汇编.
页: [1]
查看完整版本: 一段关于LCM128647写数据/指令的程序,谁能帮忙解释一下