;$$$$变量定义区(30H-)$$$$$
OUTBIT EQU P2 ; 位控制口
OUTSEG EQU P0 ; 段控制口
ROW_COLUMN EQU P1 ; 读键盘行线口
VARIABLE_DELAY1 EQU 30H ;延时变量
VARIABLE_DELAY2 EQU 31H
VARIABLE_STORE1 EQU 32H ;存储第一个输入数
VARIABLE_STORE2 EQU 33H
VARIABLE_STORE3 EQU 34H ;存储第二个输入数
VARIABLE_STORE4 EQU 35H
VARIABLE_STORE5 EQU 36H ;存储最后结果
VARIABLE_STORE6 EQU 37H
VARIABLE_INPUT1A EQU 38H ;第一个输入数保存地址
VARIABLE_INPUT1B EQU 39H
VARIABLE_INPUT1C EQU 3AH
VARIABLE_INPUT1D EQU 3BH
VARIABLE_INPUT2A EQU 3CH ;第二个输入数保存地址
VARIABLE_INPUT2B EQU 3DH
VARIABLE_INPUT2C EQU 3EH
VARIABLE_INPUT2D EQU 3FH
VARIABLE_REPLACE_POINT EQU 40H ;结果显示位置指针
;VARIABLE_RESULTB EQU 41H
;VARIABLE_RESULTC EQU 42H
;VARIABLE_RESULTD EQU 43H
VARIABLE_SIGN1 EQU 44H ;保存第一个符号位
VARIABLE_SIGN2 EQU 45H ;保存第二个符号位
VARIABLE_INPUT1_POINT EQU 46H ;第一个输入数状态指针,记录输入的位数
VARIABLE_INPUT2_POINT EQU 47H ;第二个输入数状态指针,记录输入的位数
VARIABLE_RESULT_POINT EQU 48H ;第二个输入数状态指针,记录输入的位数
VARIABLE_PLACE1_POINT EQU 49H ;第一个输入数位置指针
VARIABLE_PLACE2_POINT EQU 4AH ;第一个输入数位置指针
VARIABLE_LEDBUF_POINT EQU 4BH ;第一个输入数位置指针
VARIABLE_LEDBUF EQU 4CH ; 显示缓冲
S1 EQU 50H ;自定义数字电路入口与出口
S2 EQU 51H ;功能1实现:将分离个位数字(S1-S5),转化为十进制,存储在S6,S7
S3 EQU 52H ;功能2实现:将十进制位数字(S6-S7),转化为个位数字,存储在(S1-S5)
S4 EQU 53H ;S1(最高位),S5(最低位)
S5 EQU 54H
S6 EQU 55H
S7 EQU 56H
KEY1 BIT P3.2
KEY2 BIT P3.3
KEY3 BIT P3.4
KEY4 BIT P3.5
;****************************************************进入主程序*****************************************************************************
ORG 0000H
AJMP STABLE
ORG 0100H
; *****************************************************键码定义和键值定义*******************************************************************
LEDMAP: ; 八段管显示码(共阳极)
DB 0C0h, 0F9h, 0A4h, 0B0h, 099h, 092h, 082h, 0F8h,080h, 090h, 088h, 083h,0C6H
KEYTABLE:
DB 00h, 04h, 08h
DB 01h, 05h, 09h
DB 02h, 06h, 0Ah
DB 03h, 07h, 0Bh
;$$$$子程序区$$$
$$$
;****************************************************延时程序(30H,31H)**********************************************************************
DELAY:
MOV VARIABLE_DELAY1,#10H
DE1:
MOV VARIABLE_DELAY2,#06FH
DE:
DJNZ VARIABLE_DELAY2,DE
DJNZ VARIABLE_DELAY1 ,DE1
RET
;***************************************************扫描按键程序*****************************************************************************
SCANNING:
JNB KEY1,FUNCTION1_SIGN1
JNB KEY2,FUNCTION2_SIGN1
JNB KEY3,FUNCTION3_SIGN1
JNB KEY4,FUNCTION4_SIGN1
RET
;****************************************************第一个符号位保存程序*****************************************************************
FUNCTION1_SIGN1:
MOV VARIABLE_SIGN1,#1
SJMP SCANNING
FUNCTION2_SIGN1:
MOV VARIABLE_SIGN1,#2
SJMP SCANNING
FUNCTION3_SIGN1:
MOV VARIABLE_SIGN1,#3
SJMP SCANNING
FUNCTION4_SIGN1:
MOV VARIABLE_SIGN1,#4
SJMP SCANNING
;****************************************************LED显示程序****************************************************************************
DISPLAYLED:
MOV R0, #VARIABLE_LEDBUF
MOV R1, #4 ; 共4个八段管
MOV R2, #11111110B ; 从左边开始显示
LOOP:
MOV OUTBIT, #0FFH ; 关所有八段管
MOV OUTSEG, @R0
MOV OUTBIT, R2 ; 显示一位八段管
ACALL DELAY ;
MOV A, R2 ; 位选选中下一位
RL A ;
MOV R2, A ;
INC R0
DJNZ R1, LOOP
RET
;**************************************************行值局部程序*****************************************************************************
GET_ROW1:
MOV A,ROW_COLUMN ; 读入键状态
ORL A, #0f8h ; 高5位不用,变为11111
CPL A ;11111110->00000001,11111101->00000010,11111011->00000100, 1,2,4
RET
;*******************************得到行值程序,出口参数R3(行值)**********************************************************************************
GET_ROW:
MOV ROW_COL