📄 internaleeprom_test.asm
字号:
/*************************************************
*文件名 :InternalEEprom_Test.asm
*版权: 广州周立功单片机发展有限公司
*功能: P89LPC932内部EEPROM操作演示程序
*日期: 10:44 04-2-18
*************************************************/
$NOMOD51
$INCLUDE(reg932.inc)
LED BIT P2^6 ;定义运行指示灯
BEEP BIT P2^7 ;定义蜂鸣器
KEY1 BIT P0^0 ;定义按键
KEY2 BIT P0^1
KEY3 BIT P0^2
KEY4 BIT P0^3
Count DATA 0x30
Dat DATA 0x31
Addr DATA 0x32
/* 74HC595控制管脚定义 */
HC595_CS BIT P2^4 ;片选线
HC595_CLK BIT P2^5 ;时钟线
HC595_DAT BIT P2^2 ;数据线
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
MOV P0M1,#0x00 ;定义IO口工作模式
MOV P0M2,#0x00
MOV P2M1,#0xC0
MOV P2M2,#0xC0
;-------------write---------------------------
WRITE1:
JB KEY1,Read1 ;当KEY1按下,向 地址为0-->0xff的区域写入数据0->0xff.
CLR LED ;点亮运行指示灯
CLR EA ;写操作前关闭中断功能,避免干扰
MOV Addr,#0x00 ;地址初始值
MOV Dat,#0x00 ;待写入数据初始值
MOV Count,#0xFF ;循环次数
MOV R7,#0xFF
WRITE_LOOP:
MOV DEECON,#0x00 ;初始化DEECON
MOV DEEDAT,Dat ;赋值DEEDAT
MOV DEEADR,Addr ;赋值DEEADR
WRITE_complete: ;等待写完成
MOV A,DEECON
ANL A,#0x80
JZ WRITE_complete
MOV DEECON,#0x00 ;清0写完成标志位
INC Dat ;待写入数据递增
INC Addr ;地址递增
DJNZ R7,WRITE_LOOP ;循环次数递减
SETB LED ;最后一次循环,熄灭运行指示灯
SETB EA ;开中断
;-------------------Verify---------------------
Read1:
JB KEY2,WRITE2 ;当KEY2按下时,校验地址0-->0xff区域间的数据,不对则BEEP
CLR LED
MOV Addr,#0x00 ;首地址
MOV Dat,#0x00 ;首数据
MOV Count,#0xFF ;循环次数
MOV R7,#0xFF
READ_LOOP:
MOV DEECON,#0x00 ;初始化DEECON
MOV DEEADR,Addr ;赋值DEEADR
READ_complete:
MOV A,DEECON ;等待
ANL A,#0x80
JZ READ_complete
MOV A,DEEDAT ;将读出的值赋给Temp
XRL A,DAT ;将A与DAT比较
JNZ SKIP1 ;不等则跳
AJMP SKIP2
SKIP1:
CLR BEEP ;BEEP鸣叫
MOV A,DAT
LCALL SendHC595 ;显示时的数据(可以判断出操作第?位EEPROM出错)
SKIP2:
INC Dat ;待校验数据递增
INC Addr ;地址递增
DJNZ R7,READ_LOOP ;循环次数递减
MOV A,Dat
LCALL SendHC595 ;若循环结束,显示最后一次操作的数据
;----------------100~~~~1FFH--------------
WRITE2:
JB KEY1,Read2 ;当KEY1按下,向 地址为0x100-->0x1ff的区域写入相应数据
CLR LED ;点亮运行指示灯
CLR EA ;写操作前关闭中断功能,避免干扰
MOV Addr,#0x00 ;地址低8位初值
MOV Dat,#0x00 ;待写入数据初始值
MOV Count,#0xFF ;循环次数
MOV R7,#0xFF
WRITE_LOOP1:
MOV DEECON,#0x01 ;初始化DEECON,并置位地址最高位
MOV DEEDAT,Dat ;赋值DEEDAT
MOV DEEADR,Addr ;赋值DEEADR
WRITE_complete1: ;等待写完成
MOV A,DEECON
ANL A,#0x80
JZ WRITE_complete1
MOV DEECON,#0x00 ;清0写完成标志位
INC Dat ;待写入数据递增
INC Addr ;地址递增
DJNZ R7,WRITE_LOOP1 ;循环次数递减
SETB LED; ;最后一次循环,熄灭运行指示灯
SETB EA ;开中断
;-------------Verify--------------------------
Read2:
JB KEY2,Over ;当KEY2按下时,校验地址0x100-->0x1ff区域间的数据,不对则BEEP
CLR LED
MOV Addr,#0x00 ;首地址低8位
MOV Dat,#0x00 ;首数据
MOV Count,#0xFF ;循环次数
MOV R7,#0xFF
READ_LOOP1:
MOV DEECON,#0x01 ;初始化DEECON,并置位地址最高位
MOV DEEADR,Addr ;赋值DEEADR
READ_complete1:
MOV A,DEECON ;等待
ANL A,#0x80
JZ READ_complete1
MOV A,DEEDAT ;将读出的值赋给A
XRL A,DAT ;将A与DAT比较
JNZ SKIP_1 ;不等则跳
AJMP SKIP_2
SKIP_1:
CLR BEEP ;BEEP鸣叫
MOV A,DAT
LCALL SendHC595 ;显示时的数据(可以判断出操作第?位EEPROM出错)
SKIP_2:
INC Dat ;待校验数据递增
INC Addr ;地址递增
DJNZ R7,READ_LOOP1 ;循环次数递减
MOV A,Dat
LCALL SendHC595 ;若循环结束,显示最后一次操作的数据
;---------------
Over:
JMP WRITE1
RET
;***********************************************
; 名称:SENDHC595
; 功能:向74HC595发送数据
; 入口参数:ACC 待发送的数据
; 占用资源:R7、CY
;***********************************************
SENDHC595:
CLR HC595_CS
MOV R7,#8
HC595_SDL1: CLR HC595_CLK
RLC A ; 将要发送的数据最高位移入CY
MOV HC595_DAT,C ; 设置数据线
NOP
HC595_SDL2: SETB HC595_CLK
NOP
DJNZ R7,HC595_SDL1 ; 若数据未发送完毕,再次发送
SETB HC595_CS ; 输出显示数据
CLR HC595_CS ; 关闭74HC595
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -