哪位大虾能够告诉我为什么写入的是D但读出来的却是@,帮忙指点下!!!
感谢阿~~~
RS BIT P3.3 ;寄存器选择,1表示数据寄存器,0表示指令寄存器
RW BIT P3.5 ;读写信号线,高电平为读,低电平为写,
;RS RW同时为低表示写指令,RS低RW高则是读忙信号,反之写入数据
E BIT P3.4 ;液晶显示使能,高到低时执行命令
key_bit bit 01h ;键盘标志位
keyboard bit P2.6
lcd_bg bit P1.2 ;背光
output equ p0
cs bit p2.7 ;x5045电路选择端
so bit p3.5 ;x5045串行数据输入端
si bit p3.7 ;x5045串行数据输出端
sclk bit p3.6 ;x5045串行时钟信号
xadd equ 0d0h ;x5045写入的地址
org 0000h
ajmp init
org 0003h
ajmp ankey
init: mov sp,#0f0h
clr lcd_bg
mov b,#01h ;清屏
lcall enable ;每次操作都要保存
mov b,#38h ;功能选择
lcall enable
mov b,#0fh ;开显示幕
lcall enable
mov b,#06h ;表示光标向右移,屏幕上文字不移动
lcall enable
setb ea ;中断开放
setb ex0 ;允许INT0
welcome: mov b,#80h ;设定第一行起始地址
lcall enable
mov a,#41h
lcall display
mov b,#0c0h
lcall enable
mov a,#42h
lcall display
main: jnb key_bit,next
clr key_bit
ajmp key
next: nop
ajmp main
;-----------------写入程序寄存器--------------------------
enable:clr rs ;写指令到寄存器
clr rw
clr e ;先禁止,在第二次进入的时候就有效了
lcall delay
mov output,b
setb e
clr e
ret
;----------------显示-------------------------------------
display: clr rw
setb rs
mov output,a
setb e
lcall delay
clr e
ret
;****************x5045************************************
;----------------单字节写---------------------------------
;作用:这段程序送出命令,读EEPROM存储器中的一个字节数据
byte_write: mov DPTR, #xadd ; 设置字节写地址
lcall startx
lcall wren
mov a,#02h
mov b,dph
mov c,b.0
mov acc.3,c
lcall byte_out
mov a, DPL
lcall byte_out ; 送出8位地址
mov a, output ; 数据
lcall byte_out ; 送出数据
inc xadd
lcall endx
lcall check_wip ; 查写周期是否完成(等待写完)
ret
;---------------单字节读-----------------------------------
;作用:这段程序送出命令,读EEPROM存储器中的一个字节数据
byte_read: mov b,#82h
lcall enable
mov DPTR, #xadd ; 设置读取数据的地址
lcall startx
mov a,#03h
mov b,dph
mov c,b.0
mov acc.3,c
lcall byte_out
mov A, DPL
lcall byte_out ; 送出地址(8位)
lcall byte_in ; 读取数据
inc xadd
lcall endx
ret
;---------------启动x5045--------------------------------
startx:clr cs ;让cs在整个工作周期为低,有效
nop
clr sclk
nop
ret
;-------------写使能所存(使能写操作)---------------------
wren: lcall startx
mov a,#06h ;对应设置写使能锁存器
lcall byte_out
lcall endx
;-----------读状态寄存器-----------------------------------
rdrs: lcall startx
mov a,#05h ;对应设置读状态寄存器
lcall byte_out
lcall byte_in
lcall endx
;-----------用wip位判是否完成内部操作----------------------
check_wip:;lcall rdrs ;通过读状态寄存器来说明内部写周期结束否
jb acc.0,check_wip ;因为wip是状态寄存器的第0位
ret
;------------写字节到EEPROM------------------------------
byte_out: mov r5,#8 ;写入一个字节(8位)数据
bout1: clr sclk
rlc a ;带进位的左移,进位给c
mov si,c
setb sclk
cjne r5,#8,bout1
ret
;-----------从EEPROM中读字节------------------------------
byte_in: mov r5,#8
bin1: setb sclk
mov c,so
rlc a
clr sclk
cjne r5,#8,bin1
ret
;------------关闭x5045------------------------------------
endx: clr sclk
nop
setb cs
nop
ret
;**********************************************************
;----------------键盘中断---------------------------------
ankey:push acc
push psw
setb key_bit
pop psw
pop acc
reti
;----------------按键判断---------------------------------
key: mov output,#0ffh
clr keyboard
mov a,output
setb keyboard
jnb acc.4,menu
jnb acc.5,enter
ljmp main
;--------------按键处理----------------------------------
menu: mov b,#82h
lcall enable
mov a,#44h
lcall display
lcall byte_write
ajmp main
enter:lcall byte_read
lcall display
ajmp main
;----------------延时程序---------------------------------
delay:mov r7,#124 ;5ms延时
loop2:mov r6,#20
loop3:djnz r6,loop3
djnz r7,loop2
ret
end