📄 sydzc.asm
字号:
MOV A,#'.'
ACALL WriteDataLCD
MOV A,LJ_J
ADD A,#30H
ACALL WriteDataLCD
MOV A,LJ_F
ADD A,#30H
ACALL WriteDataLCD
MOV A,#5CH
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
RET
LCDDISP4:
MOV A,#80H ;设定从第一行(80H)的第5个位置开始显示
ACALL WriteCommandLCD
MOV A,#'S'
ACALL WriteDataLCD
MOV A,#'P'
ACALL WriteDataLCD
MOV A,SPHAO
ADD A,#30H
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#'D'
ACALL WriteDataLCD
MOV A,#'J'
ACALL WriteDataLCD
MOV A,#'X'
ACALL WriteDataLCD
MOV A,#'G'
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#0C0H ;设定从第一行(80H)的第5个位置开始显示
ACALL WriteCommandLCD
MOV A,DANJIA_S
ADD A,#30H
ACALL WriteDataLCD
MOV A,DANJIA_Y
ADD A,#30H
ACALL WriteDataLCD
MOV A,#2EH ;"."号
ACALL WriteDataLCD
MOV A,DANJIA_J
ADD A,#30H
ACALL WriteDataLCD
MOV A,DANJIA_F
ADD A,#30H
ACALL WriteDataLCD
MOV A,#5CH
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
MOV A,#' '
ACALL WriteDataLCD
RET
;==========================KEYSCAN========================
KEYSCAN:
CLR KEY_FLAG
ACALL KEYON
JNZ DELAY ;不为全0则有键按下跳到DILAY
RET
DELAY: ACALL D10MS ;延时消抖动
ACALL KEYON ;再次判断有无键按下
JNZ SCAN ;有键按下跳至SCAN
RET
SCAN: MOV R1,#0FEH ;首行扫描
MOV R3,#00H ;记录行号
KEYD: MOV A,R1
MOV KEY_PORT,A
MOV A,KEY_PORT
JB ACC.4,KEY1
MOV A,#00H
AJMP KEYDATA
KEY1: JB ACC.5,KEY2
MOV A,#04H
AJMP KEYDATA
KEY2: JB ACC.6,KEY3
MOV A,#08H
AJMP KEYDATA
KEY3: JB ACC.7,NEXT
MOV A,#0CH
KEYDATA: ADD A,R3 ;计算键值
PUSH ACC
KEY4: ACALL KEYON ;判断按键释放没有?
JNZ KEY4
POP ACC
MOV KEY_DATA,A ;键值保存在KEY_DATA单元
SETB KEY_FLAG ;置标志位为1
RET
NEXT: INC R3
MOV A,R1
JNB ACC.3,EXIT ;扫描完毕
RL A
MOV R1,A
AJMP KEYD
EXIT: RET
KEYON: MOV KEY_PORT,#0F0H ;高4位设为输入
MOV A,KEY_PORT ;读高四位
CPL A ;取反
ANL A,#0F0H ;屏蔽低四位
RET
D10MS: PUSH 07H
PUSH 06H
MOV R7,#05H
LOOP1: MOV R6,#0F9H
NOP
NOP
LOOP2: DJNZ R6,LOOP2
DJNZ R7,LOOP1
POP 06H
POP 07H
RET
;====================KEYJUST1================= 选择商品(012)
KEY_JUST1:
MOV A,KEY_DATA
CJNE A,#10,KEY_N1
KEY_N0: CLR C
SUBB A,#10
CJNE A,#2,KEY_N3
KEY_N4: MOV SPHAO,A ;保存商品号
RL A
MOV DPTR,#JMP_TABLE
JMP @A+DPTR
NOP
NOP
AJMP JUST_EXIT ;???????????
KEY_N3: JC KEY_N4
AJMP MAIN_LOOP1
KEY_N1: JNC KEY_N0
JUST_JMP:AJMP MAIN_LOOP1
JUST_EXIT: RET
JMP_TABLE:
AJMP FUNCTION_0
AJMP FUNCTION_1
AJMP FUNCTION_2
NOP
RET
FUNCTION_0:
MOV DANJIA_ZS,DANJIA0_ZS
MOV DANJIA_XS,DANJIA0_XS
RET
FUNCTION_1:
MOV DANJIA_ZS,DANJIA1_ZS
MOV DANJIA_XS,DANJIA1_XS
RET
FUNCTION_2:
MOV DANJIA_ZS,DANJIA2_ZS
MOV DANJIA_XS,DANJIA2_XS
RET
;---------------------------------
KEY_JUST2:
MOV A,KEY_DATA
CJNE A,#10,KEY1_N1
KEY1_N0: CLR C
SUBB A,#10
CJNE A,#2,KEY1_N3
KEY1_N4: MOV SPHAO,A ;保存商品号
RL A
MOV DPTR,#JMP_TABLE
JMP @A+DPTR
NOP
NOP
AJMP JUST2_EXIT ;???????????
KEY1_N3: JC KEY1_N4
AJMP MAIN_LOOP5
KEY1_N1: JNC KEY1_N0
JUST2_JMP:AJMP MAIN_LOOP5
JUST2_EXIT: RET
;================数据处理程序===================
DATA_CHULI1:
MOV R6,DANJIA_ZS
MOV R7,DANJIA_XS
ACALL HB2
MOV A,R4
ACALL HBCD
MOV DANJIA_S,R6
MOV DANJIA_Y,R7
MOV A,R5
ACALL HBCD
MOV DANJIA_J,R6
MOV DANJIA_F,R7
RET
DATA_CHULI2: ;X/51*DANJIA
MOV R2,#00H
MOV R3,AD_DATA
MOV R6,DANJIA_ZS
MOV R7,DANJIA_XS
ACALL MULD
MOV R7,#33H
ACALL DV31
MOV ZHJIA_ZS,R4
MOV ZHJIA_XS,R5
MOV R6,#0H ;R4R5中的数转到R6R7中
MOV R7,#0H
MOV A,R4
XCH A,R6
MOV A,R5
XCH A,R7
ACALL HB2
MOV A,R3
ACALL HBCD
MOV ZHJIA_B,R7
MOV A,R4
ACALL HBCD
MOV ZHJIA_S,R6
MOV ZHJIA_Y,R7
MOV A,R5
ACALL HBCD
MOV ZHJIA_J,R6
MOV ZHJIA_F,R7
RET
DATA_CHULI3:
MOV A,AD_DATA
MOV B,#5
MUL AB
MOV AD_DATA1,B
MOV B,#10
MUL AB
MOV AD_DATA2,B
MOV B,#10
MUL AB
MOV AD_DATA3,B
RET
DATA_CHULI4:
CLR C
MOV A,25H
MOV B,#10H
MUL AB
ADD A,26H
MOV R2,A
CLR C
MOV A,27H
MOV B,#10H
MUL AB
ADD A,28H
MOV R3,A
ACALL BH2
MOV A,SPHAO
MOV B,#2
MUL AB
CLR C
ADD A,#2AH
MOV R0,A
MOV A,R2
MOV @R0,A
INC R0
MOV A,R3
MOV @R0,A
RET
;===============双字节乘法子程序=================
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
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 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
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
;=============三字节除以单字节子程序============
;入口条件:被除数在R3、R4、R5中,除数在R7中。
;出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV;商溢出
RET
DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5
DM23: 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
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3 ;四舍五入
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: CLR OV
RET ;商在R4R5中
;=========双字节十六进制整数转换成双字节BCD码整数=====
;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;===================双字节的加法================
;R1R2+R3R4=R6R7(没有进位R6R7可以装下的数)
BCDA: CLR C
MOV A,R2
ADD A,R4
MOV R7,A
MOV A,R1
ADDC A,R3
MOV R6,A
RET
;===================HBCD========================
;入口条件:待转换的单字节十六进制整数在累加器A中
HBCD: MOV B,#10H
DIV AB
MOV R6,A
MOV R7,B
RET
;==============R2R3(BCD)->R2R3===========
BH2: MOV A,R3 ;;将低字节转换成十六进制
LCALL BCDH
MOV R3,A
MOV A,R2 ;将高字节转换成十六进制
LCALL BCDH
MOV B,#100 ;扩大一百倍
MUL AB
ADD A,R3;和低字节按十六进制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
BCDH: MOV B,#10H;分离十位和个位
DIV AB
MOV R4,B;暂存个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,R4 ;按十六进制加上个位
RET
;======================================================
;================AD==================
AD_TLC2543:
JNB AD_EOC,AD_TLC2543
JNB AD_EOC,AD_TLC2543
CLR AD_CS
MOV AD_DATA,#0
MOV AD_DATAL,#0
CLR AD_CLK
MOV R5,#8
ADC_L1: NOP
MOV C,AD_OUT
MOV A,AD_DATA
RLC A
MOV AD_DATA,A
MOV A,AD_CON
RLC A
MOV AD_IN,C
MOV AD_CON,A
SETB AD_CLK
NOP
CLR AD_CLK
DJNZ R5,ADC_L1
CLR AD_IN
MOV R5,#4
ADC_L2: NOP
MOV C,AD_OUT
MOV A,AD_DATAL
RLC A
MOV AD_DATAL,A
SETB AD_CLK
NOP
CLR AD_CLK
DJNZ R5,ADC_L2
SETB AD_CS
RET
;================中断1服务程序==================
TIME0: PUSH ACC
DJNZ TIM0,S0
MOV TIM0,#100
DJNZ TIM1,S0
MOV TIM1,#100 ;统计100*100次
INC LSL
MOV A,LSL
CJNE A,#10,S0
MOV LSL,#0
INC LSH
MOV A,LSH
CJNE A,#6,S0
MOV LSH,#0 ;秒
INC LML
MOV A,LML
CJNE A,#10,S0
MOV LML,#0
INC LMH
MOV A,LMH
CJNE A,#6,S0
MOV LMH,#0 ;分
INC LHL
MOV A,LHL
CJNE A,#10,S1
MOV LHL,#0
INC LHH
SJMP S0
S1: MOV A,LHH
MOV B,#10
MUL AB
ADD A,LHL ;判断是否到24时,LHH*10+LHL
CJNE A,#24,S0
MOV LHH,#0
MOV LHL,#0 ;时
INC WEEK
MOV A,WEEK
CJNE A,#6,S2
S2: JC S0
MOV WEEK,#00H
S0: POP ACC
RETI
;===============5S延时==================
DELAY5S: PUSH 04H
PUSH 05H
PUSH 06H
MOV R4,#50
DELAY5S_0:MOV R5,#200
DELAY5S_1:MOV R6,#245
DJNZ R6,$
DJNZ R5,DELAY5S_1
DJNZ R4,DELAY5S_0
POP 06H
POP 05H
POP 04H
RET
TABL1: DB 'SMTWTFS'
TABL2: DB 'uouehra'
TABL3: DB 'nneddit'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -