📄 led500.asm
字号:
LCALL DISPLAY
DISPLAY_KEY2_QUIT:
RET
;**************************************************************************
;**********************KEY3显示***************************************
DISPLAY_KEY3:
MOV A,41H
CJNE A,#00H,LED3_AO
LED3_AI:
MOV A,42H
ADD A,#070H
MOV R1,A
LCALL DISPLAY
LJMP DISPLAY_KEY3_QUIT
; ***********************AI 的显示程序,暂时空缺******************************************
LED3_AO:
CJNE A,#01H,LED3_DI
MOV A,42H ;存放AO 数据的首地址
ADD A,#0A0H
MOV R1,A
LCALL DISPLAY
LJMP DISPLAY_KEY3_QUIT
LED3_DI:
CJNE A,#02H,LED3_DO
LCALL DISPLAY_DI
LJMP DISPLAY_KEY3_QUIT
LED3_DO:
CJNE A,#03H,LED3_PID1
MOV A,42H ;存放DO 数据的首地址
ADD A,#0B0H
MOV R1,A
LCALL DISPLAY_DO
LJMP DISPLAY_KEY3_QUIT
LED3_PID1:
CJNE A,#04H,LED3_PID2
MOV A,42H ;存放AO 数据的首地址
ADD A,#0C0H
MOV R1,A
LCALL DISPLAY
LJMP DISPLAY_KEY3_QUIT
LED3_PID2:
MOV A,42H ;存放AO 数据的首地址
ADD A,#0C8H
MOV R1,A
LCALL DISPLAY
DISPLAY_KEY3_QUIT:
RET
;*********************显示@R1的内容*************
DISPLAY:
MOV A,@R1
MOV R7,A
LCALL HEX2BCD1
MOV 30H,#70H
MOV 31H,#20H
MOV 32H,R7
MOV 33H,R6
MOV 34H,R3
MOV 35H,42H ;显示第几个变量
MOV A,40H ;显示第几类变量
ADD A,41H
MOV 36H,A
MOV R5,#07H
MOV R4,#030H
LCALL I2CSTART
LCALL I2CWRITE
LCALL I2CSTOP
RET
;将变量值的各位、十位分别取出,以便应用
;输入 R7:待转换的数值0~99,
;输出 R7 个位 R6 十位
;将变量值的各位、十位分别取出,以便应用
;输入 R7:待转换的数值0~99,
;输出 R7 个位 R6 十位 R3 百位
HEX2BCD1:
MOV A,R7
MOV B,#64H
DIV AB
MOV R3,A
MOV A,#0AH
XCH A,B
DIV AB
MOV R6,A
MOV R7,B
RET
;入口 R1,,,,,,,,,,最后应该在主循环中调用
OUTPUT_521:
MOV A,@R1
MOV R7,A
LCALL Value100_255
MOV 46H,#50H ;521的地址
MOV 47H,42H ;通道选择
MOV R4,#46H
MOV R5,#03H
LCALL I2CSTART
LCALL I2CWRITE
LCALL I2CSTOP
RET
;将变量值范围从0~100放大到0~255
;输入 R7:待转换的变量0~100
;MinValue:最小值,地址范围00H~7FH为直接寻址
;MaxValue:最大值,地址范围00H~7FH为直接寻址
;输出:CurrentValue,转换后0~255,地址范围00H~7FH为直接寻址
Value100_255:
MOV A,R7
SETB C
SUBB A,#064H
JC C0003 ;A<065H进借位C=1,跳到C0003
MOV R7,#64H
C0003:
MOV Current_Value,R7
CLR A
MOV MinValue,A
MOV MaxValue,#64H
CLR C
MOV A,Current_Value
SUBB A,MinValue
MOV B,#0FFH
MUL AB
MOV R5,A
MOV R4,B
CLR OV
CLR C
MOV A,MaxValue
SUBB A,MinValue
MOV R7,A
LCALL DDIVISION
MOV A,R3
MOV Current_Value,A
RET
;功能 双字节除以一个字节
;入口 R4R5被除数,,,,R7除数
;出口 R3
;所用资源: PSW C OV R3~R7
DDIVISION:
CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV
RET
DV50:
MOV R6,#08H
DV51:
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52:
CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53:
INC R3
DV54:
CLR OV
RET
;*************向8255输出数字量**************************************************
OUTPUT_8255:
MOV A,42H ;对应与KEY3键的寄存器的值给A
OUTPUT_0:
CJNE A,#00H,OUTPUT_1
MOV A,@R1
CJNE A,#00H,OUTPUT_0ON
MOV A,3CH
ANL A,#0FEH
LJMP OUTPUT_QUIT
OUTPUT_0ON:
MOV A,3CH
ORL A,#01H
LJMP OUTPUT_QUIT
OUTPUT_1:
CJNE A,#01H,OUTPUT_2
MOV A,@R1
CJNE A,#00H,OUTPUT_1ON
MOV A,3CH
ANL A,#0FDH
LJMP OUTPUT_QUIT
OUTPUT_1ON:
MOV A,3CH
ORL A,#02H
LJMP OUTPUT_QUIT
OUTPUT_2:
CJNE A,#02H,OUTPUT_3
MOV A,@R1
CJNE A,#00H,OUTPUT_2ON
MOV A,3CH
ANL A,#0FBH
LJMP OUTPUT_QUIT
OUTPUT_2ON:
MOV A,3CH
ORL A,#04H
LJMP OUTPUT_QUIT
OUTPUT_3:
CJNE A,#03H,OUTPUT_4
MOV A,@R1
CJNE A,#00H,OUTPUT_3ON
MOV A,3CH
ANL A,#0F7H
LJMP OUTPUT_QUIT
OUTPUT_3ON:
MOV A,3CH
ORL A,#08H
LJMP OUTPUT_QUIT
OUTPUT_4:
CJNE A,#04H,OUTPUT_5
MOV A,@R1
CJNE A,#00H,OUTPUT_4ON
MOV A,3CH
ANL A,#0EFH
OUTPUT_4ON:
MOV A,3CH
ORL A,#10H
OUTPUT_5:
CJNE A,#05H,OUTPUT_6
MOV A,@R1
CJNE A,#00H,OUTPUT_5ON
MOV A,3CH
ANL A,#0DFH
LJMP OUTPUT_QUIT
OUTPUT_5ON:
MOV A,3CH
ORL A,#20H
LJMP OUTPUT_QUIT
OUTPUT_6:
CJNE A,#06H,OUTPUT_7
MOV A,@R1
CJNE A,#00H,OUTPUT_6ON
MOV A,3CH
ANL A,#0BFH
LJMP OUTPUT_QUIT
OUTPUT_6ON:
MOV A,3CH
ORL A,#40H
LJMP OUTPUT_QUIT
OUTPUT_7:
CJNE A,#07H,OUTPUT_RET
MOV A,@R1
CJNE A,#00H,OUTPUT_7ON
MOV A,3CH
ANL A,#07FH
LJMP OUTPUT_QUIT
OUTPUT_7ON:
MOV A,3CH
ORL A,#80H
OUTPUT_QUIT:
MOV 3CH,A
MOV DPTR,#4001H
MOV A,3CH
MOVX @DPTR,A
OUTPUT_RET:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY_DO:
MOV A,@R1 ;入口R1
JNZ DISPLAY_OA
DISPLAY_OFF:
MOV 30H,#70H
MOV 31H,#20H
MOV 32H,#0FH
MOV 33H,#0FH
MOV 34H,#00H
MOV 35H,42H
LJMP C0009
DISPLAY_OA:
MOV 30H,#70H
MOV 31H,#20H
MOV 32H,#0AH
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,42H
C0009:
MOV A,40H
ADD A,41H
MOV 36H,A
MOV R5,#07H
MOV R4,#030H
LCALL I2CSTART
LCALL I2CWRITE
LCALL I2CSTOP
RET
;***********************************************************************
;********************显示DI,这段程序最后要在主循环中处理***************************************
DISPLAY_DI:
MOV A,42H
CJNE A,#00H,DISPLAY_DI1
MOV A,3BH;8255的输入数据
JNB ACC.0,DI000
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI000:
LCALL DISPLAY_OFF
LJMP DISPLAY_DI_QUIT
DISPLAY_DI1:
CJNE A,#01H,DISPLAY_DI2
MOV A,3BH;8255的输入数据
JNB ACC.1,DI001
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI001:
LCALL DISPLAY_OFF
LJMP DISPLAY_DI_QUIT
DISPLAY_DI2:
CJNE A,#02H,DISPLAY_DI3
MOV A,3BH;8255的输入数据
JNB ACC.2,DI002
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI002:
LCALL DISPLAY_OFF
LJMP DISPLAY_DI_QUIT
DISPLAY_DI3:
CJNE A,#03H,DISPLAY_DI4
MOV A,3BH;8255的输入数据
JNB ACC.3,DI003
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI003:
LCALL DISPLAY_OFF
LJMP DISPLAY_DI_QUIT
DISPLAY_DI4:
CJNE A,#04H,DISPLAY_DI5
MOV A,3BH;8255的输入数据
JNB ACC.4,DI004
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI004:
LCALL DISPLAY_OFF
LJMP DISPLAY_DI_QUIT
DISPLAY_DI5:
CJNE A,#05H,DISPLAY_DI6
MOV A,3BH;8255的输入数据
JNB ACC.5,DI005
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI005:
LCALL DISPLAY_OFF
LJMP DISPLAY_DI_QUIT
DISPLAY_DI6:
CJNE A,#06H,DISPLAY_DI7
MOV A,3BH;8255的输入数据
JNB ACC.6,DI006
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI006:
LCALL DISPLAY_OFF
LJMP DISPLAY_DI_QUIT
DISPLAY_DI7:
MOV A,3BH;8255的输入数据
JNB ACC.7,DI007
LCALL DISPLAY_OA
LJMP DISPLAY_DI_QUIT
DI007:
LCALL DISPLAY_OFF
DISPLAY_DI_QUIT:
RET
;模拟量输入数据处理,把AI从0~4096压缩为0~100,用到中转寄存器4BH~4FH,考虑遇到中断的情况
PRO_AI:
MOV 4FH,#070H
MOV R0,#80H;197所采集的数据
PRO_DI_CYL:
MOV A,@R0 ;取出数据
MOV R3,A
INC R0
MOV A,@R0
MOV R2,A
MOV R6,#00H ;乘以100
MOV R7,#64H
LCALL MULD
MOV 4BH,R2
MOV 4CH,R3
MOV 4DH,R4
MOV 4EH,R5
MOV R2,4BH
MOV R3,4CH
MOV R4,4DH
MOV R5,4EH
MOV R6,#0FH ;除以4095
MOV R7,#0FFH
LCALL DIVD
MOV R1,4FH
MOV A,R3
MOV @R1,A ;存放地位商
INC R0
INC 4FH
MOV A,4FH
CJNE A,#078H,PRO_DI_CYL
RET
;标号:MULD 功能: 双字节二进制无符号数乘法
;入口:被乘数R2R3,乘数R6R7,出口:乘积在R2R3R4R5
;影响资源:PSW ,A,B.,,R2~R7,,,,,堆栈需求R6R7
MULD:
MOV A,R3;计算R3*R7
MOV B,R7
MUL AB
MOV R4,B;暂存部分积
MOV R5,A
MOV A,R3;R3*R6
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R4;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A;?把进位标志C 移进来
XCH A,R2;R2*R6
MOV B,R6
MUL AB
ADD A,R3;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;DIVD功能:双字节二进制无符号数除法
;入口条件:被除数在R2,R3,R4,R5中,除数在R6.R7中,R2,R6高位
;出口:OV=0时,双字节商R2,R3中,OV=1时溢出。
;影响资源 PSW,A,B,R1-R7,堆栈需求2字节
DIVD:
CLR C ;比较除数和被除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DIVD1
SETB OV ;溢出
RET
DIVD1:
MOV B,#10H ;计算双字节的商
DIVD2:
CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置1
DVD3:
DJNZ B,DIVD2 ;计算完16位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -