⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.a51

📁 我实验板带的实验程序
💻 A51
字号:

    public ClearScreen
    public _ShowHex
    public _ShowText

    ;------------------------------------------

    RS_PIN    equ  p3.0
    RW_PIN    equ  p3.1
    E_PIN     equ  p3.5

    ;------------------------------------------

    ?DT?_ShowHex?lcd  segment data overlayable
    rseg ?DT?_ShowHex?lcd

    cBytesCount: ds 1
    cRegBak1:    ds 1

    ;------------------------------------------

    ?DT?_ShowText?LCDAsm  segment data
    rseg ?DT?_ShowText?LCDAsm

    cXPos:       ds 1
    cYPos:       ds 1

    ;------------------------------------------

    LCDAsmCodeSeg segment code
    rseg LCDAsmCodeSeg


_ShowHex:
    ; input:
    ;   r7: address   r5: bytes count

    mov cBytesCount, r5
    mov a, r7
    mov r1, a

showhex_loop:
    mov a, @r1
    swap a
    anl a, #0fh
    clr c
    subb a, #0ah
    jc label2
    add a, #'A'
    sjmp label1
label2:
    add a, #(0ah + '0')
label1:
    mov cRegBak1, r1
    lcall showchar
    mov r1, cRegBak1

    mov a, @r1
    anl a, #0fh
    clr c
    subb a, #0ah
    jc label4
    add a, #'A'
    sjmp label3
label4:
    add a, #(0ah + '0')
label3:
    mov cRegBak1, r1
    lcall showchar

    mov a, #' '
    lcall showchar
    mov r1, cRegBak1

    inc r1
    djnz cBytesCount, showhex_loop
    ret


_ShowText:
    ; input:
    ;   r6:r7 : text buffer pointer (in code)

    mov DPL, r7
    mov DPH, r6
    mov b, #0

loop_show:
    mov a, b
    movc a, @a + dptr
    inc b
    jz showtext_quit
    lcall showchar
    sjmp loop_show

showtext_quit:
    ret


ClearScreen:
    lcall lcdreset
    mov cXPos, #0
    mov cYPos, #0
    ret

showchar:
    push acc
    mov a, cXPos
    mov r7, cYPos
    cjne r7, #0, line2
    sjmp setadr
line2:
    add a, #040h
setadr:
    orl a, #080h ;设置ddram地址
    lcall lcdwc
    pop acc

    lcall lcdwd ;写字符

    inc cXPos
    mov a, cXPos
    cjne a, #10h, showchar_quit
    inc cYPos
    mov cXPos, #0
showchar_quit:
    ret


lcdreset: ;初始化程序
    clr E_PIN
    call delay5ms ;延时15ms
    call delay5ms
    call delay5ms
    mov a,#38h ;显示模式设置(不检测忙信号)
    call lcdwcn ;共三次
    call delay5ms
    mov a,#38h
    call lcdwcn
    call delay5ms
    mov a,#38h 
    call lcdwcn

    mov a,#38h ;显示模式设置(以后均检测忙信号)
    call lcdwc
    mov a,#08h ;显示关闭
    call lcdwc
    mov a,#01h ;显示清屏
    call lcdwc
    mov a,#06h ;显示光标移动设置
    call lcdwc
    mov a,#0ch ;显示开及光标设置
    call lcdwc
    ret

lcdwc: ;送控制字子程序(检测忙信号)
    call waitidle

lcdwcn: ;送控制字子程序(不检测忙信号)
    clr RS_PIN ;rs=0 rw=0 e=高脉冲
    clr RW_PIN
    mov p1,a
    setb E_PIN
    nop
    clr E_PIN
    ret

lcdwd: ;写字符子程序
    call waitidle
    setb RS_PIN ;rs=1 rw=0 e=高脉冲
    clr RW_PIN
    mov p1,a
    setb E_PIN
    nop
    clr E_PIN
    ret

waitidle:
    push acc ;正常读写操作之前必须检测lcd控制器状态
    mov p1,#0ffh
    clr RS_PIN ;rs=0 rw=1 e=高电平
    setb RW_PIN
    setb E_PIN
wtd_pa:
    nop ;db7: 0 lcd控制器空闲
    jb p1.7,wtd_pa ; 1 lcd控制器忙
    clr E_PIN
    pop acc
    ret

delay5ms:
    mov r1,#25 ;延时子程序(5ms)
dl5_pa:
    mov r2,#100
    djnz r2,$
    djnz r1,dl5_pa
    ret

delay400ms:
    mov r0,#20 ;延时子程序(400ms)
dl4_pa:
    mov r1,#100
dl4_pb:
    mov r2,#100
    djnz r2,$
    djnz r1,dl4_pb
    djnz r0,dl4_pa
    ret


    end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -