共2条
1/1 1 跳转至页
ST7920 恳请用过ST7920液晶的朋友帮忙看看我的程序!
问
邮购了两块ST7920驱动的带字库12864的液晶,找到的驱动程序是8051的,对8051不熟。想用8535以并行方式驱动,自已编的程序已经反复修改、烧写几十遍了,液晶始终毫无反应。恳请各位用过的有经验的朋友帮忙看看我的程序哪里有问题,如果能贴段测试程序的话,在下感激不尽。我的程序只是想在液晶上显示“A”字。
;8535 DRIVE st7920-LCD TEST
;CRYSTAL 4M
;RS=Pd.3
;RW=Pd.2
;E=Pd.1
;PSB=Pd.0
;RESET=Pd.4
;DB0-7=Pc0-7
.include "8535def.inc"
.equ RS =PD3 ;数据/命令
.equ RW =PD2 ;读/写
.equ E =PD1 ;操作允许,高电平有效(允许)
.equ PSB =PD0 ;串/并选择
.def r_data =r15
.def temp =r16
.def temp1 =r17
.def data =r18
.def ins =r19
.def dt =r20
.org $0000
rjmp reset
.org $030
reset: ldi temp,low(ramend) ;堆栈指针置初值
out spl,temp
ldi temp,high(ramend)
out sph,temp
ldi temp,$ff ;设C口,D口为输出
out ddrd,temp
out ddrc,temp
sbi portd,PSB ;置位PSB
sbi portd,E ;使能LCD模块
word: rcall initil ;调用初始化
ldi data,$41 ;41是“A”的十六进制代码
rcall wr_da ;调用写数据
ldi dt,72 ;延时1秒
rcall delay
rjmp word
initil: ldi dt,32 ;初始化子程序
rcall delay ;延时50毫秒
ldi ins,$30 ;基本指令集
rcall wr_ins ;调用写指令
ldi ins,$30 ;基本指令集
rcall wr_ins
ldi ins,$0c ;开显示,关游标
rcall wr_ins
ldi ins,$01 ;清除显示,AC值清0
rcall wr_ins
ldi ins,$06 ;光标右移
rcall wr_ins
ret
chk_busy: ;读忙状态子程序
clr temp ;设C口输入
out ddrc,temp
cbi portd,RS ;清RS位
sbi portd,RW ;置RW位
in temp1,pinc ;读C口
chk: sbrc temp1,7 ;BF位为0跳行
rjmp chk
ser temp
out ddrc,temp ;设C口输出
ret
wr_ins: rcall chk_busy ;写指令子程序
cbi portd,RS
cbi portd,RW
out portc,ins
ldi dt,6 ;延时220微秒
rcall delay
ser temp ;置C口全为高电平
out portc,temp
ret
wr_da: rcall chk_busy ;写数据子程序
sbi portd,RS
cbi portd,RW
out portc,data
ldi dt,6
rcall delay
ser temp
out portc,temp
ret
delay: push dt
de0: push dt
de1: push dt
de2: push dt
de3: dec dt
brne de3
pop dt
dec dt
brne de2
pop dt
dec dt
brne de1
pop dt
dec dt
brne de0
pop dt
ret
答 1: 按照手册来作,一般没有问题我写过串行的驱动,使用正常,并行更简单一些,注意时序和延时 答 2: 别太相信那个烂手册我也用串行驱动,结果那手册给的时序图是错误的,花了我一个星期时间排错。
ST7920的厂商手册是错的、用ST7920来造显示器的厂商依样葫芦、时序图也是错的。真怀疑他们是不是认真校对过手册。
;8535 DRIVE st7920-LCD TEST
;CRYSTAL 4M
;RS=Pd.3
;RW=Pd.2
;E=Pd.1
;PSB=Pd.0
;RESET=Pd.4
;DB0-7=Pc0-7
.include "8535def.inc"
.equ RS =PD3 ;数据/命令
.equ RW =PD2 ;读/写
.equ E =PD1 ;操作允许,高电平有效(允许)
.equ PSB =PD0 ;串/并选择
.def r_data =r15
.def temp =r16
.def temp1 =r17
.def data =r18
.def ins =r19
.def dt =r20
.org $0000
rjmp reset
.org $030
reset: ldi temp,low(ramend) ;堆栈指针置初值
out spl,temp
ldi temp,high(ramend)
out sph,temp
ldi temp,$ff ;设C口,D口为输出
out ddrd,temp
out ddrc,temp
sbi portd,PSB ;置位PSB
sbi portd,E ;使能LCD模块
word: rcall initil ;调用初始化
ldi data,$41 ;41是“A”的十六进制代码
rcall wr_da ;调用写数据
ldi dt,72 ;延时1秒
rcall delay
rjmp word
initil: ldi dt,32 ;初始化子程序
rcall delay ;延时50毫秒
ldi ins,$30 ;基本指令集
rcall wr_ins ;调用写指令
ldi ins,$30 ;基本指令集
rcall wr_ins
ldi ins,$0c ;开显示,关游标
rcall wr_ins
ldi ins,$01 ;清除显示,AC值清0
rcall wr_ins
ldi ins,$06 ;光标右移
rcall wr_ins
ret
chk_busy: ;读忙状态子程序
clr temp ;设C口输入
out ddrc,temp
cbi portd,RS ;清RS位
sbi portd,RW ;置RW位
in temp1,pinc ;读C口
chk: sbrc temp1,7 ;BF位为0跳行
rjmp chk
ser temp
out ddrc,temp ;设C口输出
ret
wr_ins: rcall chk_busy ;写指令子程序
cbi portd,RS
cbi portd,RW
out portc,ins
ldi dt,6 ;延时220微秒
rcall delay
ser temp ;置C口全为高电平
out portc,temp
ret
wr_da: rcall chk_busy ;写数据子程序
sbi portd,RS
cbi portd,RW
out portc,data
ldi dt,6
rcall delay
ser temp
out portc,temp
ret
delay: push dt
de0: push dt
de1: push dt
de2: push dt
de3: dec dt
brne de3
pop dt
dec dt
brne de2
pop dt
dec dt
brne de1
pop dt
dec dt
brne de0
pop dt
ret
答 1: 按照手册来作,一般没有问题我写过串行的驱动,使用正常,并行更简单一些,注意时序和延时 答 2: 别太相信那个烂手册我也用串行驱动,结果那手册给的时序图是错误的,花了我一个星期时间排错。
ST7920的厂商手册是错的、用ST7920来造显示器的厂商依样葫芦、时序图也是错的。真怀疑他们是不是认真校对过手册。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |