📄 5045.asm
字号:
;**************************************************
; 平凡单片机工作室
; HTTP://WWW.MCUSTUDIO.COM
; (C) COPYRIGHT 2003 PINGFAN'S MCUSTUDIO
; ALL RIGHTS RESERVED
;5045.ASM
;作者:周坚
;功能描述:
;1)读指定地址的内容
;开机后,LED数码管以十六进制形式显示一个数字
;按下S1键或S2键,LED数码管上显示的数字加1或减1
;该数字表示的是待读的X5045中存储器单元的地址,
;按下S4键,读出该单元的内容,并且以十六进制的形式显示在LED数码管上。
2)将值写入指定单元
;开机后,P1.0所接LED点亮,此时,可以按S1或S2,使LED数码管显示至待写入单元的地址值,
;然后按下S3键,该地址值被记录,P1.1所接LED亮,按S1或S2,
;LED数码管以十六进制形式显示待写入的数据,按下S4键,该数据被写入刚才指定的EEPROM单元中。
;**************************************************
CS BIT P2.4 ;
SI BIT P2.2 ;
SCK BIT P2.3 ;
SO BIT P2.0 ;
WP BIT P2.1 ;
WREN_INST EQU 06H ;写允许命令字(WREN)
WRDI_INST EQU 04H ;写禁止命令字(WRDI)
WRSR_INST EQU 01H ;写状态寄存器命令字(WRSR)
RDSR_INST EQU 05H ;读状态寄存器命令字(RDSR)
WRITE_INST EQU 02H ;写存储器命令字 (WRITE)
READ_INST EQU 03H ;读存储器命令字 (READ)
MAX_POLL EQU 99H ;测试的最大次数
WDT200 EQU 90H ;WD1 WD0=01
WDT600 EQU 0A0H;WD1 WD0=10
WDT1400 EQU 80H ;如果最高位是1代表设置看门狗WD1 WD0 =00
NOWDT EQU 0B0H;WD1 WD0=11
PROQTR EQU 04H ;BL1 BL0=01保护区域为高128字节
PROHALF EQU 08H ;BL1 BL0=10写保护区域为高256字节
PROALL EQU 0CH ;BL1 BL0=11写保护区域为整个存储器
NOPRO EQU 00H ;如果最高位是0,代表设置保护区域 BL1 BL0=00,不写保护
;***************************************************************************************
KMARK BIT 00H ;有键被按着
KFIRST BIT 01H ;第一次
KFUNC BIT 02H ;代表两种功能
KENTER BIT 03H ;代表执行S4键的操作
KS12 BIT 04H ;S1 S2两个键被按下
KFUNC1 BIT 05H
KCOUNT EQU 21H ;统计次数
COUNT EQU 22H
COUNTER EQU 23H ;用于显示的计数器
MTD EQU 30H ;发送数据缓冲区
MRD EQU 30H ;接收数据缓冲区
NUMBYT EQU 2FH ;传送字节数存放单元
STATBYT EQU 2FH ;状态字节存放单元
DATAADDR EQU 2DH ;该单元及DATAADDR+1是待操作的EEPROM的地址单元,该位存入高1位地址,ADDRDATA+1单元存入低8位地址
FIRST EQU P2.7;第一位数码管的位控制
SECOND EQU P2.6;第二位数码管的位控制
DISPBUF EQU 5EH ;5E,5FH是显示缓冲区
TMRVAR EQU 60110;65536-5000*12/11.0592 定时器初值5毫秒
ORG 0
JMP START
ORG 0BH
JMP INT_T0
ORG 30H
START:
MOV SP,#5FH
CALL INIT_T0
SETB P2.0
SETB CS
SETB SO
CLR SCK
CLR SI ;初始化
MOV 20H,#0 ;复位所有标志
CLR A
MOV COUNT,A
MOV KCOUNT,A
MOV COUNTER,A
MOV P1,#11111110B ;点亮"读"控制灯
MOV A,COUNT
CALL CALC
SETB CS
SETB SO
CLR SCK
CLR SI ;初始化
SETB EA
LOOP:
JB KS12,MAIN_0
JMP MAIN_1
MAIN_0:
MOV A,COUNT
CALL CALC
MAIN_1:
JB KFUNC,MAIN_2 ;如果是第二功能(写)转
MOV P1,#11111110B ;否则点亮LED1
MOV DATAADDR,#0 ;在本应用中,高位地址始终为0
MOV DATAADDR+1,COUNT;将计数值送到地址寄存器中
JMP MAIN_3
MAIN_2:
MOV P1,#11111101B ;点亮LED2
MOV R0,#MTD
MOV A,COUNT
MOV @R0,A ;将计数值送入数值寄存器中
MAIN_3:
JB KENTER,MAIN_4 ;如果有回车键,转
JMP LOOP ;否则回去继续循环
MAIN_4:
JB KFUNC,MAIN_5 ;如果是第二功能,转
CLR P1.7 ;点亮D8,显示命令被正确执行
MOV NUMBYT,#1 ;读出1个字节
CALL READ_DATA ;读数据存于MRD开始的缓冲区
MOV R0,#MRD
MOV A,@R0
MOV COUNT,A ;送到计数器中
CALL CALC ;调用计算显示程序
CLR KENTER ;清回车标记
CALL DELAY
SETB P1.7
JMP LOOP ;继续循环
MAIN_5:
SETB WP ;
CLR P1.7 ;点亮D8,显示命令被正确执行
MOV NUMBYT,#1 ;写入1个字节
CALL WRITE_DATA ;将数据写入EEPROM
CLR KENTER
CLR WP
CALL DELAY
SETB P1.7
JMP LOOP
;主程序到此结束
DELAY:
MOV R7,#0FFH
D1: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,D1
RET
CALC:
MOV B,#16
DIV AB
MOV DISPBUF,A
MOV DISPBUF+1,B
RET
INIT_T0: ;初始化T0为5毫秒的定时器
MOV TMOD,#01H
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
SETB ET0 ;开T0中断
SETB TR0 ;定时器0开始运行
RET ;返回
;以下是中断程序,实现显示及键盘处理
INT_T0: ;定时器T0的中断响应程序
PUSH ACC ;ACC入栈
PUSH PSW ;PSW入栈
SETB RS0 ;用第二组工作寄存器
MOV TH0,#HIGH(TMRVAR) ;
MOV TL0,#LOW(TMRVAR)
SETB FIRST
SETB SECOND ;关显示
MOV A,#DISPBUF ;显示缓冲区首地址
ADD A,COUNTER
MOV R0,A
MOV A,@R0 ;根据计数器的值取相应的显示缓冲区的值
MOV DPTR,#DISPTAB ;字形表首地址
MOVC A,@A+DPTR ;取字形码
MOV P0,A ;将字形码送P0位(段口)
MOV A,COUNTER ;取计数器的值
JZ DISPFIRST ;如果是0则显示第一位
CLR SECOND ;否则显示第二位
AJMP DISPNEXT
DISPFIRST:
CLR FIRST ;显示第一位
DISPNEXT:
INC COUNTER ;计数器加1
MOV A,COUNTER
DEC A ;如果计数器计到2,则让它回0
DEC A
JZ RSTCOUNT
AJMP KEY
RSTCOUNT:
MOV COUNTER,#0 ;计数器的值只能是0或1
KEY:
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
CPL A
JZ NO_KEY ;无键按下,返回
JNB KMARK,KEY_1 ;键按下标志有效吗(无效转)?
DEC KCOUNT ;键值计数器减1
MOV A,KCOUNT
JNZ INT_EXIT ;如果是0,退出中断
JNB P3.2,KEY_S1 ;S1键按下
JNB P3.3,KEY_S2 ;S2键按下
JNB P3.4,KEY_S3 ;S3键按下
JNB P3.5,KEY_S4 ;S4键搂下
JMP NO_KEY ;无键按下
KEY_1:
MOV KCOUNT,#4
SETB KMARK
JMP INT_EXIT
KEY_S1:
INC COUNT
SETB KS12
JMP KEY_2
KEY_S2:
DEC COUNT
SETB KS12
JMP KEY_2
KEY_S3:
JB KFUNC1,KEY_S31
CPL KFUNC ;如果KFUNC=0,代表第一种功能,KFUNC=1,第二种功能
SETB KFUNC1
KEY_S31:
CLR KS12
JMP KEY_2
KEY_S4:
SETB KENTER ;如果该位是1,则根据KFUNC分别执行读或写的操作
CLR KS12
KEY_2:
JNB KFIRST,KEY_3 ;如果无效,转
MOV KCOUNT,#20
JMP INT_EXIT
KEY_3:
MOV KCOUNT,#200
SETB KFIRST
JMP INT_EXIT
NO_KEY:
CLR KMARK
CLR KFIRST
CLR KFUNC1
MOV KCOUNT,#0
INT_EXIT:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -