#include    "msp430x44x.h" ;  MSP430x44x Standard Definitions
;*******************************************************************************
;  MSP-FET430P440 Demo - LCD, displays numbers on 4 multiplex rate LCD
;
;  Description "FET440_4muxLCD": This program displays digits stored in regiser
;  R14 on a 4 mux LCD, then waits in low power mode 3. To use the program
;  enter a 4 digit BCD number (digits 0-9) in R14 and press enter.  Reset and
;  run the program.  The value in R14 will be displayed on the LCD. If the user
;  does not have the LCD connected, the functioning of the software can still be
;  followed by single stepping and watching the register values, the LCDTEMP
;  value in RAM, and the LCD memory values in the LCD memory locations.
;   ACLK = LFXT1 = 32768, MCLK = SMCLK = DCO = 32xACLK = 1.048576MHz 
;   //*An external watch crystal is required on XIN/XOUT for ACLK*//	  
;
;  NOTE: The code is written such that single digits can be passed to the 
;        display routine.  The routine to shift bytes in the mainloop could be
;        moved to the display routine if passing of multiple digits is preferred
;  
;                                 Connections MSP430 -> LCD
;                                 -------------------------
;
;                                T.I.                  T.I.
;                           MSP430x4xx MCU   STK/EVK 6.5 digit 4 mux LCD
;                                                    #T218010
;                           ---------------       --------------
;                          |          COM3 |-----|2    COM4     |
;                          |          COM2 |-----|1    COM3     |
;                          |          COM1 |-----|3    COM2     | 
;                          |          COM0 |-----|4,20 COM1     |
;                          |          SEG0 |-----|19            |
;                          |          SEG1 |-----|18            |
;                          |          SEG2 |-----|17            |
;                          |          SEG3 |-----|16            |  
;                          |          SEG4 |-----|15            |
;                          |          SEG5 |-----|14            |
;                          |          SEG6 |-----|13            |
;                          |          SEG7 |-----|12            |
;                          |          SEG8 |-----|11            | 
;                          |          SEG9 |-----|10            |
;                          |          SEG10|-----|9             |
;                          |          SEG11|-----|8             |
;                          |          SEG12|-----|7             | 
;                          |          SEG13|-----|6             |
;                          |          SEG14|-----|5 (bits C,E,H |
;                          |               |     |   of digit 7)|
;                          |               |      --------------
;                          |               | 
;                           ---------------  
;
;                   NOTE: Pin R03 on the MSP430 must be connected to GND
;
; B. Merritt
; Texas Instruments Inc.
; January 2002
;
;--------CPU register used------------------------------------------------------
;;;;;;;       R13, R14, R15                    ;used as temporary registers, can
                                               ;be reused 

;--------RAM words used for variables-------------------------------------------
CDTEMP       equ    0200h                      ;temporary storage in LCD routine

;-------------------------------------------------------------------------------
              ORG    0E000h                    ;Program reset
;-------------------------------------------------------------------------------
RESET         mov    #300h,SP                  ;itialize stackpointer          
              call   #Setup                    ;configure MSP430 for application

Mainloop      mov.b  R14,R13                   ;copy R14 to R13, so R14 saved
              call   #ToLCD                    ;call to display 1st digit
              mov.b  R14,R13                   ;recopy R14 to R13, so R14 saved
              rra.b  R13                       ;right shift R13 4 times to 
              rra.b  R13                       ;move 2nd nibble to lower 4 bits
              rra.b  R13                       ;
              rra.b  R13                       ;
              call   #ToLCD                    ;call to display 2nd digit
              swpb   R14                       ;swap bytes in R14    
              mov.b  R14,R13                   ;copy R14 to R13, so R14 saved
              call   #ToLCD                    ;call to display 3rd digit
              mov.b  R14,R13                   ;recopy R14 to R13
              rra.b  R13                       ;right shift R13 4 times to 
              rra.b  R13                       ;move 2nd nibble to lower 4 bits
              rra.b  R13                       ;
              rra.b  R13                       ;
              call   #ToLCD                    ;call to display 4th digit 
              bis    #LPM3,SR                  ;Set SR bits to wait in LPM3
              
;-------------------------------------------------------------------------------
;             Display 1 digit on 4 mux LCD. CPU Registers R13 & R15 used
;             temporarily
;-------------------------------------------------------------------------------
ToLCD         and    #000Fh,R13                ;blank upper 12 bits
              mov.b  LCD_Tab(R13),0(R15)       ;byte from table LCD memory
              inc    R15                       ;increment pointer by 1 to next
                                               ;LCD memory byte
EndLCD        ret                              ;return from call

;-------------------------------------------------------------------------------
Setup         ;Configure modules and control registers 
;-------------------------------------------------------------------------------
StopWDT       mov    #WDTPW+WDTHOLD,&WDTCTL    ;stop Watchdog Timer
SetupFLL2     bis.b  #XCAP18PF,&FLL_CTL0       ;set load capacitance for xtal
              mov    #10000,R15
FLL_Wait      dec    R15                       ;delay for FLL to lock
              jnz    FLL_Wait		 
SetupLCD      mov.b  #03Dh,&LCDCTL             ;4mux LCD, segs16-23 = outputs
              bis.b  #0FCh,&P5SEL              ;set Rxx and COM pins for LCD
SetupBT       mov.b  #00h+BTFRFQ1,&BTCTL       ;set LCD frame freq = ACLK / 128
SetupPorts    mov.b  #0FFh,&P1DIR              ;set port to outputs
SetupPx       mov.b  #0FFh,&P2DIR              ;set port to outputs
              mov.b  #0FFh,&P3DIR              ;set port to outputs
              mov.b  #0FFh,&P4DIR              ;set port to outputs
              mov.b  #0FFh,&P5DIR              ;set port to outputs              
              mov.b  #0FFh,&P6DIR              ;set port to outputs

ClearLCD      mov    #15,R15                   ;15 LCD memory bytes to clear
Clear1        mov.b  #0,LCDM1(R15)             ;write zeros in LCD RAM locations
                                               ;so clear display
              dec    R15                       ;all LCD mem clear?
              jc     Clear1                    ;more LCD mem to clear go, use JC
                                               ;to get memory location 0
              mov.b  #LCDM1,R15;               ;R15 points to first LCD location
              ret

;----------------------------------------------------------------------------- 
;             Define characters for T218010 = 6.5 digit 4 mux LCD
;----------------------------------------------------------------------------- 
a             equ     01h	 
b             equ     02h
c             equ     10h
d             equ     04h
e             equ     80h
f             equ     20h
g             equ     08h
h             equ     40h

LCD_Tab       DB      a+b+c+d+e+f             ;displays "0"
              DB      b+c                     ;displays "1"
              DB      a+b+d+e+g               ;displays "2"
              DB      a+b+c+d+g               ;displays "3"
              DB      b+c+f+g                 ;displays "4"
              DB      a+c+d+f+g               ;displays "5"
              DB      a+c+d+e+f+g             ;displays "6"
              DB      a+b+c                   ;displays "7"
              DB      a+b+c+d+e+f+g           ;displays "8"
              DB      a+b+c+d+f+g             ;displays "9"

;----------------------------------------------------------------------------- 
;             4xx Interrupt vectors
;----------------------------------------------------------------------------- 
              ORG     0FFFEh                  ;RESET Vector
              DW      RESET
              END



