找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2982|回复: 8
收起左侧

关于单片机汇编语言LCD12864初始化的问题

[复制链接]
ID:558772 发表于 2019-6-14 00:40 | 显示全部楼层 |阅读模式
100黑币
最近在做设计,要求用汇编,就模仿网上的代码。但是初始化LCD12864的时候一直在检测忙中循环。   
RS BIT P2.0
     RS BIT P2.0
    RW BIT P2.1
    E  BIT P2.2
    PSB BIT P2.3
    RST BIT P2.5
    LCD EQU P1
        
    ORG 0000H
    SJMP MAIN
    ORG 0060H
        MAIN:;CLR RS
             ;CLR RW
             ;CLR RST
             ACALL DELAY5MS
             CLR  RST
             ACALL DELAY5MS
             SETB RST
             ACALL INIT_LCD
        LOOP:ACALL DISP
             ACALL DELAY1S
             AJMP LOOP

    INIT_LCD:MOV A,#30H   ;设定基本指令集
             ACALL WR_COM   ;调用写指令
             ACALL DELAY50US
             MOV A,#30H   ;再次设定基本指令集
             ACALL WR_COM   ;调用写指令
             ACALL DELAY50US
             MOV A,#0CH   ;开显示,关光标,不显示
             ACALL WR_COM   ;调用写指令
             ACALL DELAY50US
             MOV A,#01H   ;清屏
             ACALL WR_COM   ;调用写指令
             ACALL DELAY50US
             MOV A,#06H   ;指定在资料写入或读取时,光标的移动方向
             ACALL WR_COM   ;调用写指令
             ACALL DELAY50US
             RET
            
        DISP:MOV A,#80H   ;将首地址送入12864
             ACALL WR_COM   ;调用写命令
             ACALL DELAY5MS
             MOV A,#'A'   ;传送数据给LCD
             ACALL WR_DATA  ;显示'A'
             ACALL DELAY5MS
             RET
        
      WR_COM:ACALL CHECK_BF
             CLR RS         
             CLR RW
             SETB E
             MOV LCD,A
             NOP
             NOP
             CLR E
             RET
            
     WR_DATA:ACALL CHECK_BF
             SETB RS
             CLR RW
             SETB E
             MOV LCD,A
             NOP
             NOP
             CLR E
             RET
            
    CHECK_BF:MOV LCD,#0FFH
             SETB RS
             CLR RW
             SETB E
             MOV A,LCD
             JB ACC.7,CHECK_BF
             CLR E
             RET
            
         
     DELAY1S:MOV R5,#100
          D1:MOV R6,#100
          D2:MOV R7,#50
             DJNZ R7,$
             DJNZ R6,D2
             DJNZ R5,D1
             RET
            
   DELAY50US:NOP
             NOP
             NOP
             NOP
             NOP
             RET

    DELAY1MS:ACALL DELAY50US
             ACALL DELAY50US
             RET
            
    DELAY5MS:ACALL DELAY1MS
             ACALL DELAY1MS
             ACALL DELAY1MS
             ACALL DELAY1MS
             ACALL DELAY1MS
             RET
            
             END
希望大佬们解答一下,谢谢!!!


回复

使用道具 举报

ID:123289 发表于 2019-6-14 08:08 | 显示全部楼层
实战还是仿真?
回复

使用道具 举报

ID:401564 发表于 2019-6-14 08:56 | 显示全部楼层
把延时全部换成ACALL DELAY1S,并放到12864的所有指令子程序中,这样的话就不用每次都要调用延时了
把延时加长几倍,12864执行指令都是在mS级别的
P2端口要有上拉电阻
等到12864可以正常显示了,再去修一下延时,因为1秒的延时是有点长了
回复

使用道具 举报

ID:558772 发表于 2019-6-14 09:57 | 显示全部楼层
yzwzfyz 发表于 2019-6-14 08:08
实战还是仿真?

实战,不过先仿真
回复

使用道具 举报

ID:558772 发表于 2019-6-14 10:01 | 显示全部楼层
Y_G_G 发表于 2019-6-14 08:56
把延时全部换成ACALL DELAY1S,并放到12864的所有指令子程序中,这样的话就不用每次都要调用延时了
把延时加 ...

好的,我去改下。不过我有个疑问就是P2口为什么也要加上拉电阻?P0口我知道原因,所以想问下....
回复

使用道具 举报

ID:401564 发表于 2019-6-14 10:42 | 显示全部楼层
aads635 发表于 2019-6-14 10:01
好的,我去改下。不过我有个疑问就是P2口为什么也要加上拉电阻?P0口我知道原因,所以想问下....

P2和P1都要有上拉
P2是控制12864的几个IO
P1是数据端口
回复

使用道具 举报

ID:558772 发表于 2019-6-14 10:58 | 显示全部楼层
Y_G_G 发表于 2019-6-14 08:56
把延时全部换成ACALL DELAY1S,并放到12864的所有指令子程序中,这样的话就不用每次都要调用延时了
把延时加 ...

大佬,我加了延时之后没有显示'a',倒是显示了255,百度搜不到原因,想问下哪里出错了
回复

使用道具 举报

ID:123289 发表于 2019-6-14 13:08 | 显示全部楼层
仿真:由于没有屏,所以屏不会给出状态指示,测试屏,屏不回,死等。
回复

使用道具 举报

ID:401564 发表于 2019-6-14 17:23 | 显示全部楼层
aads635 发表于 2019-6-14 10:58
大佬,我加了延时之后没有显示'a',倒是显示了255,百度搜不到原因,想问下哪里出错了

AJMP LOOP改成 JMP $   让12864只显示一次,你再跳转去的话,12864的显示地址是会自动加1的
MOV A,#'A'改成MOV A,#65 看一下是不是A
能显示就表示:输入指令和查询BF位的子程序是对的了
对于汇编,只能是这样一步一步的来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表