📄 xhuankoutongxin.asm
字号:
ORG 0000H
AJMP MASSAGE
ORG 0023H
AJMP RMASSAGE
ORG 0030H
MASSAGE: MOV DPTR,#8003H ;8255初始化
MOV A,#80H
MOVX @DPTR,A
MOV R3,#0
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV 0CH,#07DH ;开机后,静态显示为“9.6”
MOV 0BH,#0EFH
ACALL WATCH ;在静态数码管上显示“9.6 ”
MOV 20H,#02H ;将01H单元置1
MOV SP,#50H ;中断初始化
MOV TMOD,#20H ;计数器1工作在方式2
MOV TH1,#0FDH ;波特率为9.6k比特每秒
MOV TL1,#0FDH
SETB TR1 ;开计数器
MOV SCON,#50H ;串口在方式1,SM2=0,允许接收
MOV PCON,#00H ;SMOD=0
MOV R0,#40H ;将R0指向40H单元
MOV R1,#03 ;将传送的数据块首地址送R1
MOV 09H,#4 ;将数据块的长度送09H中
MOV 30H,#0 ;校验数据和
MOV IE,#90H ;开串口中断
AGAIN: ACALL SCAN ;扫描键盘
CJNE A,#0FFH,NEXT0 ;判断是否有键按下
MOV 08H,#0FFH ;使08H中的内容为FFH
CLR 00H ;将00H清空,来控制连续的键盘输入
ACALL ACTIVITY ;动态显示
SJMP AGAIN
NEXT0: CJNE A,08H,NEXT1 ;判断有没有松开按键
JB 00H,NEXT1 ;若没有,则延时500毫秒后连续键入数值
SETB 00H ;如00H中不是1则置1,
ACALL DELAY600MS ;延时600毫秒
NEXT1: MOV 08H,A ;将按键数值放入08H中
ACALL DELAY250MS ;若有键按下则延时200毫秒键入数据
CJNE A,#0AH,CONT ;判断是什么键
CONT: JC NUM ;如是数据键则转移去处理数据
CJNE A,#0AH,SETMASS ;判断是什么功能
JB 01H,SPEED1 ;若上次是波特率1,则转移到波特率2
JB 02H,SPEED2 ;若上次是波特率2,则转移到波特率3
JB 03H,SPEED3 ;若上次是波特率3,则转移到波特率4
JB 04H,SPEED4 ;若上次是波特率4,则转移到波特率1
SPEED1: CLR 01H
SETB 02H
MOV TH1,#0F9H ;4800比特每秒的波特率
MOV TL1,#0F9H
MOV 0CH,#7FH
MOV 0BH,#0E6H
ACALL WATCH ;在静态数码管上显示4.8
AJMP AGAIN
SPEED2: CLR 02H
SETB 03H
MOV TH1,#0F2H ;2400比特每秒的波特率
MOV TL1,#0F2H
MOV 0CH,#66H
MOV 0BH,#0DBH
ACALL WATCH ;在静态数码管上显示2.4
AJMP AGAIN
SPEED3: CLR 03H
SETB 04H
MOV TH1,#0E5H ;1200比特每秒的波特率
MOV TL1,#0E5H
MOV 0CH,#5BH
MOV 0BH,#86H
ACALL WATCH ;在静态数码管上显示1.2
AJMP AGAIN
SPEED4: CLR 04H
SETB 01H
MOV TH1,#0FDH ;9600比特每秒的波特率
MOV TL1,#0FDH
MOV 0CH,#7DH
MOV 0BH,#0EFH
ACALL WATCH ;在静态数码管上显示9.6
AJMP AGAIN ;处理功能后继续扫描键盘
NUM: MOV R2,A ;数据处理将数据按先后顺序
MOV A,R5 ;依次存入R3,R4,R5,R6
MOV R6,A
MOV A,R4
MOV R5,A
MOV A,R3
MOV R4,A
MOV A,R2
MOV R3,A
AJMP AGAIN
SETMASS: CLR EA ;关本机中断
CLR TI
THEN: MOV SBUF,@R1 ;数据起始位开始发送
JNB TI,$ ;未发送完则等待
CLR TI
MOV A,@R1
ADD A,30H ;求数据和
MOV 30H,A
INC R1 ;指向下一位数据
DJNZ 09H,THEN ;若没有发完则继续发
JNB RI,$ ;等待接收数据和
CLR RI
MOV A,SBUF ;收数据
XRL A,30H ;校验数据和是否相等
JNZ SETMASS ;若发生错误则从新传送
MOV R1,#03 ;将传送的数据块首地址送R1
MOV 09H,#4 ;将数据块的长度送09H中
MOV 30H,#0 ;校验数据和
SETB EA ;开本机中断
AJMP AGAIN ;若发完则继续键盘扫描
RMASSAGE: PUSH A ;中断服务程序,接收数据
PUSH PSW ;保护现场
R_AGAIN: JNB RI,$ ;等待接受
CLR RI ;接收到则清接收中断标志
MOV A,SBUF
MOV @R1,A ;数据存储
INC R1 ;指向下一个存储单元
ADD A,30H ;计算接收数据的累加和
MOV 30H,A
DJNZ 09H,R_AGAIN ;如没发完则继续发送
MOV A,30H
CLR TI ;清发送标志位
MOV SBUF,A ;回送累加和
JNB TI,$ ;等待发送结束
CLR TI
MOV R1,#03 ;将传送的数据块首地址送R1
MOV 09H,#4 ;将数据块的长度送09H中
MOV 30H,#0 ;校验数据和
POP PSW ;恢复现场
POP A
RETI
SCAN: PUSH 00H
CLR P1.0 ;键盘扫描子程序**********************************************
CLR P1.1 ; 占用资源RO,A
CLR P1.2 ; 数字出口为A. 堆栈2字节
CLR P1.3 ; **********************************************
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,KEYSCAN ;如有键按下则转移
SJMP EXIT
KEYSCAN:ACALL DLY20MS ;延时
MOV R0,#00H ;列数用R0来记录
CLR P1.0
SETB P1.1
SETB P1.2
SETB P1.3
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,TTTT1 ;若在本行则转移
MOV A,R0 ;扫描下一行
ADD A,#4H
MOV R0,A
SETB P1.0
CLR P1.1
SETB P1.2
SETB P1.3
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,TTTT1 ;若在本行则转移
MOV A,R0 ;扫描下一行
ADD A,#4H
MOV R0,A
SETB P1.0
SETB P1.1
CLR P1.2
SETB P1.3
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,TTTT1 ;若在本行则转移
EXIT: MOV A,#0FFH ;如无键按下则推退出
SJMP DONE
TTTT1: JB P1.4,TTTT2 ;如按键不在本行则转移
MOV A,#00H ;在则将0放入A 中
AJMP TTTT5
TTTT2: JB P1.5,TTTT3 ;如按键不在本行则转移
MOV A,#01H ;在则将1放入A 中
AJMP TTTT5
TTTT3: JB P1.6,TTTT4 ;如按键不在本行则转移
MOV A,#02H ;在则将2放入A 中
AJMP TTTT5
TTTT4: JB P1.7,TTTT5 ;如按键不在本行则转移
MOV A,#03H ;在则将3放入A 中
AJMP TTTT5
TTTT5: ADD A,R0
DONE: POP 00H
RET
ACTIVITY: PUSH A ;保护现场
MOV @R0,#0E0H ;数据显示输入时由右向左显示
MOV A,R3
XCHD A,@R0
MOV DPTR,#6000H
MOV A,@R0
MOVX @DPTR,A
MOV @R0,#0D0H
MOV A,R4
XCHD A,@R0
MOV DPTR,#6000H
MOV A,@R0
MOVX @DPTR,A
MOV @R0, #0B0H
MOV A,R5
XCHD A,@R0
MOV DPTR,#6000H
MOV A,@R0
MOVX @DPTR,A
MOV @R0,#70H
MOV A,R6
XCHD A,@R0
MOV DPTR,#6000H
MOV A,@R0
MOVX @DPTR,A
MOV A,#0F0H
MOV DPTR,#6000H
MOVX @DPTR,A
POP A
RET
WATCH: MOV A,#00H ;8255送数据显示程序
MOV DPTR,#8002H
MOVX @DPTR,A
MOV A,0BH
MOV DPTR,#8001H
MOVX @DPTR,A
MOV A,0CH
MOV DPTR,#8000H
MOVX @DPTR,A
RET
DLY20MS: MOV 22H,#70H ; 延时20毫秒子程序 *******占用资源22h,23h****************
DY1: MOV 23H,#69H
DY2: DJNZ 23H,DY2
ACALL ACTIVITY ;动态显示
DJNZ 22H,DY1
RET
DELAY250MS: MOV 22H,#25 ;延时0.25秒子程序 *****占用资源22h,23h,24h************
DL333: MOV 23H,#100
DL222: MOV 24H,#49
DL111: DJNZ 24H,DL111
ACALL ACTIVITY ;动态显示
DJNZ 23H,DL222
ACALL ACTIVITY ;动态显示
DJNZ 22H,DL333
RET
DELAY600MS:MOV 22H,#50 ;延时0.6秒子程序 *****占用资源22h,23h,24h************
DL33: MOV 23H,#100
DL22: MOV 24H,#49
DL11: DJNZ 24H,DL11
ACALL ACTIVITY ;动态显示
DJNZ 23H,DL22
ACALL ACTIVITY ;动态显示
DJNZ 22H,DL33
RET
ORG 0000H
AJMP BEGIN
ORG 000
ORG 0100H
BEGIN:MOV DPTR,#8003H;8255初始化,设置初始化条件
MOV A,#80H
MOVX @DPTR,A
LOOP:CLR P1.0; 设置行编码"1110"
SETB P1.1
SETB P1.2
SETB P1.3
JB P1.7,NEXT1;判断"定时0.5MS"键是否按下
ACALL D20MS;延时去抖
K0:JB P1.7,K00;等待"定时0.5MS "键释放
AJMP K0
K00:定时0.5MS
NEXT1:JB P1.6,NEXT2;判断"定时10MS"键是否按下
ACALL D20MS; 延时去抖
K1:JB P1.6,K11;等待"定时10MS"键释放
AJMP K1
K11:定时10MS
NEXT2:JB P1.5,NEXT3;判断"定时20MS"键是否按下
ACALL D20MS; 延时去抖
K2:JB P1.5,K22; 等待"定时20MS "键释放
AJMP K2
K22:定时20MS
NEXT3:JB P1.4,NEXT4;判断"定时50MS"键是否按下
ACALL D20MS; 延时去抖
K3:JB P1.4,K33; 等待"定时50MS"键释放
AJMP K3
K33:定时50MS
NEXT4:SETB P1.0; 设置行编码"1101"
CLR P1.1
SETB P1.2
SETB P1.3
JB P1.7,NEXT5;判断"定时100MS"键是否按下
ACALL D20MS; 延时去抖
K4:JB P1.7,K44; 等待"定时100MS "键释放
AJMP K4
K44:定时100MS
NEXT5:JB P1.6,NEXT6;判断"定时500MS"键是否按下
ACALL D20MS; 延时去抖
K5:JB P1.6,K55; 等待"定时500MS "键释放
AJMP K5
K55:定时500MS
NEXT6:JB P1.5,NEXT7;判断"定时1000MS"键是否按下
ACALL D20MS; 延时去抖
K6:JB P1.5,K66; 等待"定时1000MS "键释放
AJMP K6
K66:定时1000MS
NEXT7:AJMP LOOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -