打印

哪位有玩过带中文字库的12864啊,可否帮我看看那程序怎么了

[复制链接]
2104|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qyq_yu|  楼主 | 2008-4-20 19:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, se, RS, AN, ps
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;12864显示子程序
;数据传送方式为4位并行
;QIUYOUQUAN
;08.04.10
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RS_128   EQU  P1.0
RW_128   EQU  P1.1
E_128    EQU  P1.2
PSB_128  EQU  P1.3
RST_128  EQU  P1.4
DB7      BIT  P2.7
DB6      EQU  P2.6
DB5      EQU  P2.5
DB4      EQU  P2.4
;DB_128    EQU P2.0
COUNT    EQU  30H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ORG 0000H
      AJMP START
      ORG 0030H
START:MOV SP,#50H
      LCALL INT_128     ;初始化液晶
      LCALL WR_HAN
      ;MOV R5,#250
      ;LCALL WR_DZ
      SJMP $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;初始化12864
INT_128:MOV R5,#3
        LCALL DELAY1
        CLR RST_128
        NOP
        SETB RST_128
        NOP
        SETB PSB_128    ;通讯方式为4位数据并行口
        NOP
        MOV A,#20H      ;
        LCALL WI_128
        MOV A,#20H      ;20H 4位数据并口基本指令
        ACALL WI_128
        ;mov a,08h
        ;lcall wi_128
        MOV A,#10H
        LCALL WI_128
        MOV A,#01H      ;清屏
        ACALL WI_128
        MOV A,#06H      ;游标移动方向设定
        ACALL WI_128
        MOV A,#0DH      ;开显示开关不显示游标开闪烁
        ACALL WI_128
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写指令到12864
;入口参数为A
WI_128:ACALL CHK_BUSY
       CLR RS_128
       CLR RW_128
       NOP
       RLC A
       MOV DB7,C        ;写高四位指令
       RLC A
       MOV DB6,C
       RLC A
       MOV DB5,C
       RLC A
       MOV DB4,C
       SETB E_128
       NOP
       CLR E_128
       NOP
       RLC A
       MOV DB7,C       ;写低四位指令
       RLC A
       MOV DB6,C
       RLC A
       MOV DB5,C
       RLC A
       MOV DB4,C
       ;MOV DB_128,A
       SETB E_128
       NOP
       CLR E_128
       NOP
       SETB RS_128
       SETB RW_128
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写数据子程序
;入口参数A
WD_128:ACALL CHK_BUSY
       SETB RS_128
       CLR RW_128
       RLC A
       MOV DB7,C          ;写高四位数据
       RLC A
       MOV DB6,C
       RLC A
       MOV DB5,C
       RLC A
       MOV DB4,C
       SETB E_128
       NOP
       CLR E_128
       NOP                ;写低四位数据
       RLC A
       MOV DB7,C
       RLC A
       MOV DB6,C
       RLC A
       MOV DB5,C
       RLC A
       MOV DB4,C
       ;MOV DB_128
       SETB E_128
       NOP
       CLR E_128
       NOP
       SETB RS_128
       SETB RS_128
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;查忙
;RS=0,RW=1
CHK_BUSY: SETB DB7
          ;MOV DB_128,#0FFH
          CLR RS_128
          SETB RW_128
          NOP
          SETB E_128
          ;JB DB_128.7,$
          JB DB7,$
          CLR E_128
          RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;读数据
;RS=1 RW=1
;出口参数A
RD_128: LCALL CHK_BUSY
        SETB RS_128
        SETB RW_128
        MOV R4,#2
        CLR C
RD_1281:NOP
        SETB E_128
        NOP
        MOV C,DB7
        RLC A
        MOV C,DB6
        RLC A
        MOV C,DB5
        RLC A
        MOV C,DB4
        RLC A
        CLR E_128
        DJNZ R4,RD_1281
        NOP
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示汉字和字符
WR_HAN: MOV DPTR,#TAB1         ;送第一行,第二行信息显示
        MOV COUNT,#20
        MOV A,#80H
        LCALL WI_128
WR_HAN1:CLR A
        MOVC A,@A+DPTR
        LCALL WD_128
        INC DPTR
        DJNZ COUNT,WR_HAN1
        
        MOV DPTR,#TAB2        ;送第三行信息显示
        MOV COUNT,#16
        MOV A,#90H
        LCALL WI_128
WR_HAN2:CLR A
        MOVC A,@A+DPTR
        LCALL WD_128
        INC DPTR
        DJNZ COUNT,WR_HAN2

        MOV DPTR,#TAB3        ;送第四行信息显示
        MOV COUNT,#16
        MOV A,#98H
        LCALL WI_128
WR_HAN3:CLR A
        MOVC A,@A+DPTR
        LCALL WD_128
        INC DPTR
        DJNZ COUNT,WR_HAN3
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示点阵
;WR_DZ:MOV

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
TAB1: DB 31H,32H,38H,36H,34H,00H,0D2H,0BAH,0BEH,0A7H
      DB 0CFH,0D4H,0CAH,0BEH,0B3H,0CCH,0D0H,0F2H        ;第一行显示'12864液晶显示程序'
TAB2: DB 32H,30H,30H,38H,0C4H,0EAH,30H,34H,0D4H,0C2H
      DB 31H,38H,0C8H,0D5H                              ;第二行显示'2008年04月15日
TAB3: DB 0C7H,0F0H,0D3H,0D1H,0C8H,0ABH,0B1H,0E0H        ;第三行显示'丘友全编'
TAB4: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
      DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
      DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
      DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
      DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
      DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;10Ms延时
DELAY: MOV R5,#1
DELAY1:MOV R7,#100
D1:    MOV R6,#100
       DJNZ R6,$
       DJNZ R7,D1
       DJNZ R5,DELAY1
       RET
       END
不知道为什么显示的数只有一行
其他行都没显示

相关帖子

沙发
NE5532| | 2008-4-20 20:53 | 只看该作者

注意屏幕地址送对了没有,地址编址是不连续的。

使用特权

评论回复
板凳
qyq_yu|  楼主 | 2008-4-20 21:17 | 只看该作者

re

;显示汉字和字符
WR_HAN: MOV DPTR,#TAB1         ;送第一行,第二行信息显示
        MOV COUNT,#20
        MOV A,#80H
        LCALL WI_128
WR_HAN1:CLR A
        MOVC A,@A+DPTR
        LCALL WD_128
        INC DPTR
        DJNZ COUNT,WR_HAN1
        
        MOV DPTR,#TAB2        ;送第三行信息显示
        MOV COUNT,#16
        MOV A,#90H
        LCALL WI_128
WR_HAN2:CLR A
        MOVC A,@A+DPTR
        LCALL WD_128
        INC DPTR
        DJNZ COUNT,WR_HAN2

        MOV DPTR,#TAB3        ;送第四行信息显示
        MOV COUNT,#16
        MOV A,#98H
        LCALL WI_128
WR_HAN3:CLR A
        MOVC A,@A+DPTR
        LCALL WD_128
        INC DPTR
        DJNZ COUNT,WR_HAN3
        RET
这段程序是送地址和显示数据的
我检查了不知道错在哪了

使用特权

评论回复
地板
NE5532| | 2008-4-20 22:01 | 只看该作者

貌似各行送显之间没有延迟。

看一下指令表里面的延时要求。还可以把你能显的那行(估计是第一行)地址坐标更改为88、90、98,看是不是只有这个语句能生效,如果是,你的液晶没问题,程序有问题。

使用特权

评论回复
5
xhtxzxw| | 2008-4-21 02:35 | 只看该作者

嘿嘿

似乎复位时间太短了啊!!!复位的时候,RST拉低了后面搞一个长一点的延时,这个是必须的,别的没仔细看,我们一直用的串行,RST拉低的时间不够长肯定不行。

使用特权

评论回复
6
zhaoyu2005| | 2008-4-21 09:34 | 只看该作者

不知道你的和俺的是不是一样的,给你一个别人写的

;-----------------------------------------------------
;清屏
clear_screen:
    mov     byte_display_page_memory, #0
    lcall   clear_line_screen
    mov     byte_display_page_memory, #2
    lcall   clear_line_screen
    mov     byte_display_page_memory, #4
    lcall   clear_line_screen
    mov     byte_display_page_memory, #6
;    lcall clear_line_screen
;    ret
clear_line_screen:
    mov     byte_display_row_memory, #0
    mov     r3, #08h
clear_line_screen_1:
    mov     dptr, #char_kong
    lcall   display_write_32_data
    djnz    r3, clear_line_screen_1
    ret
;---------------------------------------------------
;全屏
fill_line_screen:
    mov     byte_display_row_memory, #0
    mov     r3, #08h
fill_line_screen_1:
    mov     dptr, #char_man
    lcall   display_write_32_data
    djnz    r3, fill_line_screen_1
    ret
;-----------------------------------------------------
;连续输出16字节数据到LCD屏
display_write_16_data:
    mov     r5, #8
display_write_16_data_1:
    lcall   display_select_page
    lcall   display_select_row
    clr     a
    movc    a, @a+dptr
    lcall   display_write_data
    inc     dptr
    djnz    r5, display_write_16_data_1
    inc     byte_display_page_memory
    clr     c
    mov     a, byte_display_row_memory
    subb    a, #8
    mov     byte_display_row_memory, a
    mov     r5, #8
display_write_16_data_2:
    lcall   display_select_page
    lcall   display_select_row
    clr     a
    movc    a, @a+dptr
    lcall   display_write_data
    inc     dptr
    djnz    r5, display_write_16_data_2
    dec     byte_display_page_memory
    ret
;---------------------------------------------------
;连续输出32字节数据到LCD屏
display_write_32_data:
    mov     r5, #16
display_write_32_data_1:
    lcall   display_select_page
    lcall   display_select_row
    clr     a
    movc    a, @a+dptr
    lcall   display_write_data
    inc     dptr
    djnz    r5, display_write_32_data_1
    inc     byte_display_page_memory
    clr     c
    mov     a, byte_display_row_memory
    subb    a, #16
    mov     byte_display_row_memory, a
    mov     r5, #16
display_write_32_data_2:
    lcall   display_select_page
    lcall   display_select_row
    clr     a
    movc    a, @a+dptr
    lcall   display_write_data
    inc     dptr
    djnz    r5, display_write_32_data_2
    dec     byte_display_page_memory
    ret
;-----------------------------------------------------------
display_write_data:         ;数据在A中
    nop
    ;如果列的数目大于63,则应该显示到右半屏幕,否则应该显示在左半屏幕
    ;注意,此处显示手册上给出的说明不准确
    jb      byte_display_row_memory.6, display_write_data_left
    setb    pin_display_right_cs
    sjmp    display_write_data_leftright
display_write_data_left:
    setb    pin_display_left_cs

display_write_data_leftright:
    clr     pin_display_rw
    setb    pin_display_di
    nop
    setb    pin_display_enable
    mov     p0, a
    nop
    clr     pin_display_enable
    nop
    setb    pin_display_rw
    clr     pin_display_right_cs
    clr     pin_display_left_cs
    nop
    inc     byte_display_row_memory
;    ljmp    delay_100us
;    lcall   delay_100us
    ret
;-----------------------------------------------------
display_on:
    mov     a, #3fh
    sjmp    display_write_instrument
display_off:
    mov     a, #3eh
    sjmp    display_write_instrument
;-------------------------
display_select_z:  ;此处是修改DDR和屏幕的对应关系
    mov     a, #0c0h
    sjmp    display_write_instrument
;-------------------------
display_select_page:
display_select_x:  ;此处是选择要写入的DDR的页码
    mov     a, byte_display_page_memory
    orl     a, #0f8h
    clr     acc.6
    sjmp    display_write_instrument
;-------------------------
display_select_row:
display_select_y:
    mov     a, byte_display_row_memory
    orl     a, #0c0h
    clr     acc.7
;    sjmp  display_write_instrument
;    ret
;-------------------------
display_write_instrument:   ;指令在A中
    setb    pin_display_right_cs
    setb    pin_display_left_cs
    clr     pin_display_rw
    clr     pin_display_di
    nop
    setb    pin_display_enable
    mov     p0, a
    nop
    clr     pin_display_enable
    nop
    setb    pin_display_rw
    clr     pin_display_right_cs
    clr     pin_display_left_cs
;    ljmp    delay_100us
;    lcall   delay_100us
    ret
display_write_16_data_a:
    mov     r5, #16
display_write_16_data_b:
    lcall   display_select_page
    lcall   display_select_row
    clr     a
    movc    a, @a+dptr
    lcall   display_write_data
    inc     dptr
    djnz    r5, display_write_16_data_b
    inc     byte_display_page_memory
    clr     c
    mov     a, byte_display_row_memory
    subb    a, #16
    mov     byte_display_row_memory, a
    ret
;-----------------------------------------------------
说明一下:这个屏是分左右半屏的,型号好像是rt12864A,不带字库。你可以看瑞特公司的文档,有例程

使用特权

评论回复
7
qyq_yu|  楼主 | 2008-4-23 10:32 | 只看该作者

RE

我那是上下半屏的
不过可以参考参考

使用特权

评论回复
8
qyq_yu|  楼主 | 2008-4-23 11:03 | 只看该作者

RE

复位时间我改到20MS还是不行
我把第一次送显示的起始地址分别从80H,90H,88H,98H,各行试了一遍结果
只有当起始地址为80H,和90H时才显示一行(即80H那一行或90H那一行)
如果起始地址为88或98时就只给我显示一个数

使用特权

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

本版积分规则

10

主题

20

帖子

1

粉丝