As reference - this is initialisation code for the SLCD on the FRDM-KL46
#define CONFIGURE_SLCD() MCG_C1 &= ~(MCG_C1_IREFS); MCG_C1 |= (MCG_C1_IRCLKEN | MCG_C1_IREFSTEN); \
POWER_UP(5, SIM_SCGC5_SLCD); \
LCD_GCR = (LCD_GCR_RVEN | (0x08000000 & LCD_GCR_RVTRIM_MASK) | LCD_GCR_CPSEL | LCD_GCR_LADJ_MASK | LCD_GCR_VSUPPLY | LCD_GCR_SOURCE | LCD_GCR_LCLK_1 | LCD_GCR_DUTY_4BP); \
LCD_AR = (LCD_AR_BRATE_MASK & 3); \
LCD_BPENL = (SLCD_PIN_19 | SLCD_PIN_18); \
LCD_BPENH = (SLCD_PIN_H_52 | SLCD_PIN_H_40); \
LCD_PENL = ((SLCD_PIN_17 | SLCD_PIN_11 | SLCD_PIN_10 | SLCD_PIN_8 | SLCD_PIN_7) | (SLCD_PIN_19 | SLCD_PIN_18)); \
LCD_PENH = ((SLCD_PIN_H_53 | SLCD_PIN_H_38 | SLCD_PIN_H_37) | (SLCD_PIN_H_52 | SLCD_PIN_H_40)); \
fnClearSLCD(); \
WRITE_SLCD(43TO40, 0x00000001); \
WRITE_SLCD(55TO52, 0x00000002); \
WRITE_SLCD(19TO16, 0x04080000); \
LCD_GCR = (LCD_GCR_LCDEN | LCD_GCR_RVEN | (0x08000000 & LCD_GCR_RVTRIM_MASK) | LCD_GCR_CPSEL | LCD_GCR_LADJ_MASK | LCD_GCR_VSUPPLY | LCD_GCR_SOURCE | LCD_GCR_LCLK_1 | LCD_GCR_DUTY_4BP)
extern void fnClearSLCD(void)
{
unsigned long *ptrSegments = LCD_WF3TO0_ADDR;
int i = 0;
while (i++ < SEGMENT_REGISTER_COUNT) {
*ptrSegments++ = 0;
}
}
And the following is a clock display updated every second by a 1s interrupt (eg. from RTC)
static void _rtc_second_interrupt(void)
{
RTC_SETUP rtc_setup;
rtc_setup.command = RTC_GET_TIME;
fnConfigureRTC(&rtc_setup);
if (IS_POWERED_UP(5, SIM_SCGC5_SLCD)) {
fnTimeDisplay(rtc_setup.ucHours, rtc_setup.ucMinutes, rtc_setup.ucSeconds);
}
}
with the complete SLCD code below to allow digits to be simply displayed.
#define SEVEN_SEGMENT_0_TOP 0x00000800
#define SEVEN_SEGMENT_0_MID 0x00000400
#define SEVEN_SEGMENT_0_BOT 0x00000100
#define SEVEN_SEGMENT_0_T_L 0x00000800
#define SEVEN_SEGMENT_0_B_L 0x00000200
#define SEVEN_SEGMENT_0_T_R 0x00000400
#define SEVEN_SEGMENT_0_B_R 0x00000200
#define SEVEN_SEGMENT_0_17 (SEVEN_SEGMENT_0_TOP | SEVEN_SEGMENT_0_T_R | SEVEN_SEGMENT_0_B_R)
#define SEVEN_SEGMENT_0_37 (SEVEN_SEGMENT_0_MID | SEVEN_SEGMENT_0_BOT | SEVEN_SEGMENT_0_T_L | SEVEN_SEGMENT_0_B_L)
#define SEVEN_SEGMENT_0_0 (SEVEN_SEGMENT_0_17 | SEVEN_SEGMENT_0_37)
#define SEVEN_SEGMENT_0_1 (SEVEN_SEGMENT_0_T_R | SEVEN_SEGMENT_0_B_R)
#define SEVEN_SEGMENT_0_2 ((SEVEN_SEGMENT_0_TOP | SEVEN_SEGMENT_0_T_R | SEVEN_SEGMENT_0_MID | SEVEN_SEGMENT_0_B_L | SEVEN_SEGMENT_0_BOT) & SEVEN_SEGMENT_0_17)
#define SEVEN_SEGMENT_1_TOP 0x00000008
#define SEVEN_SEGMENT_1_MID 0x04000000
#define SEVEN_SEGMENT_1_BOT 0x01000000
#define SEVEN_SEGMENT_1_T_L 0x08000000
#define SEVEN_SEGMENT_1_B_L 0x02000000
#define SEVEN_SEGMENT_1_T_R 0x00000004
#define SEVEN_SEGMENT_1_B_R 0x00000002
#define SEVEN_SEGMENT_1__7 (SEVEN_SEGMENT_1_MID | SEVEN_SEGMENT_1_BOT | SEVEN_SEGMENT_1_T_L | SEVEN_SEGMENT_1_B_L)
#define SEVEN_SEGMENT_1__8 (SEVEN_SEGMENT_1_TOP | SEVEN_SEGMENT_1_T_R | SEVEN_SEGMENT_1_B_R)
#define SEVEN_SEGMENT_1 (SEVEN_SEGMENT_1__7 | SEVEN_SEGMENT_1__8)
#define SEVEN_SEGMENT_1_0 (SEVEN_SEGMENT_1 & ~(SEVEN_SEGMENT_1_MID))
#define SEVEN_SEGMENT_1_1 (SEVEN_SEGMENT_1_T_R | SEVEN_SEGMENT_1_B_R)
#define SEVEN_SEGMENT_1_2 (SEVEN_SEGMENT_1 & ~(SEVEN_SEGMENT_1_T_L | SEVEN_SEGMENT_1_B_R))
#define SEVEN_SEGMENT_1_3 (SEVEN_SEGMENT_1 & ~(SEVEN_SEGMENT_1_T_L | SEVEN_SEGMENT_1_B_L))
#define SEVEN_SEGMENT_1_4 (SEVEN_SEGMENT_1 & ~(SEVEN_SEGMENT_1_TOP | SEVEN_SEGMENT_1_B_L | SEVEN_SEGMENT_1_BOT))
#define SEVEN_SEGMENT_1_5 (SEVEN_SEGMENT_1 & ~(SEVEN_SEGMENT_1_B_L | SEVEN_SEGMENT_1_T_R))
#define SEVEN_SEGMENT_1_6 (SEVEN_SEGMENT_1 & ~(SEVEN_SEGMENT_1_T_R))
#define SEVEN_SEGMENT_1_7 (SEVEN_SEGMENT_1_T_R | SEVEN_SEGMENT_1_B_R | SEVEN_SEGMENT_1_TOP)
#define SEVEN_SEGMENT_1_8 SEVEN_SEGMENT_1
#define SEVEN_SEGMENT_1_9 (SEVEN_SEGMENT_1 & ~(SEVEN_SEGMENT_1_B_L))
#define SEVEN_SEGMENT_2_TOP 0x00080000
#define SEVEN_SEGMENT_2_MID 0x00000400
#define SEVEN_SEGMENT_2_BOT 0x00000100
#define SEVEN_SEGMENT_2_T_L 0x00000800
#define SEVEN_SEGMENT_2_B_L 0x00000200
#define SEVEN_SEGMENT_2_T_R 0x00040000
#define SEVEN_SEGMENT_2_B_R 0x00020000
#define SEVEN_SEGMENT_2_38 (SEVEN_SEGMENT_2_TOP | SEVEN_SEGMENT_2_T_R | SEVEN_SEGMENT_2_B_R)
#define SEVEN_SEGMENT_2_53 (SEVEN_SEGMENT_2_MID | SEVEN_SEGMENT_2_BOT | SEVEN_SEGMENT_2_T_L | SEVEN_SEGMENT_2_B_L)
#define SEVEN_SEGMENT_2 (SEVEN_SEGMENT_2_38 | SEVEN_SEGMENT_2_53)
#define SEVEN_SEGMENT_2_0 (SEVEN_SEGMENT_2 & ~(SEVEN_SEGMENT_2_MID))
#define SEVEN_SEGMENT_2_1 (SEVEN_SEGMENT_2_T_R | SEVEN_SEGMENT_2_B_R)
#define SEVEN_SEGMENT_2_2 (SEVEN_SEGMENT_2 & ~(SEVEN_SEGMENT_2_T_L | SEVEN_SEGMENT_2_B_R))
#define SEVEN_SEGMENT_2_3 (SEVEN_SEGMENT_2 & ~(SEVEN_SEGMENT_2_T_L | SEVEN_SEGMENT_2_B_L))
#define SEVEN_SEGMENT_2_4 (SEVEN_SEGMENT_2 & ~(SEVEN_SEGMENT_2_TOP | SEVEN_SEGMENT_2_B_L | SEVEN_SEGMENT_2_BOT))
#define SEVEN_SEGMENT_2_5 (SEVEN_SEGMENT_2 & ~(SEVEN_SEGMENT_2_B_L | SEVEN_SEGMENT_2_T_R))
#define SEVEN_SEGMENT_2_6 (SEVEN_SEGMENT_2 & ~(SEVEN_SEGMENT_2_T_R))
#define SEVEN_SEGMENT_2_7 (SEVEN_SEGMENT_2_T_R | SEVEN_SEGMENT_2_B_R | SEVEN_SEGMENT_2_TOP)
#define SEVEN_SEGMENT_2_8 (SEVEN_SEGMENT_2)
#define SEVEN_SEGMENT_2_9 (SEVEN_SEGMENT_2 & ~(SEVEN_SEGMENT_2_B_L))
#define SEVEN_SEGMENT_3_TOP 0x08000000
#define SEVEN_SEGMENT_3_MID 0x00040000
#define SEVEN_SEGMENT_3_BOT 0x00010000
#define SEVEN_SEGMENT_3_T_L 0x00080000
#define SEVEN_SEGMENT_3_B_L 0x00020000
#define SEVEN_SEGMENT_3_T_R 0x04000000
#define SEVEN_SEGMENT_3_B_R 0x02000000
#define SEGMENT_COLON 0x01
#define SEVEN_SEGMENT_3 (SEVEN_SEGMENT_3_TOP | SEVEN_SEGMENT_3_MID | SEVEN_SEGMENT_3_BOT | SEVEN_SEGMENT_3_T_L | SEVEN_SEGMENT_3_B_L | SEVEN_SEGMENT_3_T_R | SEVEN_SEGMENT_3_B_R)
#define SEVEN_SEGMENT_3_0 (SEVEN_SEGMENT_3 & ~(SEVEN_SEGMENT_3_MID))
#define SEVEN_SEGMENT_3_1 (SEVEN_SEGMENT_3_T_R | SEVEN_SEGMENT_3_B_R)
#define SEVEN_SEGMENT_3_2 (SEVEN_SEGMENT_3 & ~(SEVEN_SEGMENT_3_T_L | SEVEN_SEGMENT_3_B_R))
#define SEVEN_SEGMENT_3_3 (SEVEN_SEGMENT_3 & ~(SEVEN_SEGMENT_3_T_L | SEVEN_SEGMENT_3_B_L))
#define SEVEN_SEGMENT_3_4 (SEVEN_SEGMENT_3 & ~(SEVEN_SEGMENT_3_TOP | SEVEN_SEGMENT_3_B_L | SEVEN_SEGMENT_3_BOT))
#define SEVEN_SEGMENT_3_5 (SEVEN_SEGMENT_3 & ~(SEVEN_SEGMENT_3_B_L | SEVEN_SEGMENT_3_T_R))
#define SEVEN_SEGMENT_3_6 (SEVEN_SEGMENT_3 & ~(SEVEN_SEGMENT_3_T_R))
#define SEVEN_SEGMENT_3_7 (SEVEN_SEGMENT_3_T_R | SEVEN_SEGMENT_3_B_R | SEVEN_SEGMENT_3_TOP)
#define SEVEN_SEGMENT_3_8 SEVEN_SEGMENT_3
#define SEVEN_SEGMENT_3_9 (SEVEN_SEGMENT_3 & ~(SEVEN_SEGMENT_3_B_L))
static const unsigned long ulSegment1[] = {
SEVEN_SEGMENT_1_0,
SEVEN_SEGMENT_1_1,
SEVEN_SEGMENT_1_2,
SEVEN_SEGMENT_1_3,
SEVEN_SEGMENT_1_4,
SEVEN_SEGMENT_1_5,
SEVEN_SEGMENT_1_6,
SEVEN_SEGMENT_1_7,
SEVEN_SEGMENT_1_8,
SEVEN_SEGMENT_1_9,
};
static const unsigned long ulSegment2[] = {
SEVEN_SEGMENT_2_0,
SEVEN_SEGMENT_2_1,
SEVEN_SEGMENT_2_2,
SEVEN_SEGMENT_2_3,
SEVEN_SEGMENT_2_4,
SEVEN_SEGMENT_2_5,
};
static const unsigned long ulSegment3[] = {
(SEVEN_SEGMENT_3_0 >> 0),
(SEVEN_SEGMENT_3_1 >> 0),
(SEVEN_SEGMENT_3_2 >> 0),
(SEVEN_SEGMENT_3_3 >> 0),
(SEVEN_SEGMENT_3_4 >> 0),
(SEVEN_SEGMENT_3_5 >> 0),
(SEVEN_SEGMENT_3_6 >> 0),
(SEVEN_SEGMENT_3_7 >> 0),
(SEVEN_SEGMENT_3_8 >> 0),
(SEVEN_SEGMENT_3_9 >> 0),
};
static void fnTimeDisplay(unsigned char ucHours, unsigned char ucMinutes, unsigned char ucSeconds)
{
unsigned long ulRegister;
ulRegister = LCD_WF19TO16;
ulRegister &= ~(SEVEN_SEGMENT_0_17);
switch (ucHours/10) {
case 1:
ulRegister |= (SEVEN_SEGMENT_0_B_R | SEVEN_SEGMENT_0_T_R);
break;
case 2:
ulRegister |= (SEVEN_SEGMENT_0_TOP | SEVEN_SEGMENT_0_T_R);
break;
}
WRITE_SLCD(19TO16, ulRegister);
ulRegister = LCD_WF39TO36;
ulRegister &= ~(SEVEN_SEGMENT_0_37);
switch (ucHours/10) {
case 2:
ulRegister |= (SEVEN_SEGMENT_0_MID | SEVEN_SEGMENT_0_B_L | SEVEN_SEGMENT_0_BOT);
break;
}
WRITE_SLCD(39TO36, ulRegister);
ucHours -= ((ucHours/10) * 10);
ulRegister = LCD_WF7TO4;
ulRegister &= ~(SEVEN_SEGMENT_1__7);
ulRegister |= (ulSegment1[ucHours] & SEVEN_SEGMENT_1__7);
WRITE_SLCD(7TO4, ulRegister);
ulRegister = LCD_WF11TO8;
ulRegister &= ~(SEVEN_SEGMENT_1__8);
ulRegister |= (ulSegment1[ucHours] & SEVEN_SEGMENT_1__8);
WRITE_SLCD(11TO8, ulRegister);
ulRegister = LCD_WF39TO36;
ulRegister &= ~(SEVEN_SEGMENT_2_38);
ulRegister |= (ulSegment2[ucMinutes/10] & SEVEN_SEGMENT_2_38);
WRITE_SLCD(39TO36, ulRegister);
ulRegister = LCD_WF55TO52;
ulRegister &= ~(SEVEN_SEGMENT_2_53);
ulRegister |= (ulSegment2[ucMinutes/10] & SEVEN_SEGMENT_2_53);
WRITE_SLCD(55TO52, ulRegister);
ulRegister = LCD_WF11TO8;
ulRegister &= ~(SEVEN_SEGMENT_3);
ucMinutes -= ((ucMinutes/10) * 10);
ulRegister |= ulSegment3[ucMinutes];
WRITE_SLCD(11TO8, ulRegister);
TOGGLE_SLCD(11, SEGMENT_COLON);
}
And finally, what it looks like when run in the uTasker simulator:

Regards
Mark