📄 sed1356_16bit.h
字号:
// SED1356_REG_CRT_DISP_MODE
#define SED1356_CRT_DISP_BLANK BIT7 // 1 = Blank CRT Display
#define SED1356_CRT_DISP_16BPP 0x05 // Bit Per Pixel Selection
#define SED1356_CRT_DISP_15BPP 0x04
#define SED1356_CRT_DISP_8BPP 0x03
#define SED1356_CRT_DISP_4BPP 0x02
#define SED1356_CRT_DISP_BPP_MASK 0x07
// SED1356_DISP_MODE
#define SED1356_DISP_SWIV_NORM (0x00 << 6) // Used with SED1356_LCD_DISP_MODE Bit 4
#define SED1356_DISP_SWIV_90 (0x01 << 6)
#define SED1356_DISP_SWIV_180 (0x00 << 6)
#define SED1356_DISP_SWIV_270 (0x01 << 6)
#define SED1356_DISP_MODE_OFF 0x00 // All Displays Off
#define SED1356_DISP_MODE_LCD 0x01 // LCD Only
#define SED1356_DISP_MODE_CRT 0x02 // CRT Only
#define SED1356_DISP_MODE_LCD_CRT 0x03 // Simultaneous LCD and CRT
#define SED1356_DISP_MODE_TV 0x04 // TV Only, Flicker Filter Off
#define SED1356_DISP_MODE_TV_LCD 0x05 // Simultaneous LCD and TV, Flicker Filter Off
#define SED1356_DISP_MODE_TV_FLICK 0x06 // TV Only, Flicker Filter On
#define SED1356_DISP_MODE_TV_LCD_FLICK 0x07 // Simultaneous LCD and TV, Flicker Filter On
// SED1356_REG_PWR_CFG and SED1356_REG_PWR_STAT
#define SED1356_PWR_PCLK BIT1 // SED1356_REG_PWR_STAT only
#define SED1356_PWR_MCLK BIT0
// SED1356_REG_VER_NONDISP
#define SED1356_VER_NONDISP BIT7 // vertical retrace status 1 = in retrace
// Display size defines
#define PIXELS_PER_ROW 640
#define PIXELS_PER_COL 480
#define BYTES_PER_PIXEL 2
#define COLS_PER_SCREEN 80
#define ROWS_PER_SCREEN 30
// 16-bit pixels are RGB 565 - LSB of RED and BLUE are tied low at the
// LCD Interface, while the LSB of GREEN is loaded as 0
#define RED_SUBPIXEL(n) ((n & 0x1f) << 11)
#define GREEN_SUBPIXEL(n) ((n & 0x1f) << 5)
#define BLUE_SUBPIXEL(n) ((n & 0x1f) << 0)
// define a simple VGA style 16-color pallette
#if 0
#define LU_BLACK (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
#define LU_BLUE (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x0f))
#define LU_GREEN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x00))
#define LU_CYAN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x0f))
#define LU_RED (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
#define LU_VIOLET (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x0f))
#define LU_YELLOW (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x00))
#define LU_GREY (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x0f))
#define LU_WHITE (RED_SUBPIXEL(0x17) | GREEN_SUBPIXEL(0x17) | BLUE_SUBPIXEL(0x17))
#define LU_BRT_BLUE (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x1f))
#define LU_BRT_GREEN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x00))
#define LU_BRT_CYAN (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x1f))
#define LU_BRT_RED (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
#define LU_BRT_VIOLET (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x1f))
#define LU_BRT_YELLOW (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x00))
#define LU_BRT_WHITE (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x1f))
// RED, GREEN, BLUE // Entry
{ 0x00, 0x00, 0x00, }, // LU_BLACK
{ 0x00, 0x00, 0xA0, }, // LU_BLUE
{ 0x00, 0xA0, 0x00, }, // LU_GREEN
{ 0x00, 0xA0, 0xA0, }, // LU_CYAN
{ 0xA0, 0x00, 0x00, }, // LU_RED
{ 0xA0, 0x00, 0xA0, }, // LU_VIOLET
{ 0xA0, 0xA0, 0x00, }, // LU_YELLOW
{ 0xA0, 0xA0, 0xA0, }, // LU_WHITE
{ 0x50, 0x50, 0x50, }, // LU_GREY
{ 0x50, 0x50, 0xF0, }, // LU_BRT_BLUE
{ 0x50, 0xF0, 0x50, }, // LU_BRT_GREEN
{ 0x50, 0xF0, 0xF0, }, // LU_BRT_CYAN
{ 0xF0, 0x50, 0x50, }, // LU_BRT_RED
{ 0xF0, 0x50, 0xF0, }, // LU_BRT_VIOLET
{ 0xF0, 0xF0, 0x50, }, // LU_BRT_YELLOW
{ 0xF0, 0xF0, 0xF0, }, // LU_BRT_WHITE
#endif
#define BLUE (0x14 << 0)
#define GREEN (0x14 << 6)
#define RED (0x14 << 11)
#define HALF_BLUE (0x0a << 0)
#define HALF_GREEN (0x0a << 6)
#define HALF_RED (0x0a << 11)
#define BRT_BLUE (0x1e << 0)
#define BRT_GREEN (0x1e << 6)
#define BRT_RED (0x1e << 11)
#define LU_BLACK 0
#define LU_BLUE (BLUE)
#define LU_GREEN (GREEN)
#define LU_CYAN (GREEN | BLUE)
#define LU_RED (RED)
#define LU_VIOLET (RED | BLUE)
#define LU_YELLOW (RED | GREEN)
#define LU_WHITE (RED | GREEN | BLUE)
#define LU_GREY (HALF_RED | HALF_GREEN | HALF_BLUE)
#define LU_BRT_BLUE (HALF_RED | HALF_GREEN | BRT_BLUE)
#define LU_BRT_GREEN (HALF_RED | BRT_GREEN | HALF_BLUE)
#define LU_BRT_CYAN (HALF_RED | BRT_GREEN | BRT_BLUE)
#define LU_BRT_RED (BRT_RED | HALF_GREEN | HALF_BLUE)
#define LU_BRT_VIOLET (BRT_RED | HALF_GREEN | BRT_BLUE)
#define LU_BRT_YELLOW (BRT_RED | BRT_GREEN | HALF_BLUE)
#define LU_BRT_WHITE (BRT_RED | BRT_GREEN | BRT_BLUE)
static const ushort vga_lookup[] = {
LU_BLACK, // 0
LU_BLUE, // 1
LU_GREEN, // 2
LU_CYAN, // 3
LU_RED, // 4
LU_VIOLET, // 5
LU_YELLOW, // 6
LU_WHITE, // 7
LU_GREY, // 8
LU_BRT_BLUE, // 9
LU_BRT_GREEN, // 10
LU_BRT_CYAN, // 11
LU_BRT_RED, // 12
LU_BRT_VIOLET, // 13
LU_BRT_YELLOW, // 14
LU_BRT_WHITE // 15
};
// default foreground and background colors
#define SED_BG_DEF 1
#define SED_FG_DEF 14
// Vertical and Horizontal Pulse, Start and Non-Display values vary depending
// upon the mode. The following section gives some insight into how the
// values are arrived at.
// ms = milliseconds, us = microseconds, ns = nanoseconds
// Mhz = Megaherz, Khz = Kiloherz, Hz = Herz
//
// ***************************************************************************************************
// CRT Mode is 640x480 @ 72Hz VESA compatible timing. PCLK = 31.5Mhz (31.75ns)
// ***************************************************************************************************
//
// CRT MODE HORIZONTAL TIMING PARAMETERS
//
// |<-------Tha------->|
// |___________________| ______
// Display Enable _____________________| |____________________|
// | |
// Horizontal Pulse __ ________|___________________|________ __________
// |_________| | | |________|
// |<- Thp ->| | | |
// | |<-Thbp->| | |
// | |<-Thfp->|
// |<----------------------Tht-------------------->|
//
// Tha - Active Display Time = 640 pixels
// Thp - Horizontal Pulse = 1.27us/31.75ns = 40 pixels
// Thbp - Horizontal Front Porch = 1.016us/31.75ns = 32 pixels
// Thfp - Horizontal Back Porch = 3.8us/31.75ns = 120 pixels
// Tht - Total Horizontal Time = 832 pixels x 32.75ns/pixel = 26.416us or 38.785Khz
//
// Correlation between horizontal timing parameters and SED registers
#define SED_HOR_PULSE_WIDTH_CRT 0x07 // Horizontal Pulse Width Register = (Thp/8) - 1
#define SED_HOR_PULSE_START_CRT 0x02 // Horizontal Pulse Start Position Register = ((Thfp + 2)/8) - 1
#define SED_HOR_NONDISP_CRT 0x17 // Horizontal Non-Display Period Register = ((Thp + Thfp + Thbp)/8) - 1
//
// CRT MODE VERTICAL TIMING PARAMTERS
//
// |<-------Tva------->|
// |___________________| ______
// Display Enable _____________________| |_____________________|
// | |
// Vertical Pulse __ ________|___________________|________ __________
// |_________| | | |________|
// |<- Tvp ->| | | |
// | |<-Tvbp->| | |
// | |<-Tvfp->|
// |<----------------------Tvt-------------------->|
//
// Tva - Active Display Time = 480 lines
// Tvp - Vertical Pulse = 3 lines
// Tvfp - Vertical Front Porch = 9 lines
// Tvbp - Vertical Back Porch = 28 lines
// Tvt - Total Horizontal Time = 520 lines x 26.416us/line = 13.73632ms or 72.8Hz
//
// Correlation between vertical timing parameters and SED registers
#define SED_VER_PULSE_WIDTH_CRT 0x02 // VRTC/FPFRAME Pulse Width Register = Tvp - 1
#define SED_VER_PULSE_START_CRT 0x08 // VRTC/FPFRAME Start Position Register = Tvfp - 1
#define SED_VER_NONDISP_CRT 0x27 // Vertical Non-Display Period Register = (Tvp + Tvfp + Tvbp) - 1
//
// ***************************************************************************************************
// DUAL LCD Mode is 640x480 @ 60Hz VGA compatible timing. PCLK = 25.175Mhz (39.722ns)
// ***************************************************************************************************
//
// LCD MODE HORIZONTAL TIMING PARAMTERS
//
// |<-------Tha------->|
// |___________________| ______
// Display Enable _____________________| |____________________|
// | |
// Horizontal Pulse __ ________|___________________|________ __________
// |_________| | | |________|
// |<- Thp ->| | | |
// | |<-Thbp->| | |
// | |<-Thfp->|
// |<----------------------Tht-------------------->|
//
// Tha - Active Display Time = 640 pixels
// Thp - Horizontal Pulse = 3.8us/39.72ns = 96 pixels
// Thfp - Horizontal Front Porch = .595us/39.72ns = 16 pixels
// Thbp - Horizontal Backporch = 1.9us/39.72ns = 48 pixels
// Tht - Total Horizontal Time = = 800 pixels @ 39.72ns/pixel = 31.776us or 31.47Khz
//
// Correlation between horizontal timing parameters and SED registers
#define SED_HOR_PULSE_WIDTH_LCD 0x0b // HRTC/FPLINE Pulse Width Register = (Thp/8) - 1
#define SED_HOR_PULSE_START_LCD 0x02 // HRTC/FPLINE Start Position Register = (Thfp/8) - 2
#define SED_HOR_NONDISP_LCD 0x13 // Horizontal Non-Display Period Register = ((Thp + Thfp + Thbp)/8) - 1
//
// LCD MODE VERTICAL TIMING PARAMTERS
//
// |<-------Tva------->|
// |___________________| ______
// Display Enable _____________________| |_____________________|
// | |
// Vertical Pulse __ ________|___________________|________ __________
// |_________| | | |________|
// |<- Tvp ->| | | |
// | |<-Tvbp->| | |
// | |<-Tvfp->|
// |<----------------------Tvt-------------------->|
//
// Tva - Active Display Time = 480 lines
// Tvp - Vertical Pulse = 2 lines
// Tvfp - Vertical Front Porch = 10 lines
// Tvbp - Vertical Backporch = 33 lines
// Tvt - Total Horizontal Time = 525 lines @ 31.776us/line = 16.682ms or 60Hz
//
// Correlation between vertical timing parameters and SED registers
#define SED_VER_PULSE_WIDTH_LCD 0x01 // VRTC/FPFRAME Pulse Width Register = Tvp - 1
#define SED_VER_PULSE_START_LCD 0x09 // VRTC/FPFRAME Start Position Register = Tvfp - 1
#define SED_VER_NONDISP_LCD 0x2c // Vertical Non-Display Period Register = (Tvp + Tvfp + Tvbp) - 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -