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

📄 yalibiao18.s43

📁 基于MSP430单片机的压力表程序。MSP430汇编实现的。比较好。
💻 S43
📖 第 1 页 / 共 3 页
字号:
;
;****************************************
;        ** 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 + -