📄 ykjisuan.asm
字号:
;/********************************************************************************
;* 标题: xl系列单片机实验仪演示程序 红外遥控1602液晶显示乘法计算器 *
; 接口: 遥控接收头接到P3.2 插上1602液晶,喇叭接P3.7 *
;* 版本: 3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试验 *
;* 邮箱: sxj1974@163.com *
;* 网站: http://www.51c51.com www.8951.com *
;********************************************************************************
;* LCD1602显示方式: *
;* LCD第一行显示:CALCULATOR LCD第二行显示:运算过程 *
;* 主要功能: *
;* 0-99两位数之间的加、减、乘、除整数运算 *
;19键 清除 17键 等于 29,30,31,32 键 +,-,*,/ *
;********************************************************************************
;* 【版权】 Copyright(C)深圳市学林电子有限公司 www.51c51.com *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* 【技术支持】请访问http://www.51c51.com/bbs/index.asp 官方论坛 *
;********************************************************************************/
;-------------------------------
RELAY EQU P1.3
BEEP EQU P3.7
IRIN EQU P3.2
;-------------------------------
LCD_RS EQU P2.0
LCD_RW EQU P2.1
LCD_EN EQU P2.2
LCD_X EQU 3FH ;LCD 地址变量
;-------------------------------
TEMP1 EQU 30H ;临时暂存器
TEMP2 EQU 31H
TEMP3 EQU 32H
TEMP4 EQU 33H
RES_H EQU 27H ;输入被加(减、乘、除)数
RES_L EQU 28H ;输入加(减、乘、除)数
OUT_H EQU 29H ;运算结果高位
OUT_L EQU 2AH ;运算结果低位
IRCOM EQU 22H ;22H-25H IR使用
;-------------------------------
ORG 0000H
JMP MAIN
ORG 0030H
;-------------------------------
MAIN: MOV SP,#60H
MOV R1,#00H
MOV TEMP1,#00H
MOV TEMP2,#00H
MOV TEMP3,#00H
MOV RES_L,#00H
MOV RES_H,#00H
MOV OUT_H,#00H
MOV OUT_L,#00H
MOV 20H,#00H
CALL SET_LCD
MAIN1: CALL IR_IN ;大于9的数无效
JNB 20H.0,MAIN1
SUBB A,#0AH
JNC MAIN1 ;C=0,无借位
MOV A,R3 ;重装键值
JMP LOOP_0
LOOP:
CALL IR_IN ;送被(加、减、乘、除)数
JNB 20H.0,LOOP ;键标记
LOOP_0:
INC R1
CJNE R1,#01H,LOOP_1
MOV TEMP2,A ;高位
MOV LCD_X,#2
CALL CONV0
LOOP_1: CJNE R1,#02H,LOOP
SUBB A,#0AH ;判是否是功能键?
JNC LOOP_2 ;是,转LOOP_2
MOV TEMP1,TEMP2
MOV A,TEMP1
MOV LCD_X,#1
CALL CONV0
MOV A,R3 ;恢复有效键值
MOV TEMP2,A ;低位
MOV LCD_X,#2
CALL CONV0
MOV A,TEMP1
ANL A,#0FH
SWAP A
ORL A,TEMP2
MOV RES_H,A
JMP LOOP0
LOOP_2:
MOV RES_H,TEMP2
AJMP LOOP0A
LOOP0: CALL IR_IN
JNB 20H.0,LOOP0
LOOP0A: MOV A,R3 ;重装键值
CJNE A,#0AH,LOOP1 ;加运算
CALL CONV1
SETB 20H.1 ;加运算标记
AJMP LOOP5
LOOP1: CJNE A,#0BH,LOOP2 ;减运算
CALL CONV2
SETB 20H.2 ;减运算标记
AJMP LOOP5
LOOP2: CJNE A,#0CH,LOOP3 ;乘运算
CALL CONV3
SETB 20H.3 ;乘运算标记
AJMP LOOP5
LOOP3: CJNE A,#0DH,LOOP4 ;除运算
CALL CONV4
SETB 20H.4 ;除运算标记
AJMP LOOP5
LOOP4: CJNE A,#0FH,LOOP4A
AJMP MAIN
LOOP4A: AJMP LOOP0
LOOP5: MOV R1,#00H
MOV TEMP1,#00H
MOV TEMP2,#00H
CLR 20H.0 ;送(加、减、乘、除)数
LOOP5A: CALL IR_IN
JNB 20H.0,LOOP5A
CJNE A,#0FH,LOOP5B
AJMP MAIN
LOOP5B: INC R1
CJNE R1,#01H,LOOP5C
MOV TEMP2,A
MOV LCD_X,#6
CALL CONV0
LOOP5C: CJNE R1,#02H,LOOP5A
SUBB A,#0AH ;判是否是功能键?
JNC LOOP5D ;是,转LOOP5C
MOV TEMP1,TEMP2
MOV A,TEMP1
MOV LCD_X,#6
CALL CONV0
MOV A,R3
MOV TEMP2,A
MOV LCD_X,#7
CALL CONV0
MOV A,TEMP1
ANL A,#0FH
SWAP A
ORL A,TEMP2
MOV RES_L,A
JMP LOOP6
LOOP5D: MOV RES_L,TEMP2
JMP LOOP6A
LOOP6: CALL IR_IN
LOOP6A: MOV A,R3 ;重装键值
CJNE A,#0FH,LOOP6B
AJMP MAIN
LOOP6B: CJNE A,#0EH,LOOP6 ;显示(=)
CALL CONV5 ;显示运算结果
JNB 20H.1,LOOP6C
CALL SUADD
LOOP6C: JNB 20H.2,LOOP6D
CALL SUSUB
LOOP6D: JNB 20H.3,LOOP6E
CALL SUMUL
LOOP6E: JNB 20H.4,LOOP7
CALL SUDIV
LOOP7: CALL IR_IN
CJNE A,#0FH,LOOP7 ;复位(清零)
AJMP MAIN
;---------------------------------------------------
; IR 译码子程序
;出口:A、R3存键值
;---------------------------------------------------
IR_IN:
MOV R0,#IRCOM
I1: JNB IRIN,I2 ;等待 IR 信号出现
JMP I1
I2: MOV R4,#20
I20: CALL DEL
DJNZ R4,I20
JB IRIN,I1 ;确认IR信号出现
I21: JB IRIN,I3 ;等 IR 变为高电平
CALL DEL
JMP I21
I3: MOV R3,#0 ;8位数清为0
LL: JNB IRIN,I4 ;等 IR 变为低电平
CALL DEL
JMP LL
I4: JB IRIN,I5 ;等 IR 变为高电平
CALL DEL
JMP I4
I5: MOV R2,#0 ;0.14MS 计数
L1: CALL DEL
JB IRIN, N1 ;等 IR 变为高电平
;IR=0,检查R2中的计数值
MOV A,#8
CLR C
SUBB A,R2 ;判断高低位
;IF C=0 BIT=0
MOV A,@R0
RRC A
MOV @R0,A ;处理完一位
INC R3
CJNE R3,#8,LL ;需处理完8位
MOV R3,#0
INC R0
CJNE R0,#IRCOM+4,LL ;收集到4字节了
JMP IR_SHOW
N1: INC R2
CJNE R2,#30,L1 ;0.14MS 计数过长则时间到自动离开
OK: RET
;--------------------------------------------------------------------
IR_SHOW:
MOV A,IRCOM+3
CPL A ;将25H取反后和24H比较
CJNE A,IRCOM+2,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。
SETB 20H.0 ;解码成功20H.0置1。
MOV A,IRCOM+2
MOV B,A
MOV DPTR,#IR_TABLE_NEW
MOV R3,#0FFH
IR_IN1: INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,IR_IN2
MOV A,R3 ;找到,取顺序码
CALL BEEP_BL ;蜂鸣器鸣响表示解码成功
RET
IR_IN2: CJNE A,#0FFH,IR_IN1 ;末完,继续查
IR_SHOW1: RET
;---------------------------------------------------------
;红外遥控器键值码
;---------------------------------------------------------
IR_TABLE_NEW:
DB 1BH,10H,03H,01H,06H,09H,1DH,1FH,0DH,19H
DB 1CH,14H,0FH,0CH,40H,04H,0FFH
;---------------------------------------------------------
; DELAY R5*0.14MS
DEL:
MOV R5,#1 ;IR解码使用
DEL0: MOV R6,#2
DEL1: MOV R7,#32
DEL2: DJNZ R7,DEL2
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
;------------------------
;加法运算子程序
;入口:R0-被加数,R1-加数
;出口:R4(高)、R2(低)为和值
;------------------------
SUADD:
MOV R1,RES_L
MOV R0,RES_H
MOV A,R0
ADD A,R1
DA A
MOV R2,A
CLR A
ADDC A,#00H
MOV R4,A
MOV OUT_H,R4
MOV OUT_L,R2
CALL T_CONV
RET
;------------------------
;减法运算子程序
;入口:R0-被减数,R1-减数
;出口:R2-差值
;------------------------
SUSUB:
MOV R1,RES_L
MOV R0,RES_H
CLR C
MOV A,#9AH
SUBB A,R1 ;减数十进制求补
ADD A,R0
DA A
MOV R2,A ;差值送R2
JC POSI ;C=1,表示差值为正
NEGA: MOV A,#9AH ;差值为负,求补后得差值的绝对值
SUBB A,R2
MOV R2,A
SETB 20H.5 ;显示负号标记
POSI: MOV OUT_H,#00H
MOV OUT_L,R2
CALL T_CONV
RET
;-------------------------
;乘法运算子程序
;单字节BCD码乘法子程序
;入口: R0(被乘数)、R1(乘数)
;出口: R3(高)、R2(低),积为双字节,BCD码形式的积
;从乘数高位开始进行BCD码移位乘法
;-------------------------
SUMUL:
MOV R1,RES_L
MOV R0,RES_H
BCDMUL:
CLR A ;积单元清零
MOV R2,A
MOV R3,A
MOV A,R1
JZ RETURN
ANL A,#0F0H ;取乘数高位
JZ LBCD ;乘数高位是否为0?
SWAP A
MOV R4,A
ACALL DDBCDM
SWAP A ;BCD码左移一位
MOV R3,A
MOV A,R2
SWAP A
MOV R2,A
ANL A,#0FH
ORL A,R3
MOV R3,A
MOV A,R2
ANL A,#0F0H
MOV R2,A
LBCD: MOV A,R1 ;取乘数低位
ANL A,#0FH
JZ RETURN ;乘数低位是否为0?
MOV R4,A
ACALL DDBCDM
RETURN: MOV OUT_H,R3
MOV OUT_L,R2
CALL T_CONV
RET
DDBCDM: ;一位BCD码乘法
MOV A,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -