📄 yalibiao18.s43
字号:
;
;****************************************
; ** IMD 压力仪 **
;压力表必须经过校准
;存入内部flash地址分配: 1000h ----为校准的最大值(10次ADC之和) 1002h ----校准0时的10次ADC转换值之和
; 1080h ----上限 1082h ----下限
;
;****************************************
#include "msp430x43x.h" ;
;------------bit define-----------------
Ref2 equ 02h ;P2.1
;--------------RAM byte define---------------
CN1 equ 0202h ;LCDM1上限专用寄存器
CN2 equ 0203h ;LCDM2
CN3 equ 0204h ;LCDM3
CN5 equ 0205h ;LCDM5 下限专用寄存器
CN6 equ 0206h ;LCDM6
CN7 equ 0207h ;LCDM7
TOVES equ 0208h ;无意义
flag equ 0209h ;这是在设定上下限时辨别修改到哪个数(左右移动),对应于CN1-7
index equ 020Ah ;更换屏幕(=0时显示压力,2时显示压力上限,4时显示下限,6时显示0(0校准),8时显示4.5(表示校准最大值))
flag1 equ 020Bh ;进入修改时的1,2,3..显示标志,1为上下限,2为校正,3暂时定为确定
HOUR equ 020Dh ;没用到
MIN equ 020Eh ;没用到
SEC equ 020Fh ;没用到
count equ 0210h ;没用到
limIFG equ 0211h ;修改上下限时的闪灭标志变量,01H为灭,00H为亮
setIFG equ 0212h ;进入修改状态标志 00h为没进入 55h为已经进入
ADcount equ 0213h ;AD进行次数
flag3 equ 0214h ;进行校准时的标志变量,=1进入0校准,=2则为进入最大值校准
flag4 equ 0215h ;进入设定上下限后区分上下限屏幕标志(index=1 or 2)
limCN equ 0216h ;16ms定时器计数,用来确定一闪一灭时间长短
stlim equ 0217h ;控制一闪一灭的变量,等于55时允许闪灭,此变量是为了节省WDT中断时间才设置的
;--------------double byte-------------------
;display11 equ 0220h ; clrRAM_LCD 子程序清到地址248h
;display41 equ 0222h ;
TEMP1 equ 0224h ;上限存储器
TEMP2 equ 0226h ;下限存储器
RESULT equ 0228h ;ADC12转换结果保存
R23 equ 022Ah ;临时存储器
R24 equ 022Ch ;临时存储器
;jiaodu1 equ 022Eh ;
;jiaodu2 equ 0230h ;
TMPF1 equ 0232h ;临时存储器下面3个也是
TMPF2 equ 0234h
TMPF3 equ 0236h
TMPF4 equ 0238h ;
Distmp1 equ 023Ah ;浮点数转换成BCD后高4位存放变量
Distmp2 equ 023Ch ;浮点数转换成BCD后低4位存放变量
R18 equ 023Eh ;临时存储器
R16 equ 0240h ;延时子程序入口变量
ADCvalue equ 0242h ;存储ADC12MEM0
R25 equ 0244h ;临时存储器
R26 equ 0246h ;临时存储器
jiaozh equ 0248h ;校准存储器
jzhun equ 024Ah ;校准0存储器
R27 equ 024Ch ;临时存储器
;-------------the Floating Point Package definitions------------------------------
ML equ 24
DOUBLE equ 0 ;Insert .FLOAT format FPP
SW_UFLOW equ 1 ;Underflow is an error
SW_RND equ 0 ;No rounding for conversions
HW_MPY equ 0 ;No hardware multiplier
; Register Definitions for the Floating Point Subroutines
#define ARG1_MSB R5
#define ARG1_LSB R6
#define ARG2_MSB R7
#define ARG2_LSB R8
#define RESULT_MSB R9
#define RESULT_LSB R10
#define HELP R11
#define COUNTER R12
#define RPARG R5
#define RPRES R9
;ML EQU 24 ; Length of mantissa 24 bits
; Definition for the Status Register Bits
;
FN EQU 4 ; Negative bit N in SR
FZ EQU 2 ; Zero bit Z in SR
FC EQU 1 ; Carry bit C in SR
; Define FPP operations for the Linker
PUBLIC FLT_ADD
PUBLIC FLT_SUB
PUBLIC FLT_MUL
PUBLIC FLT_DIV
PUBLIC FLT_CMP
PUBLIC FLT_SAV
PUBLIC FLT_REC
PUBLIC FLT_END
; Register Definitions for the Conversion Subroutines
#define BCD_MSB R5
#define BCD_MID R6
#define BCD_LSB R7
; Binary buffer 48 bits MSBs
#define BIN_MSB R9
#define BIN_MID R10
#define BIN_LSB R8
; Define Conversion Subroutines for the Linker
; PUBLIC CNV_BIN40
PUBLIC CNV_BIN32
PUBLIC CNV_BIN32U
PUBLIC CNV_BIN16
PUBLIC CNV_BIN16U
PUBLIC CNV_BIN
PUBLIC CNV_FP_BIN
PUBLIC CNV_FP_BCD
;------------------------------------------------------------------------------
; 主程序
;------------------------------------------------------------------------------
RSEG CODE
RESET mov #300h,SP ;初始化堆栈指针
call #setup ;初始化设置
nop
mainloop bis #LPM3,SR ;睡眠
nop
mov.b index,R4 ;
loop br Mode(R4)
EVEN
Mode DW play1 ;压力显示
DW play2 ;上限显示
DW play3 ;下限显示
DW play4 ;校准显示
DW play5
play1
bis #ADC12SC,&ADC12CTL0 ;进行AD转换
bic #ADC12SC,&ADC12CTL0
mov.b #067h,LCDM17 ;显示 "P" 意思为 PSI
jmp mainloop ;
no11 call #clrLCD1 ;显示传感器电压,不是显示压力,暂时无用
mov Distmp2,R8
call #outLCD
jmp mainloop ;
play2 cmp.b #01h,limIFG
jeq hei
mov.b CN1,R15
mov.b LCD_Tab(R15),LCDM11
mov.b CN2,R15
mov.b LCD_Tab(R15),LCDM12
mov.b CN3,R15
mov.b LCD_Tab(R15),LCDM13
bis.b #080h,LCDM13
clr.b LCDM14
mov.b #076h,LCDM17
mov.b #04h,LCDM16
jmp mainloop
;-------------------以下这一段跟一闪一灭有关----------------------
hei cmp.b #3,flag
jeq hei_3
cmp.b #2,flag
jeq hei_2
cmp.b #1,flag
jne mainloop
hei_1 clr.b LCDM11
jmp mainloop
hei_3 clr.b LCDM13
jmp mainloop
hei_2 clr.b LCDM12
jmp mainloop
play3 ;call #clrLCD1
cmp.b #01h,limIFG
jeq hei1
mov.b CN5,R15
mov.b LCD_Tab(R15),LCDM11
mov.b CN6,R15
mov.b LCD_Tab(R15),LCDM12
mov.b CN7,R15
mov.b LCD_Tab(R15),LCDM13
bis.b #080h,LCDM13
clr.b LCDM14
mov.b #068h,LCDM17
mov.b #04h,LCDM16
jmp mainloop
hei1 cmp.b #7,flag
jeq hei_7
cmp.b #6,flag
jeq hei_6
cmp.b #5,flag
jne mainloop
hei_5 clr.b LCDM11
jmp mainloop
hei_7 clr.b LCDM13
jmp mainloop
hei_6 clr.b LCDM12
jmp mainloop
;-----------------------------------------------------------------------------------
play4 call #clrLCD1 ;;0V 校准显示 1.00 这个1.0只是起提示作用,并不是校准数为1.0,下面4.50一样
bis #ADC12SC,&ADC12CTL0 ;采一次AD
bic #ADC12SC,&ADC12CTL0
mov.b #07Bh,LCDM11
mov.b #07Bh,LCDM12
mov.b #012h,LCDM13
bis.b #080h,LCDM13
jmp mainloop
play5 call #clrLCD1
bis #ADC12SC,&ADC12CTL0 ;采一次AD
bic #ADC12SC,&ADC12CTL0
mov.b #07Bh,LCDM11 ;5.8psi(或2.0psi) 校准显示4.50
mov.b #03Dh,LCDM12
mov.b #036h,LCDM13
bis.b #080h,LCDM13
jmp mainloop
;-----------------------------------------------------------------
;
;------------------------------------------------------------------
DISADC
mov ADCvalue,jiaozh ;对AD转换结果进行计算,采用浮点数格式
bujiaozh1 mov ADCvalue,RESULT
mov #01000h,R13
cmp #0FFFFh,0(R13) ;判断是否已经校准
jeq calcultate ;没有校准时跳转
mov 2(R13),R7
sub R7,RESULT ;减去下限
jn xiaoy0
mov 0(R13),R27
sub R7,R27 ;减去上限
calcultate
call #FLT_SAV ;CPU寄存器计算前进栈
sub #4,SP ;
mov #RESULT,RPARG ;
call #CNV_BIN16U ;
mov @RPRES+,TMPF1 ;
mov @RPRES+,TMPF2 ;
mov #01000h,R13
cmp #0FFFFh,0(R13)
jeq cal_1
mov #R27,RPARG
call #CNV_BIN16U ;
mov @RPRES+,TMPF3 ;
mov @RPRES+,TMPF4 ;
jmp cal_2
cal_1 mov #08B3Bh,TMPF3
mov #08000h,TMPF4
cal_2 mov #TMPF1,RPRES
mov #TMPF3,RPARG
call #FLT_DIV
mov #F20PH,RPARG ;这个数就是测量压力的最大值,将来就改这个数
call #FLT_MUL ;必须校准完后才能使用04/10/8
mov @RPRES+,TMPF1 ;
mov @RPRES+,TMPF2 ;
mov #01080h,R13 ;上限数---------以下这一段是压力值与上下限比较后点亮对应的灯--------
cmp #0FFFFh,0(R13)
jeq bushi1
mov #01080h,RPARG
call #CNV_BIN16U
mov @RPRES+,R23 ;
mov @RPRES+,R24 ;
mov #R23,RPRES
mov #F100H,RPARG
call #FLT_DIV
mov @RPRES+,R23 ;
mov @RPRES+,R24 ;
bushi1 mov #01082h,R13 ;下限(小)数
cmp #0FFFFh,0(R13)
jeq DL_LED2
mov #01082h,RPARG
call #CNV_BIN16U
mov @RPRES+,R25 ;
mov @RPRES+,R26 ;
mov #R25,RPRES
mov #F100H,RPARG
call #FLT_DIV
mov @RPRES+,R25 ;
mov @RPRES+,R26 ;
mov #TMPF1,RPRES
;;mov #R25,RPARG ;
mov #R23,RPARG
call #FLT_CMP
jhs DL_LED3
mov #TMPF1,RPRES
mov #R25,RPARG
;;mov #R23,RPARG ;
call #FLT_CMP
jlo DL_LED1
DL_LED2 bis.b #BIT1,&P3OUT ;green
bic.b #BIT0+BIT2,&P3OUT
jmp DL_OUT
DL_LED3 bis.b #BIT0,&P3OUT ;red (up)
bic.b #BIT1+BIT2,&P3OUT
jmp DL_OUT
DL_LED1 bis.b #BIT2,&P3OUT ;red (down)
bic.b #BIT0+BIT1,&P3OUT ;-------与上下限比较结束------
DL_OUT mov #TMPF1,RPRES
mov #F1000H,RPARG ;
call #FLT_MUL ;
mov @RPRES+,TMPF3 ;
mov @RPRES+,TMPF4 ;
mov #TMPF3,RPARG ;
call #CNV_FP_BCD ;
mov @SP+,Distmp1 ;
mov @SP+,Distmp1 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -