⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 核终.asm

📁 核磁共振含油测量仪
💻 ASM
📖 第 1 页 / 共 5 页
字号:
     ;
      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 + -