📄 核终.asm
字号:
;HCY-10 核磁共振含油测量仪 2002.9.5-9.27
; P1.7 P1.6 P1.5(IC74LS138 C B A )
;CS1=HD7279 0 0 0 0001,1111 1FH
;CS2=IC6264 0 0 1 0011,1111 3FH
;CS3=ICAD574A 0 1 0 0101,1111 5FH
;CS4=UP40_STD 0 1 1 0111,1111 7FH
;CS5=IC2732 1 0 0 1001,1111 9FH
;CS6=LCD 1 0 1 1011,1111 BFH
;
;*****************************
;** HCY-10 核磁共振含油量测量仪
;*** 30H-3EH
DAT1 EQU 30H ;液显第一参数单元
dat2 equ 31h ;液显第二参数单元
COM EQU 32H ;液显指令代码单元
C_ADD EQU 0100H ;液显指令通道地址
D_ADD EQU 0000H ;液显数据通道地址
RAD EQU 33H ;读液显数据暂存单元
COUNT EQU 34H ; 8*8点阵字模的个数
O_X EQU 35H ; X 坐标
O_Y EQU 36H ; Y 坐标
CODE EQU 37H ; LCD 显示字暂存寄存器
LCDSTATE EQU 38H ; LCD 状态栏显示字暂存寄存器
res BIT p1.2 ;LCD 的复位端,低电平有效
LCD_BUFFER EQU 39H ;存要显示的"数据"(LCD显示码) LCD_BUFFER+5
;**
;先期运算处理寄存器
PBCD_H EQU 40H
PBCD_L EQU 41H
BINARY_H EQU 42H
BINARY_L EQU 43H
PBCD_D EQU 44H ;(44H-4FH)
bdiv equ 60h ;被除数(低位在前) (60H-65H)
pdiv equ 66h ;除数(低位在前) (66H-6BH)
div_c equ 6Ch ;部分余数(高位在前) (6CH-71H)
pbdiv equ 72h ;暂存差 (72H-76H)
BMUL EQU 60H ;被乘数低字节地址
PMUL EQU 64H ;乘数低字节地址
MULJI EQU 66H ;积的低字节地址
MULJIBYT EQU 70H ;积的字节数
MULADD EQU 71H ;暂存积
;********************
NUMBER_HAO EQU 50H ;编号寄存器(当前输入编号)
NUMBERMIN EQU 51H ;编号最小值寄存器(用于"检查"或"打印")
NUMBERMAX EQU 52H ;编号最大值寄存器
TIMER EQU 53H ;时间寄存器
QUALITY_L EQU 54H ;质量(最低字节)寄存器
QUALITY_M EQU 55H ;质量(中字节)寄存器
QUALITY_H EQU 56H ;质量(最高字节)寄存器
MODIFY_L EQU 57H ;修正寄存器(低字节)
MODIFY_H EQU 58H ;修正寄存器(高字节)
;**
EEPROM_P EQU 60H ;串行 EEPROM 的首地址
EEPROM_BYT EQU 61H ;要读(写)数据的字节数
EEPROM_DAT EQU 62H ;存放数据(读出/要写入)的首地址
EEPROM_SDA BIT P1.1 ;串行 EEPROM 的控制数据线
EEPROM_SCL BIT P1.0 ;串行 EEPROM 的时钟控制线
;**
PRINT_ADR EQU 0FF7FH ;打印机选通信号
PRINT_BUSY BIT P1.4 ;打印机“忙”线 检查
PRINT_DAT EQU 40H ;要打印的数据存放首地址(40H-4FH)
BUFFER_L EQU 5AH ;打印汉字数据地址指针暂存寄存器
BUFFER_H EQU 5BH ;打印汉字数据地址指针暂存寄存器
;打印的数据存放格式:
; 含油率值(??.??%)+质量值(??.???G)+时间值(?)+编号值(??)
; 6 位数 7 位数 1 位数 2 位数
;共占字节 16 BYTES (50H-5FH)
;**
;EEPROM 选用 24LC01(128 BYTS)地址为 00H-7FH
;** 00H-01H 存放键入的编号(0-99)
;** 03H 时间等级(0-9)
;** 10H-14H 质量值(0-99.999)
;** 20H-23H 修正值(0-9.999)
;** 30H-33H 存放计算(含油率)的结果(0-99.99)
; A/D 转换程序 (AD574A)
AD_8 EQU 40H ;存AD转换高8位结果
AD_4 EQU 41H ;存AD转换低4位结果
READ_AD8 EQU 0FFF1H ;读AD转换高8位结果(CPU A1A0=01)
READ_AD4 EQU 0FFF3H ;读AD转换低4位结果(CPU A1A0=11)
STS_AD EQU 0FFFCH ;启动AD转换(CPU RD=0 OR WR=0 A0=0)
AD_STA BIT P1.3 ;AD转换状态检查
END_AD BIT 7FH ;2FH: AD 采样结束标志 位
RAM_ADRH EQU 43H ;RAM 地址暂存 高8位
RAM_ADRL EQU 44H ;RAM 地址暂存 高8位
RAM_LCDH EQU 45H ;
RAM_LCDL EQU 46H ;存放LCD显示数据的RAM地址
RAM_CLRH EQU 47H ;
RAM_CLRL EQU 48H ;存放LCD清显示数据的RAM地址
RAM_CUH EQU 49H
RAM_CUL EQU 4AH
CAI_SHU_D EQU 42H ;采样点
;**
KEY_COM EQU 0FFFFH ;IC8279 命令口地址 P2.7
KEY_DAT EQU 7FFFH ;IC8279 数据口地址
KEY_ZERO BIT 6CH ;清零键按下标志位
KEY_OK BIT 6DH ;; “确定”键按下标志位(=0,有效)
ADTL BIT 6AH ;AD转换双周期标志
SLCDW BIT 69H ;送LCD显示标志位************
;**
KEYNUMBER EQU 7AH ;作键入数据暂存寄存器用 (7AH-7EH)
;进入工作(运行)后,不再键入数据值
H7279_CLK BIT P1.0
H7279_DAT BIT P1.1
H7279_KEY BIT P1.2
;
DATA_IN DATA 40H ;读入数据暂存器
DATA_OUT DATA 41H ;发送数据、命令寄存器
BIT_COUNT DATA 42H ;读、发数据位数计数器
;************************************
;******* 主程序 ***********
ORG 0000H
AJMP 0030H
;
ORG 0003H
;LJMP KEY_INT0
;
;ORG 000BH
;LJMP T0_INT
;
ORG 0013H
LJMP AD_INT1 ;AD转换开始中断,调AD574采样程序。
;
ORG 0030H
NOP
mov r4,#30
lcall d100Ms
lcall lcd_ini ; LCD 初始化
lcall clear12 ; LCD 清屏
lcall disp2 ; LCD 初始化显示
CLR EA
CLR EX1 ;不允许 INT1 中断
CLR IT1; ;INT1 低电平触发
;SETB IT1 ;INT1 边延(下跳)触发
;CLR IT0 ;INT0 低电平触发
;MOV TMOD,#02H ;0000,0010 定时器0 设置
;MOV TL0,#88H;0A2H ;工作方式2,不受 INT0 控制
;MOV TH0,#88H;0A2H
;SETB ET0 ;允许 T0 中断
;SETB TR0 ;启动 T0(开始定时)
;clr tr0
LCALL H7A
INITITION: MOV NUMBER_HAO,#00H
MOV NUMBERMIN,#01H
MOV NUMBERMAX,NUMBERMIN
MOV TIMER,#4
MOV MODIFY_L,#1
MOV MODIFY_H,#00H
MOV QUALITY_L,#99H
MOV QUALITY_M,#99H
MOV QUALITY_H,#09H
HHTY: ORL P1,#0FFH
ANL P1,#3FH
MOV DPTR,#0500H ;外部 RAM 地址,存"编号"
LCALL RAM_ADR
MOV A,NUMBER_HAO
MOVX @DPTR,A
MOV DPTR,#0501H ;外部 RAM 地址,存"时间"
LCALL RAM_ADR
MOV A,TIMER
MOVX @DPTR,A
MOV DPTR,#0502H ;外部 RAM 地址,存"质量"
LCALL RAM_ADR
MOV A,QUALITY_H
MOVX @DPTR,A
INC DPTR
MOV A,QUALITY_M
MOVX @DPTR,A
INC DPTR
MOV A,QUALITY_L
MOVX @DPTR,A
MOV DPTR,#0505H ;外部 RAM 地址,存"修正值"
LCALL RAM_ADR
MOV A,MODIFY_H
MOVX @DPTR,A
INC DPTR ;0506h
MOV A,MODIFY_L
MOVX @DPTR,A
MOV DPTR,#0507H ;外部 RAM 地址,存"含油率"
LCALL RAM_ADR
MOV A,#99
MOVX @DPTR,A
INC DPTR ;0508h 存"含油率"小数部分
MOV A,#99
MOVX @DPTR,A
ORL P1,#0FFH
INC NUMBER_HAO
MOV A,NUMBER_HAO
CLR C
SUBB A,#99
JC HHTY
NOP
MOV R2,#00H
ORL P1,#0FFH
ANL P1,#3FH
MOV DPTR,#0200H ;图形显示数据区 0200H-0300H(256点)
CLR A
LOOPZERO: MOVX @DPTR,A
INC DPTR
DJNZ R2,LOOPZERO
ORL P1,#0FFH
ANL P1,#3FH ;片选 RAM6264 0011,1111 Y1
MOV RAM_ADRH,#00H
MOV RAM_ADRL,#00H
MOV DPTR,#0400H
CLR A
MOVX @DPTR,A ; RAM 0400H = 00
INC DPTR
MOVX @DPTR,A ; RAM 0401H = 00
INC DPTR
MOVX @DPTR,A ; RAM 0402H = 00
ORL P1,#0FFH
NOP
MOV NUMBER_HAO,#00H
MOV RAM_CUL,#01H ;*** 作批次检查时用 ****
;
MAIN: MOV A,#00H
MOV RAM_CUH,#00H
SETB KEY_OK ; “确定”键按下标志位(=0,有效)
SETB KEY_ZERO ; “清零”键按下标志位(=0,有效)
SETB SLCDW ; 送LCD显示标志位
SETB END_AD ; AD 采样结束标志位
LCALL GETKEY ; 扫描键盘,得到键值
KEY_PROC:
JB ACC.4,COMMAND
AJMP MAIN
COMMAND: CJNE A,#11H,FUNC1
LJMP BIANHAO ; 编号
FUNC1: CJNE A,#12H,FUNC2
LJMP WORKING ; 运行
FUNC2: CJNE A,#13H,FUNC3
LJMP WEIGHT ; 质量
FUNC3: CJNE A,#14H,FUNC4
LJMP CHANGE ; 修正
FUNC4: CJNE A,#15H,FUNC5
LJMP TIME ; 时间
FUNC5: CJNE A,#16H,FUNC6
LJMP CHECK ; 检查
FUNC6: CJNE A,#17H,FUNC7
LJMP UPDOWN ; 范围 <>
FUNC7: CJNE A,#19H,FUNC9
LJMP ZERO ; 清零
FUNC9: CJNE A,#1BH,FUNC10
LJMP PRINT ; 打印
FUNC10: CJNE A,#1AH,FUNC11
LJMP PICI ; 批次 #
FUNC11: LJMP MAIN
;***************************************
;***************************************
BIANHAO: LCALL CLR_LCDDAT ;编号
MOV LCDSTATE,#00H
LCALL LCD_PLEASE ;LCD 状态栏显示"编号"字样
MOV LCD_BUFFER+1,#10H
MOV LCD_BUFFER,#10H
MOV O_X,#0D5H
MOV O_Y,#01H
LCALL WRI_DATA ;;LCD 状态栏显示"数据 00"
LCALL H7A
BIANHAO1:
JB H7279_KEY,$ ;有键按下?(H7279_KEY=0)
LCALL GETKEY
JB ACC.4,COMMAND1
MOV 7EH,7DH
MOV 7DH,A
orl p1,#0ffh
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 状态栏显示"数据"
mov a,#00h
AJMP BIANHao1
COMMAND1: CJNE A,#18H,BIANHAO1 ;是"确认"键"吗? N 转
MOV O_X,#35H
MOV O_Y,#00H
LCALL WRI_DATA ;;LCD "编号"显示"数据 ??"
;(LCD_BUFFER,LCD_BUFFER+1的内容)
MOV R0,#7DH
LCALL BCD_P
MOV NUMBER_HAO,A
MOV PBCD_H,#00H
MOV PBCD_L,NUMBER_HAO
LCALL PBCD_BINARY ;把键入的编号值转换成十进制
MOV NUMBER_HAO,PBCD_L ; NUMBER_HAO = 十进制的编号值
;或存在RAM6264中
ORL P1,#0FFH
ANL P1,#3FH
MOV DPTR,#0500H ;外部 RAM 地址,存"编号"
LCALL RAM_ADR
MOV A,NUMBER_HAO
MOVX @DPTR,A ;存编号
ORL P1,#0FFH
LCALL CLR_LCDDAT
mov o_x,#57h
mov o_y,#01h
LCALL WRI_DATA
LCALL LCD_MINGL
MOV RAM_CUL,#01H
LJMP MAIN
;*************
WEIGHT:
LCALL CLR_LCDDAT ;质量MAX=99.999g
MOV LCDSTATE,#02H
LCALL LCD_PLEASE ;LCD 状态栏显示"质量"字样
MOV LCD_BUFFER,#10H
MOV LCD_BUFFER+1,#10H
MOV LCD_BUFFER+2,#0EH
MOV LCD_BUFFER+3,#10H
MOV LCD_BUFFER+4,#10H
MOV LCD_BUFFER+5,#10H
MOV O_X,#0D5H
MOV O_Y,#01H
LCALL WRI_DATA ;;LCD 状态栏显示"数据 00.000"
LCALL H7A
WEIGHT1: JB H7279_KEY,$ ;有键按下?(H7279_KEY=0)
LCALL GETKEY
JB ACC.4,COMMAND2
MOV 7EH,7DH
MOV 7DH,7CH
MOV 7CH,7BH
MOV 7BH,7AH
MOV 7AH,A
MOV A,#10H
ADD A,7EH ;转换成 LCD 显示码
MOV LCD_BUFFER,A
MOV A,#10H
ADD A,7DH
MOV LCD_BUFFER+1,A
MOV LCD_BUFFER+2,#0EH
MOV A,#10H
ADD A,7CH
MOV LCD_BUFFER+3,A
MOV A,#10H
ADD A,7BH
MOV LCD_BUFFER+4,A
MOV A,#10H
ADD A,7AH
MOV LCD_BUFFER+5,A
MOV O_X,#0D5H
MOV O_Y,#01H
LCALL WRI_DATA ;;LCD 状态栏显示"数据"
AJMP WEIGHT1
COMMAND2: CJNE A,#18H,WEIGHT1 ;是"确认"键"吗? N 转
MOV O_X,#95H
MOV O_Y,#00H
LCALL WRI_DATA ;;LCD "质量"显示"数据 ??"
;(LCD_BUFFER,LCD_BUFFER+1的内容)
MOV R0,#7AH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -