#include <STC8H.H>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int

// LCD????
sbit LCD_E  = P3^2;
sbit LCD_DI = P3^3;
sbit LCD_CS1= P3^4;
sbit LCD_CS2= P3^5;
sbit LCD_RST= P3^6;
sbit LCD_RW = P3^7;

// ??????(???)
void Delay300ms() {
    u16 i, j;
    for(i=300; i>0; i--)
        for(j=4000; j>0; j--);
}

void LCD_WriteCmd(u8 cmd) {
    LCD_DI = 0; LCD_RW = 0;
    P2 = cmd; LCD_E = 1;
    _nop_(); _nop_(); _nop_();  // ????
    LCD_E = 0;
    Delay300ms();  // ????:?????
}

void LCD_WriteData(u8 dat) {
    LCD_DI = 1; LCD_RW = 0;
    P2 = dat; LCD_E = 1;
    _nop_(); _nop_(); _nop_();
    LCD_E = 0;
}

void LCD_Init() {
    LCD_RST = 0;
    Delay300ms();
    LCD_RST = 1;
    
    LCD_WriteCmd(0x3F);   // ???
    LCD_WriteCmd(0xC0);   // ?????
    LCD_WriteCmd(0xB8);   // ???
    LCD_WriteCmd(0x40);   // ???
}

void LCD_ShowTest() {
    // ?????
    LCD_CS1 = 0; LCD_CS2 = 1;
    LCD_WriteCmd(0xB8);  // ?0?
    LCD_WriteCmd(0x40);  // ?0?
    LCD_WriteData(0xFF); // ??8????
    LCD_WriteData(0x00); // ??
    LCD_WriteData(0xFF); 

    // ?????
    LCD_CS1 = 1; LCD_CS2 = 0;
    LCD_WriteCmd(0xB8);
    LCD_WriteCmd(0x40);
    LCD_WriteData(0xAA); // ?????
    LCD_WriteData(0x55);
    LCD_WriteData(0xAA);
}

void main() {
    // ???????
    P0 = 0x00;
    P4 = 0x00;
    
    // ??IO??
    P0M0 = 0x00;  // ?????
    P4M0 = 0x00;
    
    LCD_Init();
    
    while(1) {
        LCD_ShowTest();  // ????????
        Delay300ms();    // ??????
    }
}