📄 核终.asm
字号:
;
PRINT: MOV A,NUMBER_HAO
MOV NUMBERMIN,A
MOV NUMBERMAX,A
LCALL CLR_LCDDAT ;打印
MOV LCDSTATE,#0DH
LCALL LCD_PLEASE ;LCD 状态栏显示"打印"字样
MOV LCD_BUFFER+1,#11H
MOV LCD_BUFFER,#10H
MOV O_X,#0D5H
MOV O_Y,#01H
LCALL WRI_DATA ;;LCD 状态栏显示"数据 00"
LCALL H7A
; MOV R1,#7EH
PRINT1: JB H7279_KEY,$ ;有键按下?(H7279_KEY=0)
LCALL GETKEY
JB ACC.4,COMMANDP
;MOV @R1,A
;DEC R1
MOV 7EH,7DH
MOV 7DH,A
MOV A,#10H
ADD A,7EH ;转换成 LCD 显示码
MOV LCD_BUFFER,A
MOV A,#10H
ADD A,7DH
MOV LCD_BUFFER+1,A
MOV O_X,#0D5H
MOV O_Y,#01H
LCALL WRI_DATA ;;LCD 状态栏显示"数据"
AJMP PRINT1
COMMANDP: CJNE A,#18H,PRINTC1 ;是"确认"键"吗? N 转
MOV R0,#7DH
LCALL BCD_P
MOV NUMBERMAX,A
MOV PBCD_H,#00H
MOV PBCD_L,NUMBERMAX
LCALL PBCD_BINARY ;把当前键入的编号值转换成十进制
MOV NUMBERMAX,PBCD_L ; NUMBERMAX = 十进制的编号值
INC NUMBERMAX
LJMP PRINTING
PRINTC1: CJNE A,#17H,PRINT1 ;** "范围"键 <>
MOV R0,#7DH
LCALL BCD_P
MOV NUMBERMIN,A
MOV PBCD_H,#00H
MOV PBCD_L,NUMBERMIN
LCALL PBCD_BINARY ;把当前键入的编号值转换成十进制
MOV NUMBERMIN,PBCD_L ; NUMBERMIN = 十进制的编号值
;MOV R1,#7EH
LJMP PRINT1
PRINTING:
MOV A,NUMBERMIN
CJNE A,#00H,PNEXT
INC NUMBERMIN
PNEXT:
MOV NUMBER_HAO,NUMBERMIN
ORL P1,#0FFH
ANL P1,#3FH
MOV DPTR,#0500H ;外部 RAM 地址,存"编号"
LCALL RAM_ADR ;存"编号N"的外部 RAM 地址,
;
MOVX A,@DPTR ;取出"编号"的十进制值
MOV BINARY_H,#00H
MOV BINARY_L,A
LCALL BINARY_PBCD ; 转换成 压缩BCD 码
MOV R0,#PRINT_DAT+14 ; 解压缩BCD 码
MOV A,PBCD_L
LCALL P_BCD
MOV A,PRINT_DAT+14 ;转换成ASCII码
ADD A,#30H
MOV PRINT_DAT+14,A
MOV A,PRINT_DAT+15
ADD A,#30H
MOV PRINT_DAT+15,A
INC DPTR ;DPTR,#0501H
MOVX A,@DPTR
;时间
ADD A,#30H
MOV PRINT_DAT+13,A
INC DPTR ;DPTR,#0502H
MOVX A,@DPTR ;取"质量"值(压缩的BCD码)
ADD A,#30H
MOV PRINT_DAT+6,A ;转换成ASCII码
INC DPTR ;DPTR,#0503H
MOVX A,@DPTR
MOV R0,#PRINT_DAT+7 ; 解压缩BCD 码
; MOV A,PBCD_L
LCALL P_BCD ;******
MOV A,PRINT_DAT+7 ;转换成ASCII码
ADD A,#30H
MOV PRINT_DAT+7,A
MOV A,PRINT_DAT+8
ADD A,#30H
MOV PRINT_DAT+9,A
MOV PRINT_DAT+8,#2EH ;********
INC DPTR ;DPTR,#0504H
MOVX A,@DPTR
MOV R0,#PRINT_DAT+10 ; 解压缩BCD 码
;MOV A,PBCD_L
LCALL P_BCD ;******
MOV A,PRINT_DAT+10 ;转换成ASCII码
ADD A,#30H
MOV PRINT_DAT+10,A
MOV A,PRINT_DAT+11
ADD A,#30H
MOV PRINT_DAT+11,A
MOV PRINT_DAT+12,#47H
INC DPTR ;DPTR,#0505H 修正值
INC DPTR ;DPTR,#0506H
INC DPTR ;DPTR,#0507H 含油率
MOVX A,@DPTR ; 含油率为十进制值
MOV BINARY_L,A
MOV BINARY_H,#00H
;INC DPTR
;MOVX A,@DPTR
;MOV BINARY_L,A;
LCALL BINARY_PBCD
MOV R0,#PRINT_DAT ; 解压缩BCD 码
MOV A,PBCD_L
LCALL P_BCD ;** 解压缩BCD 码
MOV A,PRINT_DAT+1 ;转换成ASCII码
ADD A,#30H
MOV PRINT_DAT+1,A
MOV A,PRINT_DAT
ADD A,#30H
MOV PRINT_DAT,A
INC DPTR
MOVX A,@DPTR
MOV BINARY_L,A;
MOV BINARY_H,#00H
LCALL BINARY_PBCD
MOV R0,#PRINT_DAT+3 ; 解压缩BCD 码
MOV A,PBCD_L
LCALL P_BCD ;** 解压缩BCD 码
MOV A,PRINT_DAT+3 ;转换成ASCII码
ADD A,#30H
MOV PRINT_DAT+3,A
MOV A,PRINT_DAT+4
ADD A,#30H
MOV PRINT_DAT+4,A
MOV PRINT_DAT+2,#2EH
MOV PRINT_DAT+5,#25H
ORL P1,#0FFH
LCALL P_PRINT
INC NUMBER_HAO
MOV NUMBERMIN,NUMBER_HAO
MOV A,NUMBER_HAO
CLR C
SUBB A,NUMBERMAX
JC NEXTPRINT
MOV LCDSTATE,#09H
LCALL LCD_PLEASE ;LCD 显示"命令"字样
LCALL LCD_MINGL
MOV RAM_CUL,#01H
LJMP MAIN
NEXTPRINT: LJMP PRINTING
;
;
;** 计算存储"编号","时间","质量","修正值"的RAM地址
; 0500H = 编号1 数据,0B30H = 编号99 的数据
; 50 + 编号N ,0510 编号2,0520H编号3.....
RAM_ADR: MOV A,NUMBER_HAO
CLR C
ANL A,#0FH
SWAP A
ADDC A,DPL
MOV DPL,A
MOV A,NUMBER_HAO
ANL A,#0F0H
SWAP A
ADDC A,DPH
MOV DPH,A
RET
;
;***
;***** 打印子程序(TPuP-A-40/16) *****
;** CS\ = CS4 (P1.7 P1.6 P1.5 = 011) P1=#7fh
;** BUSY = P1.4 STB =/( /CS4 * (A7+/WR) )
;** STB: 送往打印机的数据选通信号,低电平有效
;** BUSY: 检测打印机状态信号, =1 为"忙"
;**
;PRINT_ADR EQU 007FH ;打印机选通信号 A7=0
;PRINT_BUSY EQU P1.4 ;打印机“忙”线 检查
;PRINT_DAT EQU 50H ;要打印的数据存放首地址
;BUFFER_L EQU 60H ;打印汉字数据地址指针暂存寄存器
;BUFFER_H EQU 61H ;打印汉字数据地址指针暂存寄存器
BUSY: JB PRINT_BUSY, BUSY
RET
P_PRINT: ORL P1,#0FFH
ANL P1,#7FH ;011 1 1111
ACALL BUSY
MOV R5,#00H
MOV DPTR,#PRINT_TAB
MOV BUFFER_H,DPH
MOV BUFFER_L,DPL
P_PRINT1:
ACALL BUSY
MOV DPL,BUFFER_L
MOV DPH,BUFFER_H
CLR A
MOVC A,@A+DPTR
MOV DPTR,#PRINT_ADR
MOVX @DPTR,A
INC R5
MOV DPL,BUFFER_L
MOV DPH,BUFFER_H
INC DPTR
MOV BUFFER_H,DPH
MOV BUFFER_L,DPL
CJNE R5,#0BH,GO1 ;**
MOV R4,#06H
MOV R0,#PRINT_DAT ;打印含油数据
LCALL PRINT_SHUJU
GO1: CJNE R5,#10H,GO2 ;**
MOV R4,#07H
LCALL PRINT_SHUJU ;打印质量数据
GO2: CJNE R5,#15H,GO3
MOV R4,#01H ;打印时间数据
LCALL PRINT_SHUJU
GO3: CJNE R5,#1AH,GOON
MOV R4,#02H
LCALL PRINT_SHUJU ;打印编号数据
GOON: MOV A,#00H
MOV DPL,BUFFER_L
MOV DPH,BUFFER_H
MOVC A,@A+DPTR
CJNE A,#0DH,P_PRINT1
ORL P1,#0FFH
RET
;***
PRINT_SHUJU: LCALL PRINT_SPACE
LCALL PRINT_SPACE
PRINT_SHUJ: ACALL BUSY
MOV DPTR,#PRINT_ADR
MOV A,@R0
MOVX @DPTR,A
INC R0
LCALL PRINT_SPACE
DJNZ R4,PRINT_SHUJ
ACALL BUSY
MOV DPTR,#PRINT_ADR
MOV A,#0AH
MOVX @DPTR,A
RET
;
PRINT_SPACE: ACALL BUSY
MOV DPTR,#PRINT_ADR
MOV A,#20H
MOVX @DPTR,A
RET
PRINT_TAB: DB 0AH,1CH,26H,0AH,0BAH,0ACH,0D3H,0CDH,0C2H,0CAH,3AH ;含油率:
DB 0D6H,0CAH,0C1H,0BFH,3AH ;质量:
DB 0CAH,0B1H,0BCH,0E4H,3AH ;时间:
DB 0B1H,0E0H,0BAH,0C5H,3AH ;编号:
DB 0AH,1CH,2EH,0DH
;************************************
;****** 键盘扫描处理 ******************
GETKEY: ORL P1,#0FFH
ANL P1,#1FH
JB H7279_KEY,$ ;有键按下?(H7279_KEY=0)
MOV DATA_OUT,#00010101B ; 发读键盘指令
LCALL SEND_HD7279
LCALL RECEIVE_HD7279 ;接收键值
ORL P1,#0FFH
LCALL HD7279_P ;键值处理(对应的数据、命令)
KEY_WAIT: JNB H7279_KEY,KEY_WAIT ;按键松开否?
RET
;*****
;****
; 发送1个字节到H7279,高位在前
; 入口: DATA_OUT=要发送的数据(或命令字)
;****
SEND_HD7279: MOV BIT_COUNT,#08H
ORL P1,#0FFH
ANL P1,#1FH ; CS1=0 片选 H7279
LCALL T50US
SH7279_LOOP: MOV A,DATA_OUT
RLC A ;带进位左移 C=D7
MOV H7279_DAT,C ;把 C 送出到 P1.1
SETB H7279_CLK ;时钟高电位有效
LCALL T8US ;
CLR H7279_CLK ;低电位,完成一个脉冲
LCALL T8US
DJNZ BIT_COUNT,SH7279_LOOP ;一个字节送完否? N,转
RET
;****
; 从H7279 接收一个字节,高位在前.(即:键值)
; 出口: DATA_IN = 接收到的数据
;****
RECEIVE_HD7279: MOV BIT_COUNT,#08H
SETB H7279_DAT ; 设置H7279 DATA 端为输入状态(高电平)
LCALL T50US
REH7279_LOOP: SETB H7279_CLK
LCALL T8US
MOV A,DATA_IN
MOV C,H7279_DAT ;读取一位数据
RLC A
MOV DATA_IN,A
CLR H7279_CLK
LCALL T8US
DJNZ BIT_COUNT,REH7279_LOOP ;一个字节接完否? N,转
RET
T50US: MOV R5,#18H
DJNZ R5,$
RET
T8US: MOV R5,#03H
DJNZ R5,$
RET
;** 出口 A = 键入的"数据/命令"值
HD7279_P: MOV A,DATA_IN
;ANL A,#3FH
MOV DPTR,#KEY_TAB
MOVC A,@A+DPTR
RET
KEY_TAB: DB 01H,02H,03H,10H,11H,12H,00H,00H ;10H:命令 11H:编号 12H:运行
DB 04H,05H,06H,13H,14H,15H,00H,00H ;13H:质量 14H:修正 15H:时间
DB 07H,08H,09H,16H,17H,18H,00H,00H ;16H:检查 17H: <> 18H:确认
DB 00H,00H,1FH,19H,1AH,1BH,00H,00H ;19H:清零 1AH: # 1BH:打印
;1FH:小数点 #=批次 <>=范围
;*******
H7A: MOV 7EH,#00H
MOV 7DH,#00H
MOV 7CH,#00H
MOV 7BH,#00H
MOV 7AH,#00H
RET
GETKEY1: ;运行时是否有按键(确定,清零)按下
LCALL GETKEY
CJNE A,#18H,QL
CLR KEY_OK
QL: CJNE A,#19H,EG
CLR KEY_ZERO
EG: RET
;*****
;******* 读取 AD 转换一次数据程序 / 数据存放 RAM 程序
; P1.5 P1.6 P1.7 0101,1111
;CS3=ICAD574A 0 1 0
;STS_AD EQU 0FFF0H ;启动AD转换(CPU RD=0 OR WR=0 A0=0 A1=0)
; AD574 CE=1 R/C=0 A0=0 FFF0H
;读高8位数据 AD574 CE=1 R/C=1 A0=0
; CPU A0=1 A1=0 FFF1H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -