            NAME    main                    ; Nombre del Modulo

            PUBLIC  main                    ; make the main label vissible
                                            ; outside this module
;                    MSP430G2x31
;                 -----------------
;         3.3V---|[1]          [14]|---GND
;                |                 |
;    ________    |             P1.6|-->LED Verde
; 5V|        |OUT|                 |
;---| LM35DZ |---|P1.5/A5      P1.0|-->LED ROJO
;   |________|   |                 | 
;        |GND
;       _|_
;        -

DMILLAR EQU 0x200
UMILLAR EQU 0x210
CENTENA  EQU 0x220
DECENA  EQU 0x230
UNIDAD EQU 0x240
NIVEL EQU 0x250
REP EQU 0x260

#include "msp430g2231.h"                    ; #define controlled include file
;-------------------------------------------------------------------------------        
            ORG   0xF800                    ;Inicio del programa
;-------------------------------------------------------------------------------
main
RESET       MOV.W   #0x280,SP               ; Inicialización del stackpointer
            MOV.W   #WDTPW+WDTHOLD,&WDTCTL  ; Watchdog timer detenido 
            
            MOV.B   &CALBC1_1MHZ,&BCSCTL1   ; DCO funcionando a la frecuencia
            MOV.B   &CALDCO_1MHZ,&DCOCTL    ; calibrada de 1MHz
            
;Configuración del las terminales del Puerto 1
//CLR.B &P1SEL
            BIC.B   #BIT0+BIT3+BIT4+BIT5+BIT6+BIT7,&P1SEL
            BIS.B   #BIT0+BIT3+BIT4+BIT5+BIT6+BIT7,&P1DIR       ;Terminales P1.6 y P1.0 configuradas como salida           

;Configuración del convertidor ADC10
            MOV.W   #SREF_1+ADC10SHT_1+MSC+REFON+ADC10ON,&ADC10CTL0 ;Voltaje de referencia interno activado 1.5V, 8 ciclos para muestreo
            MOV.W   #INCH_1+CONSEQ_2,&ADC10CTL1 ;Canal 5 (P1.5) 1canal y multiples conversiones
            BIS.B   #BIT1,&ADC10AE0             ;Terminal P1.5 como entra del Canal 1 del ADC
            
            BIS.W   #ENC+ADC10SC,&ADC10CTL0 ; Inicio muestreo/conversión

;---------| Programa Principal |------------------------------------------------
   //         BIC.B   #BIT6+BIT0,&P1OUT
   
   
   
    CALL    #INI_LCD
         MOV     #0x01,R4
         CALL    #CMD_LCD
         MOV.W   #LETRERO1,R6
         CALL    #IMP_LET
        MOV     #0xC0,R4
         CALL    #CMD_LCD
         MOV.W   #LETRERO2,R6
         CALL    #IMP_LET
         MOV     #0x0C,R4
         CALL    #CMD_LCD
         
       

TEST        MOV.W   #0xFFFF,R5
            CALL    #PAUSA
            MOV.W   #0xFFFF,R5
            CALL    #PAUSA
            MOV.W   #0xFFFF,R5
            CALL    #PAUSA
              JMP MEDIR
            
        
            
MEDIR: MOV.W  &ADC10MEM,R11

MOV.W #1500,R12
CALL #MUL16X16BITS

//MOV.W   R14,GRADOS
            
            MOV.B #0x30,DMILLAR
             MOV.B #0x30,UMILLAR
              MOV.B #0x30,CENTENA
              MOV.B #0x30,DECENA
              MOV.B #0x30,UNIDAD
              
            
RMIL:  SUB.W #1000,R14
        JNC RMIL1
        INC.B UMILLAR
        JMP RMIL
        
RMIL1: ADD.W #1000,R14
RCIEN:  SUB.W #100,R14
        JNC CIEN1
        INC.B CENTENA
        JMP RCIEN
        
CIEN1: ADD.W #100,R14
RDIEZ:  SUB.W #10,R14
        JNC FIN
        INC.B DECENA 
        JMP RDIEZ
        
        
FIN:  ADD.W #10,R14
      ADD.B R14,UNIDAD
      
      MOV.B #0x01,R4
      CALL #CMD_LCD
      MOV.B #0x02,R4
      CALL #CMD_LCD
      
  MOV.W DECENA,NIVEL
    MOV.W NIVEL,REP
  
CICLO   CMP.B #0x30,NIVEL
    JEQ MOSTRAR
    
    
    
MOSTRAR1:  CMP.B #0x2F,REP
    JEQ SALTO
    
     MOV.B #0xFF,R4
      CALL #DATOS_LCD
      DEC REP
      JMP MOSTRAR1
      
      
      
SALTO:    DEC NIVEL
      JMP CICLO
      
      
  
      
      
 MOSTRAR:     MOV.B #0x40,R4
      CALL #CMD_LCD
          
      MOV.B #0xC0,R4
      CALL #CMD_LCD
          
      MOV.W   #LETRERO3,R6
         CALL    #IMP_LET
      
      CMP.B #0x30,UMILLAR
      JEQ SIGUIENTE
     
      MOV.B UMILLAR,R4
      CALL #DATOS_LCD
 SIGUIENTE:     MOV.B CENTENA,R4
      CALL #DATOS_LCD
      MOV.B DECENA,R4
      CALL #DATOS_LCD
      MOV.B #'.',R4
      CALL #DATOS_LCD
      MOV.B UNIDAD,R4
      CALL #DATOS_LCD
      MOV.B #' ',R4
      CALL #DATOS_LCD
     
      
       MOV.B #0xDF,R4
      CALL #DATOS_LCD
      
     
      
      MOV.B #'C',R4
      CALL #DATOS_LCD
  //    MOV.B #'E',R4
 //     CALL #DATOS_LCD
 //     MOV.B #'L',R4
