本帖最后由 plc_avr 于 2011-7-20 09:10 编辑
;1602液晶显示子程序
.include "m8def.inc"
.device atmega8
;>>>>>>>接口定义>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.def data = r20 ;数据/地址,输入输出寄存器
.def command = r21 ;液晶显示设置命令寄存器
.set d_port = portd ;液晶与MCU的数据接口
.set c_port = portc ;液晶控制信号所用MCU端口
.set d_ddr = ddrd ;
.equ busy = 7
.equ en = 3 ;液晶的"EN"控制信号与MCU的接口
.equ rw = 4 ;液晶的"R/W"控制信号与MCU的接口
.equ rs = 5 ;液晶的"RS"控制信号与MCU的接口
;<<<<<<<接口定义结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.org 0x000
rjmp reset
.org 0x015
reset:
;>>>>>>>MCU初始化,作为子程序时应结合主程序修改并放置主程序开始处>>>>>>>>>>
ldi r16 , high(ramend) ;
out sph , r16 ;
ldi r16 , low(ramend) ;
out spl , r16 ;初始化堆栈指针
ldi r20 , 0x0ff ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
out ddrd , r20 ;
out ddrc , r20 ;有关MCU与液晶接口的一些初始化
ldi r20 , 0x00 ;
out portc , r20 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<MCU初始化结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
rcall lcd_initi
ldi data , 0x80
rcall lcd_d_write
rcall read_lcd_busy
ldi r27 , 0x10
ldi data , 0x41
dh:
rcall lcd_d_write
rcall read_lcd_busy
inc data
dec r27
brne dh
over: rjmp over
;>>>>>>LCD初始化、工作方式设置子程序,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
lcd_initi:
ldi command , 0x30 ;>>>>液晶初始化>>>>>>>>>>>>>>>>>>>
rcall lcd_c_write ;写入初始化命令
rcall delay ;延时(延时时间>1.4ms)
rcall delay
rcall lcd_c_write ;再次写入初始化命令
rcall delay ;延时(延时时间>100us)
rcall lcd_c_write ;最后一次写入初始化命令
rcall read_lcd_busy ;<<<<<检测LCD状态,初始化结束<<<<<<
ldi command , 0x38 ;>>>>>液晶工作方式设置>>>>>>>>>>>>>
rcall lcd_c_write ;写入控制字,选择8位数据并行方式
rcall read_lcd_busy ;检测液晶状态
ldi command , 0x01 ;清屏
rcall lcd_c_write ;
rcall read_lcd_busy ;
ldi command , 0x02 ;归位
rcall lcd_c_write
rcall read_lcd_busy
ldi command , 0x06 ;输入方式设置,AC自动增一,画面不动
rcall lcd_c_write
rcall read_lcd_busy
ldi command , 0x0f ;显示开关控制,显示开,光标开,闪烁开
rcall lcd_c_write
rcall read_lcd_busy
ret
;<<<<<<<<<<<<LCD初始化、工作方式设置结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;>>>>>写命令子程序"lcd_c_write">>>>>>>>>>>>>>>>>>>>>
lcd_c_write:
sbi c_port , en
out d_port , command
cbi c_port , en
ret
;<<<<<写命令子程序"lcd_c_write"结束<<<<<<<<<<<<<<<<<<
;>>>>>写数据子程序"lcd_d_write">>>>>>>>>>>>>>>>>>>>>
lcd_d_write:
sbi c_port , rs
sbi c_port , en
out d_port , data
cbi c_port , en
cbi c_port , rs
ret
;<<<<<写数据子程序"lcd_d_write"结束<<<<<<<<<<<<<<<<<<
;>>>>液晶状态读取子程序read_lcd_busy>>>>>>>>>>>>>>>>>>
read_lcd_busy:
cbi d_port , busy
cbi d_ddr , busy
sbi c_port , rw
sbi c_port , en
nop
back:
sbic pind , busy
rjmp back
cbi c_port , rw
sbi d_ddr , busy
ret
;>>>>液晶状态读取子程序read_lcd_busy结束>>>>>>>>>>>>>>>
delay:
ldi r31 , 0x08
agi:
ldi r30 , 0xf0
again:
dec r30
breq tiao
rjmp again
tiao:
dec r31
breq dover
rjmp agi
dover:
ret |