Learning‎ > ‎MSP430: TI Chronos‎ > ‎

Peripherals

Introduction


Information for the different components on the watch are given in the following sections with examples.

I use information from the CC430 User's Guide and the default code running on the watch.

LCD with Backlight


LCD is driven directly by CC430.

Prerequisites

Connection between CC430F6137 and LCD



Summary

 LCD_BOTTOM CC430F6137
COM3
COM2
COM1
COM0
COM0
COM1
COM2
COM3
SEG23 - SEG13
S23 - S13
 LCD_TOP 
SEG12S12
SEG11 S9
SEG10 S11
SEG9 S10
SEG8 - SEG6
 S8 - S6
SEG5 S1
SEG4 - SEG1
 S5 - S2
SEG0
 S0
COM3
COM2
COM1
COM0
COM0
COM1
COM2
COM3

LCD Driver

CC430F6137 has a 96-segment LCD driver (1,2,3,4 mux)

Chronos has 4-mux LCD

LCD_B - LCD Driver

Generates the segment and common signals (AC) required to drive LCD
  • Has dedicated data memories to hold segment drive information
  • Has charge pump to provide LCD voltage (TODO - Not using it right now)
  • Software can control the contrast
    • by controlling the voltage level (TODO - Not using it right now)
  • Automatic blinking capability for individual segments
  • Recommended Operating Conditions & Electrical Characteristics [Datasheet - P63]

LCD_B Registers



Interrupt vector for LCD_B (TODO)
  • Interrupt flag - LCDBIV
  • maskable
  • Word address - 0FFDEh
  • Priority - 47
    • range: 63 (Highest) -> 45 (Lowest)
LCD Memory Map
To turn on an LCD segment, the corresponding memory bit must be set
  • Memory can also be accessed word-wise - LCDM1, LCDM3, ...

Memory Control Register


LCDBMEMCTL



    // Clear entire display memory
    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;


LCD Timing

f(lcd) = frequency of timing for common and segment lines
  • Details - TODO
  • FOr now, use the same frequency used in the sample code
    // LCD_FREQ = ACLK/16/8 = 256Hz
    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on
    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;

Clearing the LCD

LCDSON - set to 0 to turn off all the LCD segments

LCD Blinking

LCDBLKMODx - sets the blinking mode

LCDBMx registers - Memory to set the blinking for individual segment
  • same structure as the Memory map above
f(blink) - Blinking frequency
  • Details - TODO
    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz
    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;

Voltage and Bias settings

Options are available to select sources for voltage and bias generation - (TODO)

LCD Contrast control - TODO

LCD Output pins
No settings neccessary for dedicated LCD pins.

For the shared pins, need to set it to LCD rather than Digital I/O - TODO

    // I/O to COM outputs
    P5SEL |= (BIT5 | BIT6 | BIT7);
    P5DIR |= (BIT5 | BIT6 | BIT7);

Port Control Register

LCDBPCTLx

    // Activate LCD output
    LCDBPCTL0 = 0xFFFF;                         // Select LCD segments S0-S15
    LCDBPCTL1 = 0x00FF;                         // Select LCD segments S16-S22

Initialization

Code from Chronos watch used to initialize the LCD.

// *************************************************************************************************
// @fn          lcd_init
// @brief       Erase LCD memory. Init LCD peripheral.
// @param          none
// @return      none
// *************************************************************************************************
void lcd_init(void)
{
    // Clear entire display memory
    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;

    // LCD_FREQ = ACLK/16/8 = 256Hz
    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on
    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;

    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz
    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;

    // I/O to COM outputs
    P5SEL |= (BIT5 | BIT6 | BIT7);
    P5DIR |= (BIT5 | BIT6 | BIT7);
 
    // Activate LCD output
    LCDBPCTL0 = 0xFFFF;                         // Select LCD segments S0-S15
    LCDBPCTL1 = 0x00FF;                         // Select LCD segments S16-S22

#ifdef USE_LCD_CHARGE_PUMP
    // Charge pump voltage generated internally, internal bias (V2-V4) generation
    LCDBVCTL = LCDCPEN | VLCD_2_72;
#endif
}

Location of Registers

Control Register 0

LCDDIVx - LCD Frequency Divider
LCDPREx - LCD frequency pre-scaler
LCDSSEL - Clock source select for LCD and blinking frequency
LCDMXx - select the LCD mode.
LCDSON - LCD segments on.
LCDON - LCD on. This bit turns the LCD_B module on or off.


Control Register 1


LCDNOCAPIE
LCDBLKONIE
LCDBLKOFFIE
LCDFRMIE - Interrupt Enable bits
LCDNOCAPIFG
LCDBLKONIFG
LCDBLKOFFIFG
LCDFRMIFG - Interrupt flags

Blink Control Register

LCDBLKDIVx - Clock divider for blinking frequency
LCDBLKPREx - Clock pre-scaler for blinking frequency
LCDBLKMODx - Blinking mode


Memory Control Register

LCDCLRBM - Clear LCD blinking memory
LCDCLRM - Clear LCD memory. Clears all LCD memory registers LCDMx
LCDDISP - Select LCD memory registers for display


Voltage Control Register

VLCDx - Charge pump voltage select
VLCDEXT - VLCD source select
LCD2B - Bias select
LCDCPEN - Charge pump enable
etc.

Port Control Register 0 and 1

LCDSx - LCD segment line x enable. This bit affects only pins with multiplexed functions
LCDS27 to LCDS31 are reserved on devices supporting a maximum of 96 segments


Charge Pump Control Register

TODO

Interrupt Vector Register

LCDBIVx - LCD_B interrupt vector value


Writing to LCD

  • need the memory locations
  • then we need to know which bits to set for the displays we want
Memory map/locations

#define LCD_MEM_1                      ((u8*)0x0A20)
#define LCD_MEM_2                      ((u8*)0x0A21)
#define LCD_MEM_3                      ((u8*)0x0A22)
#define LCD_MEM_4                      ((u8*)0x0A23)
#define LCD_MEM_5                      ((u8*)0x0A24)
#define LCD_MEM_6                      ((u8*)0x0A25)
#define LCD_MEM_7                      ((u8*)0x0A26)
#define LCD_MEM_8                      ((u8*)0x0A27)
#define LCD_MEM_9                      ((u8*)0x0A28)
#define LCD_MEM_10                     ((u8*)0x0A29)
#define LCD_MEM_11                     ((u8*)0x0A2A)
#define LCD_MEM_12                     ((u8*)0x0A2B)

Aliases for all the different symbols
// Memory assignment
#define LCD_SEG_L1_0_MEM            (LCD_MEM_6)
#define LCD_SEG_L1_1_MEM            (LCD_MEM_4)
#define LCD_SEG_L1_2_MEM            (LCD_MEM_3)
#define LCD_SEG_L1_3_MEM            (LCD_MEM_2)
#define LCD_SEG_L1_COL_MEM            (LCD_MEM_1)
#define LCD_SEG_L1_DP1_MEM            (LCD_MEM_1)
#define LCD_SEG_L1_DP0_MEM            (LCD_MEM_5)
#define LCD_SEG_L2_0_MEM            (LCD_MEM_8)
#define LCD_SEG_L2_1_MEM            (LCD_MEM_9)
#define LCD_SEG_L2_2_MEM            (LCD_MEM_10)
#define LCD_SEG_L2_3_MEM            (LCD_MEM_11)
#define LCD_SEG_L2_4_MEM            (LCD_MEM_12)
#define LCD_SEG_L2_5_MEM            (LCD_MEM_12)
#define LCD_SEG_L2_COL1_MEM            (LCD_MEM_1)
#define LCD_SEG_L2_COL0_MEM            (LCD_MEM_5)
#define LCD_SEG_L2_DP_MEM            (LCD_MEM_9)
#define LCD_SYMB_AM_MEM                (LCD_MEM_1)
#define LCD_SYMB_PM_MEM                (LCD_MEM_1)
#define LCD_SYMB_ARROW_UP_MEM        (LCD_MEM_1)
#define LCD_SYMB_ARROW_DOWN_MEM        (LCD_MEM_1)
#define LCD_SYMB_PERCENT_MEM        (LCD_MEM_5)
#define LCD_SYMB_TOTAL_MEM            (LCD_MEM_11)
#define LCD_SYMB_AVERAGE_MEM        (LCD_MEM_10)
#define LCD_SYMB_MAX_MEM            (LCD_MEM_8)
#define LCD_SYMB_BATTERY_MEM        (LCD_MEM_7)
#define LCD_UNIT_L1_FT_MEM            (LCD_MEM_5)
#define LCD_UNIT_L1_K_MEM            (LCD_MEM_5)
#define LCD_UNIT_L1_M_MEM            (LCD_MEM_7)
#define LCD_UNIT_L1_I_MEM            (LCD_MEM_7)
#define LCD_UNIT_L1_PER_S_MEM        (LCD_MEM_5)
#define LCD_UNIT_L1_PER_H_MEM        (LCD_MEM_7)
#define LCD_UNIT_L1_DEGREE_MEM        (LCD_MEM_5)
#define LCD_UNIT_L2_KCAL_MEM        (LCD_MEM_7)
#define LCD_UNIT_L2_KM_MEM            (LCD_MEM_7)
#define LCD_UNIT_L2_MI_MEM            (LCD_MEM_7)
#define LCD_ICON_HEART_MEM            (LCD_MEM_2)
#define LCD_ICON_STOPWATCH_MEM        (LCD_MEM_3)
#define LCD_ICON_RECORD_MEM            (LCD_MEM_1)
#define LCD_ICON_ALARM_MEM            (LCD_MEM_4)
#define LCD_ICON_BEEPER1_MEM        (LCD_MEM_5)
#define LCD_ICON_BEEPER2_MEM        (LCD_MEM_6)
#define LCD_ICON_BEEPER3_MEM        (LCD_MEM_7)

Masks for the symbols we have
// Bit masks for write access
#define LCD_SEG_L1_0_MASK            (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_1_MASK            (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_2_MASK            (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_3_MASK            (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
#define LCD_SEG_L1_COL_MASK            (BIT5)
#define LCD_SEG_L1_DP1_MASK            (BIT6)
#define LCD_SEG_L1_DP0_MASK            (BIT2)
#define LCD_SEG_L2_0_MASK            (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_1_MASK            (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_2_MASK            (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_3_MASK            (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_4_MASK            (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
#define LCD_SEG_L2_5_MASK            (BIT7)
#define LCD_SEG_L2_COL1_MASK        (BIT4)
#define LCD_SEG_L2_COL0_MASK        (BIT0)
#define LCD_SEG_L2_DP_MASK            (BIT7)
#define LCD_SYMB_AM_MASK            (BIT1+BIT0)
#define LCD_SYMB_PM_MASK            (BIT0)
#define LCD_SYMB_ARROW_UP_MASK        (BIT2)
#define LCD_SYMB_ARROW_DOWN_MASK    (BIT3)
#define LCD_SYMB_PERCENT_MASK        (BIT4)
#define LCD_SYMB_TOTAL_MASK            (BIT7)
#define LCD_SYMB_AVERAGE_MASK        (BIT7)
#define LCD_SYMB_MAX_MASK            (BIT7)
#define LCD_SYMB_BATTERY_MASK        (BIT7)
#define LCD_UNIT_L1_FT_MASK            (BIT5)
#define LCD_UNIT_L1_K_MASK            (BIT6)
#define LCD_UNIT_L1_M_MASK            (BIT1)
#define LCD_UNIT_L1_I_MASK            (BIT0)
#define LCD_UNIT_L1_PER_S_MASK        (BIT3)
#define LCD_UNIT_L1_PER_H_MASK        (BIT2)
#define LCD_UNIT_L1_DEGREE_MASK        (BIT1)
#define LCD_UNIT_L2_KCAL_MASK        (BIT4)
#define LCD_UNIT_L2_KM_MASK            (BIT5)
#define LCD_UNIT_L2_MI_MASK            (BIT6)
#define LCD_ICON_HEART_MASK            (BIT3)
#define LCD_ICON_STOPWATCH_MASK        (BIT3)
#define LCD_ICON_RECORD_MASK        (BIT7)
#define LCD_ICON_ALARM_MASK            (BIT3)
#define LCD_ICON_BEEPER1_MASK        (BIT3)
#define LCD_ICON_BEEPER2_MASK        (BIT3)
#define LCD_ICON_BEEPER3_MASK        (BIT3)

Table for the location and mask of each symbol
// Table with memory address for each display element
const u8 * segments_lcdmem[] =
{
    LCD_SYMB_AM_MEM,
    LCD_SYMB_PM_MEM,
    LCD_SYMB_ARROW_UP_MEM,
    LCD_SYMB_ARROW_DOWN_MEM,
    LCD_SYMB_PERCENT_MEM,
    LCD_SYMB_TOTAL_MEM,
    LCD_SYMB_AVERAGE_MEM,
    LCD_SYMB_MAX_MEM,
    LCD_SYMB_BATTERY_MEM,
    LCD_UNIT_L1_FT_MEM,
    LCD_UNIT_L1_K_MEM,
    LCD_UNIT_L1_M_MEM,
    LCD_UNIT_L1_I_MEM,
    LCD_UNIT_L1_PER_S_MEM,
    LCD_UNIT_L1_PER_H_MEM,
    LCD_UNIT_L1_DEGREE_MEM,
    LCD_UNIT_L2_KCAL_MEM,
    LCD_UNIT_L2_KM_MEM,
    LCD_UNIT_L2_MI_MEM,
    LCD_ICON_HEART_MEM,
    LCD_ICON_STOPWATCH_MEM,
    LCD_ICON_RECORD_MEM,
    LCD_ICON_ALARM_MEM,
    LCD_ICON_BEEPER1_MEM,
    LCD_ICON_BEEPER2_MEM,
    LCD_ICON_BEEPER3_MEM,
    LCD_SEG_L1_3_MEM,
    LCD_SEG_L1_2_MEM,
    LCD_SEG_L1_1_MEM,
    LCD_SEG_L1_0_MEM,
    LCD_SEG_L1_COL_MEM,
    LCD_SEG_L1_DP1_MEM,
    LCD_SEG_L1_DP0_MEM,
    LCD_SEG_L2_5_MEM,
    LCD_SEG_L2_4_MEM,
    LCD_SEG_L2_3_MEM,
    LCD_SEG_L2_2_MEM,
    LCD_SEG_L2_1_MEM,
    LCD_SEG_L2_0_MEM,
    LCD_SEG_L2_COL1_MEM,
    LCD_SEG_L2_COL0_MEM,
    LCD_SEG_L2_DP_MEM,
};

// Table with bit mask for each display element

const u8 segments_bitmask[] =
{
    LCD_SYMB_AM_MASK,
    LCD_SYMB_PM_MASK,
    LCD_SYMB_ARROW_UP_MASK,
    LCD_SYMB_ARROW_DOWN_MASK,
    LCD_SYMB_PERCENT_MASK,
    LCD_SYMB_TOTAL_MASK,
    LCD_SYMB_AVERAGE_MASK,
    LCD_SYMB_MAX_MASK,
    LCD_SYMB_BATTERY_MASK,
    LCD_UNIT_L1_FT_MASK,
    LCD_UNIT_L1_K_MASK,
    LCD_UNIT_L1_M_MASK,
    LCD_UNIT_L1_I_MASK,
    LCD_UNIT_L1_PER_S_MASK,
    LCD_UNIT_L1_PER_H_MASK,
    LCD_UNIT_L1_DEGREE_MASK,
    LCD_UNIT_L2_KCAL_MASK,
    LCD_UNIT_L2_KM_MASK,
    LCD_UNIT_L2_MI_MASK,
    LCD_ICON_HEART_MASK,
    LCD_ICON_STOPWATCH_MASK,
    LCD_ICON_RECORD_MASK,
    LCD_ICON_ALARM_MASK,
    LCD_ICON_BEEPER1_MASK,
    LCD_ICON_BEEPER2_MASK,
    LCD_ICON_BEEPER3_MASK,
    LCD_SEG_L1_3_MASK,
    LCD_SEG_L1_2_MASK,
    LCD_SEG_L1_1_MASK,
    LCD_SEG_L1_0_MASK,
    LCD_SEG_L1_COL_MASK,
    LCD_SEG_L1_DP1_MASK,
    LCD_SEG_L1_DP0_MASK,
    LCD_SEG_L2_5_MASK,
    LCD_SEG_L2_4_MASK,
    LCD_SEG_L2_3_MASK,
    LCD_SEG_L2_2_MASK,
    LCD_SEG_L2_1_MASK,
    LCD_SEG_L2_0_MASK,
    LCD_SEG_L2_COL1_MASK,
    LCD_SEG_L2_COL0_MASK,
    LCD_SEG_L2_DP_MASK,
};

Index to refer to the above table
// ------------------------------------------
// LCD symbols for easier access
//
// xxx_SEG_xxx         = Seven-segment character (sequence 5-4-3-2-1-0)
// xxx_SYMB_xxx     = Display symbol, e.g. "AM" for ante meridiem
// xxx_UNIT_xxx     = Display unit, e.g. "km/h" for kilometers per hour
// xxx_ICON_xxx     = Display icon, e.g. heart to indicate reception of heart rate data
// xxx_L1_xxx         = Item is part of Line1 information
// xxx_L2_xxx         = Item is part of Line2 information

