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 | |
SEG12 | S12 |
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)
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
- 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
#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