//      CALL #DATOS_LCD
//       MOV.B #'S',R4
//      CALL #DATOS_LCD
//      MOV.B #'I',R4
//      CALL #DATOS_LCD
//      MOV.B #'U',R4
//      CALL #DATOS_LCD
//      MOV.B #'S',R4
//      CALL #DATOS_LCD
      
      JMP TEST

;-------------------------------------------------------------------------------
;           Subrutinas
;-------------------------------------------------------------------------------

            
            
      
;INICIALIZACION PARA UNA LCD DE 2x16 CON UN BUS DE 4 BITS (PARALELO)

INI_LCD     BIC.B   #0xF9,&P1SEL               ;INICIALIZANDO LCD 2x16
            BIS.B   #0xF9,&P1DIR
            BIC.B   #0xF9,&P1OUT
            
            MOV.W   #2998,R5                   ;TIEMPO DE 15 mseg(n=2998).
            CALL    #PAUSA
            
            BIS.B   #BIT5,&P1OUT
            CALL    #ENABLE
            
            MOV.W   #1000,R5                   ;TIEMPO MAS DE 40 microseg(N=6).
            CALL    #PAUSA
            
            CALL    #ENABLE
            BIC.B   #0xF0,&P1OUT
            BIS.B   #BIT7,&P1OUT
            CALL    #ENABLE
            
            MOV.W   #1000,R5                      ;TIEMPO MAS DE 40 microseg.
            CALL    #PAUSA
            
            BIC.B   #0xF8,&P1OUT
            CALL    #ENABLE
            BIS.B   #0xF0,&P1OUT
            CALL    #ENABLE
            
            MOV.W   #1000,R5                      ;TIEMPO MAS DE 40 microseg
            CALL    #PAUSA
            
            BIC.B   #0xF8,&P1OUT
            CALL    #ENABLE
            BIS.B   #BIT4,&P1OUT
            CALL    #ENABLE
            
            MOV.W   #926,R5                      ;TIEMPO MAS DE 1.64 mseg.
            CALL    #PAUSA           
            
            RET
            
;FUNCION ENVIO  DE COMAND0S AL LCD      
CMD_LCD     BIC.B   #BIT3,&P1OUT              
            CALL    #ENVIO_4BITS
            MOV.W   #426,R5                    ;TIEMPO DE 1.64 mseg.
            CALL    #PAUSA
            RET

;FUNCION ENVIO DE DATOS AL LCD        
DATOS_LCD   BIS.B   #BIT3,&P1OUT               ;DATOS
            CALL    #ENVIO_4BITS
            MOV.W   #6,R5                     ;TIEMPO DE 40 microseg.
            CALL    #PAUSA
            RET
;FUNCION ENVIA 8 BITS A TRAVES DE UN BUS DE 4 BITS         
ENVIO_4BITS PUSH    R4
            AND     #0xF0,R4                  ;ENVIO DE 4 BITS
            BIC.B   #0xF0,&P1OUT
            BIS.B   R4,&P1OUT
            CALL    #ENABLE
            BIC.B   #0xF0,&P1OUT                ;;;
            POP     R4
            BIC     #0xF0,R4
            RLA     R4
            RLA     R4
            RLA     R4
            RLA     R4
            BIS.B   R4,&P1OUT
            CALL    #ENABLE
            BIC.B   #0xF0,&P1OUT                ;;;
            RET
            
;FUNCION PARA IMPRIMIR LETREROS EN LCD            
IMP_LET     MOV.B   @R6+,R4
            CALL    #DATOS_LCD
            CMP.B   #0x00,0(R6)
            JNZ     IMP_LET
            RET

;RUTINA DE TIEMPO        
PAUSA       DEC     R5                          ;TIEMPO
            CMP     #0x00,R5
            NOP
            JNE     PAUSA
            RET

;ENVIO DE UN PULSO PARA ENABLE DEL LCD
ENABLE      BIS.B   #BIT0,&P1OUT                ;E=1
            MOV.W   #100,R5                     ;TIEMPO DE 40 microseg.
            CALL    #PAUSA
            BIC.B   #BIT0,&P1OUT                ;E=0
         
            RET   
            
            
LETRERO1 DC8 'MIGUEL ANGEL',0x00
LETRERO2 DC8 'TERMOMETRO',0x00   
LETRERO3 DC8 'TEMP DE ',0x00
LETRERO4 DC8 'TEMP ALTA',0x00
LETRERO5 DC8 'TEMPERATURA DE:', 0x00,0x00



MUL16X16BITS:
     CLR.W R14
     CLR.W R15
     CLR.W R13
     MOV.W #1,R10
MULT2  BIT.W R10,R11
       JZ MULT1
        ADD.W R12,R14
       ADDC.W R13,R15
MULT1   RLA.W R12
        RLC.W R13
        RLA.W R10
        JNC MULT2
        
   
DIV_1024:   BIC.W #0X00FF,R14
            ADD.W R15,R14
            SWPB R14
            RRA.W R14
            RRA.W R14
RET
;-------------------------------------------------------------------------------
;           Rutinas de Servicio de Interrupción
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
;           Vectores de Interrupción
;-------------------------------------------------------------------------------
            ORG     0xFFFE                  ;Vector de RESET del MSP430
            DW      RESET      
            
            END
            END     main