帮帮我啊,前天在杭州买了1601液晶显示器不会用啊!
谁能举个用c51, ASM语言编个例子啊?
1621driver.asm
;ht48r30 control ht1621
;port:
; pb1 -- datum
; pb2 -- wrb
; pb3 -- csb
; pb4 -- rdb
; osc : ext. crystal
; wdt clock source: disable wdt
; input type pa: sshmitt trigger
; pull-high pa: pull-high pa
; pull-high pb: pull-high pb
; bz/bzb : bz enabel/bzb disable
; fsys: 4m
include ht48r30a-1.inc
csb equ pb.3
csbc equ pbc.3
wrb equ pb.2
wrbc equ pbc.2
datum equ pb.1
datumc equ pbc.1
rdb equ pb.4
rdbc equ pbc.4
lig equ pc.3
;----------------------------
num_mem equ [7fh]
;----------------------------
;delay 5us
d_1 macro
jmp $+1
jmp $+1
nop
endm
;-----------
lcddriver .section 'data'
count db ? ;count some cycle
code_datum db ? ;command code or memory datum bits
code_datum1 db ? ;only used in read_modify_write mode
mem_addr db ? ;memorty address for selecting segment
temp_da db ?
t_addr_h db ? ;just a buffer
;----------------------------
lock .section 'code'
org 00h
jmp start
org 04h
reti
org 08h
reti
start:
clr pb
set csb
clr pbc
set pbc.0
clr pc
clr pcc
clr intc
mov a, 50h
mov num_mem, a
mov a, 20h
mov mp0, a
clr_ram:
clr r0
inc mp0
sdz num_mem
jmp clr_ram
;----------------------------------------
ini_status:
mov a, 87h
mov tmrc, a
show_k:
set lig
mov a, 01h ;sys enable
mov code_datum, a
call send_command
lo:
mov a, 029h ;4com;1/3bias
mov code_datum, a
call send_command
mov a, 3 ;lcd on
mov code_datum, a
call send_command
call clr_lcm
jmp $+1
jmp $+1
call show_lcm
clr code_datum
mov a, 4
mov mem_addr, a
call read
mov a, 0fh
xor a, code_datum
snz z
jmp error
mov a, 2
mov code_datum, a
call send_command
jmp $+1
jmp $ ;operation is over
error:
jmp $
;******************************************
;purpose : send command
;parameter:
; code_datum : byte
;return : none
;modified : acc, status
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
send_command proc
clr csb
clr datumc
set datum
clr wrb ;command id 颼'
d_1
set wrb ;1
nop
clr datum ;00
clr wrb
d_1
set wrb
nop
clr wrb
d_1
set wrb
mov a, 8 ; send code
mov count, a
loop1:
clr datum
sz code_datum.7
set datum
rl code_datum
clr wrb
d_1
set wrb
sdz count
jmp loop1
clr wrb
d_1
set wrb
nop
set csb ;close csb signal,not selecting the chip
ret
send_command endp
;-------------------------------
;purpose : write datum to 1621
;parameter:
; code_datum : byte
; mem_addr : byte
;return : none
;modified : acc, status
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
write:
clr csb
clr datumc
set datum
clr wrb ;write mode id 颽'
d_1
set wrb
clr datum
clr wrb
d_1
set wrb
set datum
clr wrb
d_1
set wrb
mov a, 6
mov count, a
writeloop1:
clr datum
sz mem_addr.5 ;sending memory address for selecting segment
set datum
clr wrb
d_1
set wrb
rl mem_addr
sdz count
jmp writeloop1
mov a, 4
mov count, a
writeloop2:
clr datum
sz code_datum.0 ;sending memory content for deciding comments's state
set datum
clr wrb
d_1
set wrb
rr code_datum
sdz count
jmp writeloop2
set csb
ret
;-------------------------------------
;purpose : read datum from 1621
;parameter:
; mem_addr : byte
;return :
; code_datum : byte
;modified : acc, status
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
read proc
clr csb
clr datumc
set datum
clr wrb ;read mode id 飆'
d_1
set wrb
clr wrb
d_1
set wrb
clr datum
clr wrb
d_1
set wrb
mov a, 6
mov count, a
readloop1:
clr datum
sz mem_addr.5 ;sending memory address for selecting segment
set datum
clr wrb
d_1
set wrb
rl mem_addr
sdz count
jmp readloop1
set datumc
mov a, 4
mov count, a
readloop2:
clr rdb
d_1
set rdb
rr code_datum
clr code_datum.3
sz datum ;sending memory content for deciding comments's state
set code_datum.3
sdz count
jmp readloop2
mov a, 0fh
andm a, code_datum
set csb
ret
read endp
;------------------------------------------
;-------------------------------------
;purpose : read datum from 1621, then write a datum in the same register
;parameter:
; mem_addr : byte
;return : none
;modified : acc, status
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rm_write proc
clr csb
clr datumc
set datum
clr wrb ;read-modify-write mode id 颽'
d_1
set wrb
clr datum
clr wrb
d_1
set wrb
set datum
clr wrb
d_1
set wrb
mov a, 6
mov count, a
rmwloop1:
clr datum
sz mem_addr.5 ;sending memory address for selecting segment
set datum
clr wrb
d_1
set wrb
rl mem_addr
sdz count
jmp rmwloop1
set datumc
mov a, 4
mov count, a
rmwloop2:
clr rdb
d_1
set rdb
rr code_datum1
clr code_datum1.3
sz datum ;read memory content out
set code_datum1.3
sdz count
jmp rmwloop2
mov a, 0fh
andm a, code_datum1
clr datumc
mov a, 4
mov count, a
mov a, temp_da
andm a, code_datum
rmwloop3:
clr datum
sz code_datum.0 ;sending memory content for deciding comments's state
set datum
clr wrb
d_1
set wrb
rr code_datum
sdz count
jmp rmwloop3
set csb
ret
rm_write endp
;------------------------------
show_lcm:
mov a, 00h
mov t_addr_h, a
mov a, 31h
mov num_mem, a
clr_n1:
mov a, t_addr_h
mov mem_addr, a
mov a, 0fh
mov code_datum, a
call write
inc t_addr_h
sdz num_mem
jmp clr_n1
ret
;------------------------------
clr_lcm:
mov a, 00h
mov t_addr_h, a
mov a, 31h
mov num_mem, a
clr_n:
mov a, t_addr_h
mov mem_addr, a
mov a, 0h
mov code_datum, a
call write
inc t_addr_h
sdz num_mem
jmp clr_n
ret