📄 main.a51
字号:
;*******************************************************************************
;程序名称:RAM测试
;硬件接法:16KB片外RAM接在0x8000~0xBFFF,MOVC和MOVX都可访问,详见电路图
;运行效果:如果RAM通过测试,则指示灯常亮,否则指示灯不停闪烁
;*******************************************************************************
;*******************************************************************************
;定义I/O接口
;*******************************************************************************
LED BIT P1.1
;*******************************************************************************
;复位入口
;*******************************************************************************
ORG 0x0000
LJMP main
ORG 0x0080
;*******************************************************************************
;函数:void Delay(unsigned char t)
;功能:延时0.01s~2.56s
;参数:t = R7
; t>0时,延时(t*0.01)s
; t=0时,延时2.56s
;说明:定时10ms的定时器初值=65536-0.01/(1/(f/12)),其中f为晶振频率
;*******************************************************************************
Delay:
MOV TH0, #0xDC ;设置T0初值(定时10ms)
MOV TL0, #0x00
SETB TR0 ;启动T0
JNB TF0, $ ;等待T0溢出
CLR TR0 ;停止T0
CLR TF0 ;清除溢出标志
DJNZ R7, Delay ;循环t次
RET
;*******************************************************************************
;宏定义:DJNZ_W
;功能:双字节数自减1,结果不为0跳转
;参数:
; (xh,xl):要操作的数
; Label:跳转目标
;*******************************************************************************
DJNZ_W MACRO xh,xl, Label
LOCAL next
MOV A, xl
JNZ next
DEC xh
next:
DEC xl
MOV A, xh
ORL A, xl
JNZ Label
ENDM
;*******************************************************************************
;函数:void WriteRam(unsigned int addr, unsigned int size, unsigned char c)
;功能:向RAM写入数据
;参数:addr=R6,R7-起始地址
; size=R4,R5-存储单元大小
; c=R3-要写入的数据
;*******************************************************************************
WriteRam:
MOV DPH, R6
MOV DPL, R7
WriteRam_Loop:
MOV A, R3
MOVX @DPTR, A
INC DPTR
DJNZ_W R4,R5, WriteRam_Loop
RET
;*******************************************************************************
;函数:bit CheckRam(unsigned int addr, unsigned int size, unsigned char c)
;功能:检查RAM中存储的数据
;参数:addr=R6,R7-起始地址
; size=R4,R5-存储单元大小
; c=R3-核对的数据
;返回:0-失败
; 1-成功
;*******************************************************************************
CheckRam:
MOV DPH, R6
MOV DPL, R7
CheckRam_Loop:
CLR A
MOVC A, @A+DPTR
INC DPTR
XRL A, R3
JNZ CheckRam_Fail
DJNZ_W R4,R5, CheckRam_Loop
SETB C
RET
CheckRam_Fail:
CLR C
RET
;*******************************************************************************
;函数:SysInit()
;功能:系统初始化
;*******************************************************************************
SysInit:
MOV SP, #0x30
MOV TMOD, #0x01 ;T0设置在方式1,即16位定时器
RET
;*******************************************************************************
;函数:void main()
;功能:主函数
;*******************************************************************************
main:
CALL SysInit
;向x8000~0xBFFF写入测试数据0x5A
MOV R3, #0xA5
MOV R4, #0x40
MOV R5, #0x00
MOV R6, #0x80
MOV R7, #0x00
CALL WriteRam
;检查RAM
MOV R3, #0xA5
MOV R4, #0x40
MOV R5, #0x00
MOV R6, #0x80
MOV R7, #0x00
CALL CheckRam
JNC Ram_Error
Ram_Ok:
;测试通过,LED常亮
CLR LED
SJMP $
Ram_Error:
;测试失败,LED不停闪烁
CLR LED
MOV R7, #30
CALL Delay
SETB LED
MOV R7, #30
CALL Delay
SJMP Ram_Error
;*******************************************************************************
;程序结束
;*******************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -