哪位大虾能够告诉我这个程序为什么读入的时候是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 |
|