volatile qualifier always a good idea when reading or writing hardware registers, because it ensures that each access you perform in your C code actually shows up in the generated code.
Usually prefer to write macros like this
#define READ_LCDCW1() ...
#define WRITE_LCDCW1(value) ...
LCDCW1 i Some registers require a multi-step process to read from the hardware.
the simplest definitions should be:
#define LCDCW1_ADDR 0xc000
#define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR)
#define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val))