//PA0 -PA7 - D0-D7 IN LCD - Output
//PB5 -RS - Output
//PB6 -RW - Output
//PB7 -EN - Output
#include <stdint.h>
//#include <stdio.h>
#include "STM32C031C6.h"
#define RS 0x20 //0010 0000 - PB5
#define RW 0x40 //0100 0000 - PB6
#define EN 0x80 //1000 0000 - PB7
unsigned char Message1[]=("HELLO WORLD...");
unsigned char Message2[]=("HAPPY CODING...");
void GPIO_Inits(void);
void LCD_Command(unsigned char command);
void LCD_Data(unsigned char data);
void LCD_Init(void);
void delayMs(int delay);
int main(void)
{
LCD_Init();
while(1)
{
unsigned char i=0,j=0;
LCD_Command(0x80); //First line Initialization (turn display)
delayMs(15);
while (Message1[i]!='\0')
{
LCD_Data(Message1[i]);
i++;
delayMs(200);
}
delayMs(1000);
LCD_Command(0xC0); //Second line Initialization (turn display)
delayMs(15);
while (Message2[j]!='\0')
{
LCD_Data(Message2[j]);
j++;
delayMs(200);
}
delayMs(1000);
LCD_Command(0x01); //clear screen move cursor home
delayMs(15);
}
return 0;
}
void GPIO_Inits(void)
{
RCC->IOPENR |= 0x03; //0011 - GPIOBEN(1) , GPIOAEN(0)
//PB5,PB6,PB7 - Output(01)
GPIOB->MODER &= 0x03FF; //0000 0011 1111 1111 - (7654 3210)
GPIOB->MODER |= 0x5400; //0101 0100 0000 0000 - (7654 3210)
//EN(PB7) and RW(PB6) Low ==> (pin 31-16)->RESET, (pin 15-0) -> SET
GPIOB->BSRR = 0x00C00000; // 1100 0000 0000 0000 0000 0000
//PA0 -PA7 - Output(01)
GPIOA->MODER &= 0xFFFF0000; //0000 0000 0000 0000
GPIOA->MODER |= 0x00005555; //0101 0101 0101 0101
}
void LCD_Command(unsigned char command)
{
//printf("command is A %u B - ",(unsigned char)command);
//printf("command is C %02X D\n",(unsigned int)command);
// RS=0 -> Command, RW=0 -> Write
GPIOB->BSRR=(RS|RW)<<16;
//PA0 -PA7 => Output
GPIOA->ODR=command;
GPIOB->BSRR=EN ; //ENABLE EN
delayMs(15);
GPIOB->BSRR=EN<<16 ; //clear EN
//delayMs(30);
}
void LCD_Data(unsigned char data)
{
//RS=1 -> Data
GPIOB->BSRR=RS;
//RW=0 -> Write
GPIOB->BSRR=RW<<16;
//PA0 -PA7 => Output
GPIOA->ODR=data;
GPIOB->BSRR=EN ; //ENABLE EN
delayMs(30);
GPIOB->BSRR=EN<<16 ; //clear EN
delayMs(30);
}
void LCD_Init(void)
{
GPIO_Inits();
//any one Command works well for wake up command - (0x33) or (0x32)
LCD_Command(0x33); //Wake up
delayMs(15);
LCD_Command(0x32); //Wake up
delayMs(15);
LCD_Command(0x38); //select one line
delayMs(15);
LCD_Command(0x0C); //Display ON, set b it data mode
delayMs(15);
LCD_Command(0x06); //move the cursor left to right
delayMs(15);
LCD_Command(0x01); //clear screen move cursor home
delayMs(15);
delayMs(5000);
}
void delayMs(int delay)
{
int i;
for (;delay>0;delay--)
{
for(i=0;i<3195;i++)
{
}
}
}