In this tutorial we'll see, how to interface 128*64 GLCD with PIC16F877A Starter board. We will using KS0108 controller based JHD12864E display. There are many displays out there based on KS0108 or compatible display controller. They all work the same way, but make sure to check the datasheet for the pin diagram before doing the connection.


Prerequisites

Please check this tutorial for detailed explanation on GLCD.


Hookup

Below table shows the GLCD pins connection.

RS RW EN CS1 CS2 D0 D1 D2 D3 D4 D5 D6 D7
PD_0 PD_1 PD_2 PD_3 PD_4 PB_0 PB_1 PB_2 PB_3 PB_4 PB_5 PB_6 PB_7



Code

#include "rtc.h"
#include "lcd.h"
int main()
{
rtc_t rtc;
/*Connect RS->PB0, RW->PB1, EN->PB2 and data bus to PORTB.4 to PORTB.7*/
LCD_SetUp(PB_0,PB_1,PB_2,P_NC,P_NC,P_NC,P_NC,PB_4,PB_5,PB_6,PB_7);
LCD_Init(2,16);
/*Connect SCL->PC3, SDA->PC4*/
RTC_Init();
rtc.hour = 0x10; // 10:40:20 am
rtc.min = 0x40;
rtc.sec = 0x00;
rtc.date = 0x01; //1st Jan 2016
rtc.month = 0x01;
rtc.year = 0x16;
rtc.weekDay = 5; // Friday: 5th day of week considering monday as first day.
/*##### Set the time and Date only once. Once the Time and Date is set, comment these lines
and reflash the code. Else the time will be set every time the controller is reset*/
RTC_SetDateTime(&rtc); // 10:40:20 am, 1st Jan 2016
/* Display the Time and Date continuously */
while(1)
{
RTC_GetDateTime(&rtc);
LCD_GoToLine(0);
LCD_Printf("time:%2x:%2x:%2x \nDate:%2x/%2x/%2x",(uint16_t)rtc.hour,(uint16_t)rtc.min,(uint16_t)rtc.sec,(uint16_t)rtc.date,(uint16_t)rtc.month,(uint16_t)rtc.year);
}
return (0);
}

Demo

00Interface RTC with Atmega128.gif

Downloads

Download the complete project folder from the below link:


Have a opinion, suggestion , question or feedback about the article let it out here!