lcd.h
#include <stdint.h>
#include <stdbool.h>
#include "globals.h"
//LCD stuff
void setData(uint16_t DH);
void Lcd_Write_Com( uint16_t DH);
void Lcd_Write_DATA(uint16_t DH);
void Lcd_Write_Com_Data( uint16_t com1, uint16_t dat1);
void Address_set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void Lcd_Init(void);
lcd.c
#include <avr/io.h>
#include "misc.h"
#include "config.h"
void setData(uint16_t DH){
PORTD = (DH>>8); //high byte
PORTF = (DH&0xFF);
}
void Lcd_Write_Com( uint16_t DH)
{
CLEAR_LCD_RS
CLEAR_LCD_CS
setData(DH);
CLEAR_LCD_WR
SET_LCD_WR
SET_LCD_CS
}
void Lcd_Write_DATA(uint16_t DH)
SET_LCD_RS
CLEAR_LCD_CS
setData(DH);
CLEAR_LCD_WR
SET_LCD_WR
SET_LCD_CS
}
void Lcd_Write_Com_Data( uint16_t com1, uint16_t dat1)
{
Lcd_Write_Com(com1);
Lcd_Write_DATA(dat1);
}
void Address_set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
Lcd_Write_Com_Data(0x0044,(x2<<8)+x1);
Lcd_Write_Com_Data(0x0045,y1);
Lcd_Write_Com_Data(0x0046,y2);
Lcd_Write_Com_Data(0x004e,x1);
Lcd_Write_Com_Data(0x004f,y1);
Lcd_Write_Com(0x0022);
}
void Lcd_Init(void)
{
SET_LCD_REST
delayms(5);
CLEAR_LCD_REST
delayms(10);
SET_LCD_REST
SET_LCD_CS
SET_LCD_RD
SET_LCD_WR
delayms(20);
#define RL 14
#define REV 13
#define CAD 12
#define BGR 11
#define SM 10
#define TB 9
Lcd_Write_Com_Data(0x0000,0x0001); delayms(1);
Lcd_Write_Com_Data(0x0003,0xA8AE); delayms(1);
Lcd_Write_Com_Data(0x000C,0x0000); delayms(1);
Lcd_Write_Com_Data(0x000D,0x080C); delayms(1);
Lcd_Write_Com_Data(0x000E,0x2B00); delayms(1);
Lcd_Write_Com_Data(0x001E,0x00B0); delayms(1);
Lcd_Write_Com_Data(0x0001,0x2BFF); delayms(1);
Lcd_Write_Com_Data(0x0002,0x0600); delayms(1);
Lcd_Write_Com_Data(0x0010,0x0000); delayms(1); //sleep mode
Lcd_Write_Com_Data(0x0011,0x6070); delayms(1);
Lcd_Write_Com_Data(0x0005,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0006,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0016,0xEF1C); delayms(1);
Lcd_Write_Com_Data(0x0017,0x0003); delayms(1);
Lcd_Write_Com_Data(0x0007,0x0233); delayms(1);
Lcd_Write_Com_Data(0x000B,0x0020); delayms(1);
Lcd_Write_Com_Data(0x000F,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0041,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0042,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0048,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0049,0x013F); delayms(1);
Lcd_Write_Com_Data(0x004A,0x0000); delayms(1);
Lcd_Write_Com_Data(0x004B,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0044,0xEF00); delayms(1);
Lcd_Write_Com_Data(0x0045,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0046,0x013F); delayms(1);
/* Lcd_Write_Com_Data(0x0030,0x0707); delayms(1);
Lcd_Write_Com_Data(0x0031,0x0204); delayms(1);
Lcd_Write_Com_Data(0x0032,0x0204); delayms(1);
Lcd_Write_Com_Data(0x0033,0x0502); delayms(1);
Lcd_Write_Com_Data(0x0034,0x0507); delayms(1);
Lcd_Write_Com_Data(0x0035,0x0204); delayms(1);
Lcd_Write_Com_Data(0x0036,0x0204); delayms(1);
Lcd_Write_Com_Data(0x0037,0x0502); delayms(1);
Lcd_Write_Com_Data(0x003A,0x0302); delayms(1);
Lcd_Write_Com_Data(0x003B,0x0302); delayms(1);*/
Lcd_Write_Com_Data(0x0023,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0024,0x0000); delayms(1);
Lcd_Write_Com_Data(0x0028,0x0006); delayms(1); //set to 6 before set R25h or R29h
Lcd_Write_Com_Data(0x0025,0xF000); delayms(1); //Frame frequency control (FRC)
Lcd_Write_Com_Data(0x004f,0);
Lcd_Write_Com_Data(0x004e,0);
Lcd_Write_Com(0x0022);
}
touch.h
#include "misc.h"
#define DELAY delayus(1); //delay between touch clk high/low
void get_tp(volatile short int *x,volatile short int *y);
void touch_init();
touch.c
#include "touch.h"
#include "config.h"
#include "misc.h"
void touch_init(void)
{
SET_D_CS
SET_D_CLK
SET_D_IN
}
void WriteCharTo7843(uint8_t num)
{
int8_t count;
CLEAR_D_CLK
for(count=7;count>=0;count--)
{
if((num& ((uint8_t)(1<<count)) ) == 0)
{
CLEAR_D_IN
}else{
SET_D_IN
}
CLEAR_D_CLK
DELAY
SET_D_CLK
DELAY
}
}
//**********************************************************
uint8_t ReadFromCharFrom7843(void)
{
int8_t count;
uint8_t Num=0;
for(count=7;count>=0;count--)
{
SET_D_CLK
DELAY //ϽµÑØÓÐЧ
CLEAR_D_CLK
DELAY
if(D_OUT) Num |= (uint16_t)(1<<count);
}
return(Num);
}
void get_tp(volatile short int *x,volatile short int *y)
{
//DELAY
//touch_init();
//while(D_BUSY != 0);
CLEAR_D_CS
CLEAR_D_CLK
//while(D_BUSY);
WriteCharTo7843(0x90 | (1<<3));
DELAY
SET_D_CLK
DELAY
CLEAR_D_CLK
DELAY
//while(D_BUSY);
*x = (uint16_t)ReadFromCharFrom7843();
//*x<<=4;
//*x|=((ReadFromCharFrom7843()&0xF0)>>4);
WriteCharTo7843(0xD0);
SET_D_CLK
DELAY
CLEAR_D_CLK
DELAY;
//while(D_BUSY);
*y = ReadFromCharFrom7843();
SET_D_CS
}
As you can see the code is still not perfect and debugging was going on. But it was working quite good.
Because the display controller was used as a SPI slave i did software SPI to talk to the touch IC. you should go for hardware SPI here.