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