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