// Symbols for Line1
#define LCD_SYMB_AM                    0
#define LCD_SYMB_PM                    1
#define LCD_SYMB_ARROW_UP            2
#define LCD_SYMB_ARROW_DOWN            3
#define LCD_SYMB_PERCENT            4

// Symbols for Line2
#define LCD_SYMB_TOTAL                5
#define LCD_SYMB_AVERAGE            6
#define LCD_SYMB_MAX                7
#define LCD_SYMB_BATTERY            8

// Units for Line1
#define LCD_UNIT_L1_FT                9
#define LCD_UNIT_L1_K                10
#define LCD_UNIT_L1_M                11
#define LCD_UNIT_L1_I                12
#define LCD_UNIT_L1_PER_S            13
#define LCD_UNIT_L1_PER_H            14
#define LCD_UNIT_L1_DEGREE            15

// Units for Line2
#define LCD_UNIT_L2_KCAL            16
#define LCD_UNIT_L2_KM                17
#define LCD_UNIT_L2_MI                18

// Icons
#define LCD_ICON_HEART                19
#define LCD_ICON_STOPWATCH            20
#define LCD_ICON_RECORD                21
#define LCD_ICON_ALARM                22
#define LCD_ICON_BEEPER1            23
#define LCD_ICON_BEEPER2            24
#define LCD_ICON_BEEPER3            25

// Line1 7-segments
#define LCD_SEG_L1_3                26
#define LCD_SEG_L1_2                27
#define LCD_SEG_L1_1                28
#define LCD_SEG_L1_0                29
#define LCD_SEG_L1_COL                30
#define LCD_SEG_L1_DP1                31
#define LCD_SEG_L1_DP0                32

// Line2 7-segments
#define LCD_SEG_L2_5                33
#define LCD_SEG_L2_4                34
#define LCD_SEG_L2_3                35
#define LCD_SEG_L2_2                36
#define LCD_SEG_L2_1                37
#define LCD_SEG_L2_0                38
#define LCD_SEG_L2_COL1                39
#define LCD_SEG_L2_COL0                40
#define LCD_SEG_L2_DP                41


// Line1 7-segment arrays
#define LCD_SEG_L1_3_0                70
#define LCD_SEG_L1_2_0                71
#define LCD_SEG_L1_1_0                72
#define LCD_SEG_L1_3_1                73
#define LCD_SEG_L1_3_2                74

// Line2 7-segment arrays
#define LCD_SEG_L2_5_0                90
#define LCD_SEG_L2_4_0                91
#define LCD_SEG_L2_3_0                92
#define LCD_SEG_L2_2_0                93
#define LCD_SEG_L2_1_0                94
#define LCD_SEG_L2_5_2                95
#define LCD_SEG_L2_3_2                96
#define LCD_SEG_L2_5_4                97
#define LCD_SEG_L2_4_2                98

Display a symbol: Basic

//Clear segments related to symbol
LCDMx &= ~(LCD_******_MASK + LCD_******_MASK + ...);
//Write to the segments
LCDMx |= (LCD_******_MASK + LCD_******_MASK + ...);

Example: Display the heart symbol

source:
#include <cc430x613x.h>
#include "lcd-writing.h"

void main(void){

   init_variables();
   init_configure();
  
   //turn on heart symbol
   LCDM2 &= ~LCD_ICON_HEART_MASK;   //clear segments
   LCDM2 |= LCD_ICON_HEART_MASK;    //write to segment
  
   while(1);
}

void init_variables(void){
}

void init_configure(void){

    /* Initialize the stack pointer - done by cstartup.h */
    /* Configure the watchdog */
    WDTCTL = WDTPW | WDTHOLD;        //stop watchdog timer

    /* Configure all ports */

    /* Set up the clock - N/A */
    /* Configure other peripherals */
   
    //Configure LCD
    // Clear entire display memory
    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;

    // LCD_FREQ = ACLK/16/8 = 256Hz
    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on
    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;

    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz
    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;

    // I/O to COM outputs
    P5SEL |= (BIT5 | BIT6 | BIT7);
    P5DIR |= (BIT5 | BIT6 | BIT7);
 
    // Activate LCD output
    LCDBPCTL0 = 0xFFFF;                         // Select LCD segments S0-S15
    LCDBPCTL1 = 0x00FF;                         // Select LCD segments S16-S22
}

header:
#ifndef LCDWRITING_H_
#define LCDWRITING_H_

//Any debug flags

//Prototypes
void init_variables(void);
void init_configure(void);

//Memory map locations
#define LCD_MEM_1                      ((u8*)0x0A20)
#define LCD_MEM_2                      ((u8*)0x0A21)
#define LCD_MEM_3                      ((u8*)0x0A22)
#define LCD_MEM_4                      ((u8*)0x0A23)
#define LCD_MEM_5                      ((u8*)0x0A24)
#define LCD_MEM_6                      ((u8*)0x0A25)
#define LCD_MEM_7                      ((u8*)0x0A26)
#define LCD_MEM_8                      ((u8*)0x0A27)
#define LCD_MEM_9                      ((u8*)0x0A28)
#define LCD_MEM_10                     ((u8*)0x0A29)
#define LCD_MEM_11                     ((u8*)0x0A2A)
#define LCD_MEM_12                     ((u8*)0x0A2B)

//aliases
#define LCD_ICON_HEART_MEM            (LCD_MEM_2)

//masks
#define LCD_ICON_HEART_MASK            (BIT3)


#endif /*LCDWRITING_H_*/

Display a symbol: + pointers
//Pointer to the memory location
u8 * lcdmem = LCD_*****_MEM;
u8 mask = (LCD_******_MASK + LCD_******_MASK + ...);
//Clear segments
*lcdmem = (u8) (*lcdmem & ~mask); //i.e. *lcdmem &= ~mask
//Write segments
*lcdmem = (u8) (*lcdmem | mask);

Example updated

source:
#include <cc430x613x.h>
#include "lcd-writing.h"

u8* lcdmem;

void main(void){

   init_variables();
   init_configure();
  
   //turn on heart symbol
   lcdmem = LCD_ICON_HEART_MEM;
  
   *lcdmem &= ~LCD_ICON_HEART_MASK;   //clear segments
   *lcdmem |= LCD_ICON_HEART_MASK;    //write to segment
  
   while(1);
}

void init_variables(void){
    lcdmem = 0;
}

void init_configure(void){

    /* Initialize the stack pointer - done by cstartup.h */
    /* Configure the watchdog */
    WDTCTL = WDTPW | WDTHOLD;        //stop watchdog timer

    /* Configure all ports */

    /* Set up the clock - N/A */
    /* Configure other peripherals */
   
    //Configure LCD
    // Clear entire display memory
    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;

    // LCD_FREQ = ACLK/16/8 = 256Hz
    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on
    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;

    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz
    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;

    // I/O to COM outputs
    P5SEL |= (BIT5 | BIT6 | BIT7);
    P5DIR |= (BIT5 | BIT6 | BIT7);
 
    // Activate LCD output
    LCDBPCTL0 = 0xFFFF;                         // Select LCD segments S0-S15
    LCDBPCTL1 = 0x00FF;                         // Select LCD segments S16-S22
}

header:
#ifndef LCDWRITING_H_
#define LCDWRITING_H_

//typedefs
typedef unsigned char u8;
//Any debug flags

//Prototypes
void init_variables(void);
void init_configure(void);

//Memory map locations
#define LCD_MEM_1                      ((u8*)0x0A20)
#define LCD_MEM_2                      ((u8*)0x0A21)
#define LCD_MEM_3                      ((u8*)0x0A22)
#define LCD_MEM_4                      ((u8*)0x0A23)
#define LCD_MEM_5                      ((u8*)0x0A24)
#define LCD_MEM_6                      ((u8*)0x0A25)
#define LCD_MEM_7                      ((u8*)0x0A26)
#define LCD_MEM_8                      ((u8*)0x0A27)
#define LCD_MEM_9                      ((u8*)0x0A28)
#define LCD_MEM_10                     ((u8*)0x0A29)
#define LCD_MEM_11                     ((u8*)0x0A2A)
#define LCD_MEM_12                     ((u8*)0x0A2B)

//aliases
#define LCD_ICON_HEART_MEM            (LCD_MEM_2)

//masks
#define LCD_ICON_HEART_MASK            (BIT3)


#endif /*LCDWRITING_H_*/

Display a symbol: + table
(TODO) - already understand how things work




3-Axis Accelerometer

asdf

Pressure Sensor

asdf


Buzzer

asdf
Comments