打印

菜鸟请教LCM1602的显示问题,关于MOV A,"G",有帖程序出来

[复制链接]
2628|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
伊甸之歌|  楼主 | 2008-1-6 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, AC, C51, DDR, ST
    
    ;the LCM 1602 driving program
    ;font test:0123456789 
    ;font test:abcdefghijklmnopqrstuvwxyz
    ;font test:ABCDEFGHIJKLMYOPQRSTUVWXYZ
    ;程序来自《单片机原理与应用及C51程序设计》的208~209页,有修改
    ;仿真用的是万利的ME52仿真机,环境为MEDWIN2.39,时钟频率12MHz
    ;多谢周老兄赠送的这只仿真机,操作非常顺手
    ;开始了
    
    RS    EQU    P2.7
    RW      EQU    P2.6
    E    EQU     P2.5
    
    ORG     00H
    AJMP      START
    
    ORG    50H
    ;主程序
START:
    MOV    SP,#50H
    ACALL   INIT
    MOV    A,#10000000B    ;写入显示缓冲区起始地址为第1行,第1列
    ACALL    WC51R        
        MOV    A,#01000001B
        ACALL    WC51DDR
        MOV    A,#01000010B
        ACALL    WC51DDR
        MOV    A,#01000011B
        ACALL    WC51DDR
        MOV    A,#11000100B
        ACALL    WC51DDR
        MOV    A,#11111111B
        ACALL    WC51DDR
        MOV    A,#00101101B
        ACALL    WC51DDR        
        MOV    A,#"G"        ;按书上的方法是MOV  A,"G",但有问题
        ACALL    WC51DDR
        MOV    A,#00111111B
        ACALL    WC51DDR
        
        
        ;MOV    P2,#0FFH    ;开始怕端口有问题,测试了一下
        ;MOV    P0,#0FFH    ;开始怕端口有问题,测试了一下
LOOP:    AJMP    START            ;让LCM反复显示,不怕累倒它
        
    
    
    ;初始化子程序
INIT:      MOV        A,#00000001B    ;清屏
      ACALL     WC51R        ;调用写命令子程序
      MOV    A,#00111000B    ;使用8位数据,显示两行,5*7的字型
      LCALL    WC51R        ;调用写命令子程序
     MOV    A,#00001110B    ;显示器开,光标开,字符不闪烁
     LCALL    WC51R
     MOV    A,#00000110B     ;字符不动,光标自动右移一格
     LCALL    WC51R
     RET
     
     ;检查LCD忙子程序
F_BUSY:
     PUSH    ACC
     PUSH    DPH
     PUSH    DPL
     PUSH    PSW
WAIT:
     CLR    RS       ;选择LCM的指令寄存器
     SETB    RW      ;读指令
     CLR    E      ;LCM关
     SETB    E      ;开LCM
     MOV    A,P0      ;读出LCM的状态,送到A寄存器
     CLR    E      ;关LCM
     JB    ACC.7,WAIT;判断读出LCM数据的第7位是否为1,
               ;为1则表示LCM忙,这时跳转到WAIT继续等待,否则往下
    POP    PSW
    POP    DPL
    POP    DPH
    POP    ACC
    ACALL    DELAY
    RET
    
    ;写入命令子程序
WC51R:
    ACALL    F_BUSY    
    CLR    E    ;关LCM
    CLR    RS    ;选择LCM的指令寄存器
    CLR    RW    ;写入模式
    SETB    E    ;开LCM
    MOV    P0,ACC    ;把指令数据写入LCM
    CLR    E    ;关LCM
    ACALL    DELAY
    RET         
    
    ;写数据子程序
WC51DDR:
    ACALL    F_BUSY    
    CLR    E    ;关LCM
    SETB    RS    ;选择LCM的数据寄存器
    CLR    RW    ;写入模式
    SETB    E    ;开LCM
    MOV    P0,ACC    ;把显示数据写入LCM
    CLR    E    ;关LCM
    ACALL    DELAY
    RET                 
                          
     ;延时子程序
DELAY:
     MOV    R6,#200 ;原先是5    ,想看慢动作,改为200了
D1:    MOV    R7,#248
     DJNZ      R7,$
     DJNZ    R6,D1
     
     RET
     
     END    
     
     
     
     
     

相关帖子

沙发
伊甸之歌|  楼主 | 2008-1-6 15:42 | 只看该作者

问题是这样的,教材上给出了用1602显示GOOD BYE的例子,

书上给的例子为
MOV   A,"G"
ACALL    WC51DDR(显示处理子程序)
MOV   A,"O"
ACALL    WC51DDR(显示处理子程序)
.......
按照这样写LCM死活不显示,有时候也只有乱码,
百般无奈,试着写16进制或2进制的ASCII码,居然可以,
后来打开DISASSEMBLY CODE 窗口,
找到MOV A,"G"居然是MOV A, 47H,显然不对,
于是改为MOV A,#"G",相应的 DISASSEMBLY CODE窗口里可以看到
为MOV A,#47H,这样就可以了(如首贴的红色部分所示)。

这让我好困惑,想请教大侠们这个现象是编译器的问题,还是教材的问题?
教材是《单片机原理与应用及C51程序设计》,编译器是MEDWIN自带的。

使用特权

评论回复
板凳
john_light| | 2008-1-6 16:44 | 只看该作者

教材问题

使用特权

评论回复
地板
fabest| | 2008-1-6 20:11 | 只看该作者

不要随便怀疑编译器

使用特权

评论回复
5
mohanwei| | 2008-1-6 20:24 | 只看该作者

看一下“预编译”的知识点就清楚了……

使用特权

评论回复
6
jiangrh| | 2008-1-6 20:25 | 只看该作者

MOV A,"G"???????

MOV   A,"G", MOV    A,#"G" ???????
数据传送指令有这个吗?可能是我见识少,没用过,我们如果要发字符就直接发它的十六进制数据

使用特权

评论回复
7
伊甸之歌|  楼主 | 2008-1-7 13:11 | 只看该作者

明白了,谢谢各位的指点。

使用特权

评论回复
8
伊甸之歌|  楼主 | 2008-1-8 08:59 | 只看该作者

再请教下5楼,

请问能否提供点汇编方面的,“预编译”的资料?谢谢!

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;mohanwei 发表于 2008-1-6 20:24 侃单片机 ←返回版面    
;
;5楼: 看一下“预编译”的知识点就清楚了…… 

使用特权

评论回复
9
hotpower| | 2008-1-8 18:14 | 只看该作者

哈哈~~~楼上是对的~~~""不知道有多长呀~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

27

帖子

0

粉丝