Newer
Older
avrtft / tft.c
/* 
 * File:   tft.c
 * Author: torsten.roemer@luniks.net
 *
 * Created on 6. November 2023, 18:45
 */

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <util/delay.h>
#include "tft.h"
#include "pins.h"
#include "usart.h"
#include "spi.h"

/**
 * Does a hardware reset.
 */
static void hwReset(void) {
    PORT_DISP &= ~(1 << PIN_RST);
    _delay_ms(10);
    PORT_DISP |= (1 << PIN_RST);
}

void displaySetCmd(void) {
    PORT_DSPI &= ~(1 << PIN_DC);
}

void displaySetData(void) {
    PORT_DSPI |= (1 << PIN_DC);
}

void displayCmd(uint8_t cmd) {
    displaySetCmd();
    transmit(cmd);
}

void displayData(uint8_t data) {
    displaySetData();
    transmit(data);
}

void initDisplay(void) {
    hwReset();
    
    _delay_ms(120);
    
    // SWRESET
    displaySel();
    displayCmd(0x01);
    displayDes();

    _delay_ms(120);

    // SLPOUT
    displaySel();
    displayCmd(0x11);
    displayDes();
    
    // NORON
    displaySel();
    displayCmd(0x13);
    displayDes();
    
    // COLMOD
    displaySel();
    displayCmd(0x3a);
    displayData(0b00111101);
    displayDes();
    
    // MADCTL
    displaySel();
    displayCmd(0x36);
    displayData(0b01110110);
    displayDes();
    
    // CASET
    uint16_t ys = 0;
    uint16_t ye = 79;
    displaySel();
    displayCmd(0x2a);
    displayData(ys >> 8);
    displayData(ys);
    displayData(ye >> 8);
    displayData(ye);
    displayDes();
    
    // RASET
    uint16_t xs = 0;
    uint16_t xe = 127;
    displaySel();
    displayCmd(0x2b);
    displayData(xs >> 8);
    displayData(xs);
    displayData(xe >> 8);
    displayData(xe);
    displayDes();
    
    // RAMWR
    displaySel();
    displayCmd(0x2c);
    displaySetData();
    for (uint16_t i = 0; i < 42 * 80; i++) {
        transmit(0b11111000);
        transmit(0b00000000);
    }
    for (uint16_t i = 0; i < 43 * 80; i++) {
        transmit(0b00000111);
        transmit(0b11100000);
    }
    for (uint16_t i = 0; i < 43 * 80; i++) {
        transmit(0b00000000);
        transmit(0b00011111);
    }
    displayDes();
    
    // CASET
    ys = 80;
    ye = 159;
    displaySel();
    displayCmd(0x2a);
    displayData(ys >> 8);
    displayData(ys);
    displayData(ye >> 8);
    displayData(ye);
    displayDes();
    
    // RASET
    xs = 0;
    xe = 127;
    displaySel();
    displayCmd(0x2b);
    displayData(xs >> 8);
    displayData(xs);
    displayData(xe >> 8);
    displayData(xe);
    displayDes();
    
    // RAMWR
    displaySel();
    displayCmd(0x2c);
    displaySetData();
    for (uint16_t i = 0; i < 42 * 80; i++) {
        transmit(~0b11111000);
        transmit(~0b00000000);
    }
    for (uint16_t i = 0; i < 43 * 80; i++) {
        transmit(~0b00000111);
        transmit(~0b11100000);
    }
    for (uint16_t i = 0; i < 43 * 80; i++) {
        transmit(~0b00000000);
        transmit(~0b00011111);
    }
    displayDes();
    
    // DISPON
    displaySel();
    displayCmd(0x29);
    displayDes();
    
    // SLPIN
    // displaySel();
    // displayCmd(0x10);
    // displayDes();
    
    printString("done initializing display\r\n");
}

void updateDisplay(void) {
    displaySel();
    
    displayDes();
    
    printString("done updating display\r\n");
}