导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→关于1602和x5045的一个程序求助[justinzheng]

 *第47855篇: 关于1602和x5045的一个程序求助

  
楼 主:justinzheng 2007年4月12日21:10
 关于1602和x5045的一个程序求助
有哪位好心人能够帮忙看看这个程序有什么问题瓦,其目的是为了实现,从键盘上按一个键,在1602上显示。 同时保存到x5045中,按另外一个键的时候能够从x5045中读出。我现在能够显示,但是读出的总是乱字。谢谢好心然帮忙啊!! 

      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串行时钟信号
      mrd equ  2ch         ;接收数据缓冲区
      numbyt   equ 2fh     ;传送字节数存放单元
  
      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,#0eh      ;开显示幕
      lcall enable
      mov b,#06h      ;表示光标向右移,屏幕上文字不移动
      lcall enable 
      setb ea              ;中断开放
      setb ex0             ;允许INT0
welcome: mov b,#80h            ;设定第一行起始地址
              lcall enable
              mov a,#41h
              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,#0e0h      ;设置字节写地址      
byte_writ1:   lcall wren
              clr sclk
              clr cs              ;启动x5045
              mov a, DPL
              lcall byte_out        ; 送出8位地址
              mov a,#mrd              ; 数据
              lcall byte_out        ; 送出数据
       clr sclk              ; 关闭x5045
              setb cs
       lcall check_wip       ; 查写周期是否完成(等待写完)
              ret
;---------------单字节读-----------------------------------
;作用:这段程序送出命令,读EEPROM存储器中的一个字节数据
byte_read:    mov dptr,#0e0h  ; 设置读取数据的地址
byte_rea1:    clr sclk              ;启动x5045
              clr cs
              mov A,DPL
              lcall byte_out         ; 送出地址(8位)
              lcall byte_in          ; 读取数据
              clr sclk               ;关闭x5045
              setb cs
              ret
;-------------写使能所存(使能写操作)---------------------
wren:  clr sclk
       clr cs
       mov a,#06h        ;对应设置写使能锁存器
       lcall byte_out
       clr sclk               ;关闭x5045
       setb cs
       ret
;-----------读状态寄存器-----------------------------------
rdsr: clr sclk
      clr cs
      mov a,#05h      ;对应设置读状态寄存器
      lcall byte_out
      lcall byte_in
      clr sclk               ;关闭x5045
      setb cs
      ret
;-----------用wip位判是否完成内部操作----------------------
check_wip:mov r4,#99h           ;设置最大查询数目
check_wi1:lcall rdsr            ;通过读状态寄存器来说明内部写周期结束否
          jnb acc.0,check_wi2    ;因为wip是状态寄存器的第0位
   djnz r4,check_wi1
check_wi2:ret
;------------写字节到EEPROM------------------------------
byte_out: mov r5,#8      ;写入一个字节(8位)数据
   bout1: clr sclk
          rlc a          ;带进位的左移,进位给c
   mov si,c
   setb sclk
   djnz r5,bout1
   clr si
   ret
;-----------从EEPROM中读字节------------------------------
byte_in:  mov r5,#8
   bin1:  setb sclk
      clr sclk
          mov c,so
   rlc a
   djnz r5,bin1
   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,#0eh
      lcall enable
      mov b,#82h
      lcall enable
      mov a,#44h
      lcall display
      mov mrd,a
      lcall byte_write
      ajmp main
enter:mov b,#0eh
      lcall enable
      lcall byte_read
      mov b,#84h
      lcall enable
      lcall display
      ajmp main
;----------------延时程序---------------------------------
delay:mov r7,#124          ;5ms延时
loop2:mov r6,#20
loop3:djnz r6,loop3
      djnz r7,loop2
      ret
      end


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:LPC236X 学习板(LPC2364/LPC2368)

[下一篇主题]:求助:高手帮忙看看这个图行不行