Skip to content

Instantly share code, notes, and snippets.

@akira345
Created November 17, 2024 11:18
Show Gist options
  • Save akira345/570887301c0ee0a40347fc5600650453 to your computer and use it in GitHub Desktop.
Save akira345/570887301c0ee0a40347fc5600650453 to your computer and use it in GitHub Desktop.
PIC16F627+ST7735制御テストプログラム。ソフトウエアSPIなので遅い
#include <xc.h>
// 構成ビット設定
#pragma config FOSC = INTOSCIO // 内部クロック使用、RA6, RA7はI/Oとして使用可能
#pragma config WDTE = OFF // ウォッチドッグタイマー無効
#pragma config PWRTE = ON // パワーオンタイマー無効
#pragma config MCLRE = OFF // MCLRピン無効
#pragma config BOREN = OFF // 電源電圧低下検出無効
#pragma config LVP = OFF // 低電圧プログラミング無効
#pragma config CP = OFF // コード保護無効
#pragma config CPD = OFF // データEEPROMコード保護無効
#define _XTAL_FREQ (4000000) // 内部クロック4MHz
// ピン操作マクロ
#define SCL PORTAbits.RA0
#define SDA PORTAbits.RA1
#define CS PORTAbits.RA2
#define DC PORTAbits.RA3
#define RST PORTAbits.RA6
// ピン方向設定
#define SCL_DIR TRISAbits.TRISA0
#define SDA_DIR TRISAbits.TRISA1
#define CS_DIR TRISAbits.TRISA2
#define DC_DIR TRISAbits.TRISA3
#define RST_DIR TRISAbits.TRISA6
void SPI_Init(void);
void SPI_Write(unsigned char data);
void ST7735_Command(unsigned char cmd);
void ST7735_Data(unsigned char data);
void ST7735_Init(void);
void ST7735_SetRotation(uint8_t rotation);
void SPI_Init(void) {
CMCON = 0x07; // 比較器を無効化
SCL_DIR = 0; // 出力
SDA_DIR = 0; // 出力
CS_DIR = 0; // 出力
DC_DIR = 0; // 出力
RST_DIR = 0; // 出力
SCL = 0;
SDA = 0;
CS = 1;
DC = 0;
RST = 1;
}
void SPI_Write(unsigned char data) {
for (int i = 0; i < 8; i++) {
SCL = 0;
SDA = (data & 0x80) ? 1 : 0;
data <<= 1;
//__delay_us(1);
SCL = 1;
//__delay_us(1);
}
}
void ST7735_Command(unsigned char cmd) {
DC = 0;
CS = 0;
SPI_Write(cmd);
CS = 1;
}
void ST7735_Data(unsigned char data) {
DC = 1;
CS = 0;
SPI_Write(data);
CS = 1;
}
void ST7735_Init(void) {
// Reset sequence
RST = 0;
__delay_ms(100);
RST = 1;
__delay_ms(100);
// Software reset
ST7735_Command(0x01);
__delay_ms(150);
// Sleep out
ST7735_Command(0x11);
__delay_ms(500);
// Frame rate control
ST7735_Command(0xB1);
ST7735_Data(0x01);
ST7735_Data(0x2C);
ST7735_Data(0x2D);
// Frame rate control (idle mode)
ST7735_Command(0xB2);
ST7735_Data(0x01);
ST7735_Data(0x2C);
ST7735_Data(0x2D);
// Power control
ST7735_Command(0xC0);
ST7735_Data(0xA2);
ST7735_Data(0x02);
ST7735_Data(0x84);
// VCOM control
ST7735_Command(0xC5);
ST7735_Data(0x0A);
ST7735_Data(0x00);
// Memory data access control
ST7735_Command(0x36);
ST7735_Data(0xC8); // RGB color order, column address order
// Interface pixel format
ST7735_Command(0x3A);
ST7735_Data(0x05); // 16-bit per pixel
// Column address set (X range)
ST7735_Command(0x2A);
ST7735_Data(0x00);
ST7735_Data(0x00); // Start at 0
ST7735_Data(0x00);
ST7735_Data(0x82); // End at 130
// Row address set (Y range)
ST7735_Command(0x2B);
ST7735_Data(0x00);
ST7735_Data(0x00); // Start at 0
ST7735_Data(0x00);
ST7735_Data(0x84); // End at 130
// Display on
ST7735_Command(0x29);
__delay_ms(100);
}
void ST7735_SetRotation(uint8_t rotation) {
uint8_t madctl = 0;
switch (rotation) {
case 0:
madctl = 0x00; // 0度
break;
case 1:
madctl = 0x60; // 90度
break;
case 2:
madctl = 0xC0; // 180度
break;
case 3:
madctl = 0xA0; // 270度
break;
default:
madctl = 0x00; // デフォルトは0度
break;
}
ST7735_Command(0x36); // MADCTLコマンド
ST7735_Data(madctl); // 回転設定
}
void main(void) {
SPI_Init();
ST7735_Init();
// ST7735_SetRotation(0);
while (1) {
ST7735_Command(0x2C); //コマンドモード
for (int i = 0; i < 130 * 132; i++) {
// ST7735_Data(0xFF); // 白色ピクセルデータ
ST7735_Data(0xF8); // 赤色の上位8ビット
ST7735_Data(0x00); // 赤色の下位8ビット
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment