给你参考例子
;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 '100'
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 '101'
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 '110'
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 '101'
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
发表时间:2005年2月19日17:12:15