📄 display.c
字号:
/*
* Copyright (C) 2001, Spectrum Digital, Inc. All Rights Reserved.
*/
#include "5509.h"
#include "util.h"
// LCD control pins
#define LCD_BUSY GPIO_4
// LCD command codes (SED1565 command set)
#define LCDCMD_SETCOLL 0x00
#define LCDCMD_SETCOLH 0x10
#define LCDCMD_SETRATIO 0x20
#define LCDCMD_SETPOWER 0x28
#define LCDCMD_SETLINE 0x40
#define LCDCMD_DISPLAY_OFF 0xae
#define LCDCMD_SETBIAS_HI 0xa2
#define LCDCMD_SETBIAS_LO 0xa3
#define LCDCMD_NONE 0xa4
#define LCDCMD_ALL 0xa5
#define LCDCMD_REVERSE_ON 0xa7
#define LCDCMD_REVERSE_OFF 0xa6
#define LCDCMD_DISPLAY_ON 0xaf
#define LCDCMD_SETPAGE 0xb0
#define LCDCMD_RESET 0xe2
#define LCDCMD_SETCOMDIR_FWD 0xc0
#define LCDCMD_SETCOMDIR_REV 0xc8
#define LCD_TEXTROWS 8
#define LCD_TEXTCOLS 21
#define LCD_PIXELROWS 64
#define LCD_PIXELCOLS 128
// Character set, 5 bytes each, starting from ASCII 16
unsigned char charset[96 * 5 ]= {
0x00, 0x00, 0x00, 0x00, 0x00, // ASCII 32
0x00, 0x00, 0x6f, 0x00, 0x00, // ASCII 33, !
0x00, 0x00, 0x07, 0x00, 0x07, // ASCII 34, "
0x14, 0x7f, 0x14, 0x7f, 0x14, // ASCII 35, #
0x24, 0x2a, 0x7f, 0x2a, 0x12, // ASCII 36, $
0x43, 0x33, 0x08, 0x66, 0x61, // ASCII 37, %
0x32, 0x4d, 0x59, 0x21, 0x72, // ASCII 38, &
0x00, 0x00, 0x03, 0x00, 0x00, // ASCII 39, '
0x00, 0x00, 0x3e, 0x41, 0x00, // ASCII 40, (
0x00, 0x41, 0x3e, 0x00, 0x00, // ASCII 41, )
0x0a, 0x0c, 0x07, 0x0c, 0x0a, // ASCII 42, *
0x08, 0x08, 0x3e, 0x08, 0x08, // ASCII 43, +
0x00, 0x00, 0xe0, 0x60, 0x00, // ASCII 44, ,
0x08, 0x08, 0x08, 0x08, 0x08, // ASCII 45, -
0x00, 0x00, 0x60, 0x60, 0x00, // ASCII 46, .
0x40, 0x30, 0x08, 0x06, 0x01, // ASCII 47, /
0x3e, 0x45, 0x49, 0x51, 0x3e, // ASCII 48, 0
0x00, 0x42, 0x7f, 0x40, 0x00, // ASCII 49, 1
0x62, 0x51, 0x49, 0x45, 0x42, // ASCII 50, 2
0x22, 0x41, 0x49, 0x49, 0x36, // ASCII 51, 3
0x08, 0x0c, 0x0a, 0x7f, 0x08, // ASCII 52, 4
0x2f, 0x49, 0x49, 0x49, 0x31, // ASCII 53, 5
0x3e, 0x49, 0x49, 0x49, 0x32, // ASCII 54, 6
0x01, 0x71, 0x09, 0x05, 0x03, // ASCII 55, 7
0x36, 0x49, 0x49, 0x49, 0x36, // ASCII 56, 8
0x26, 0x49, 0x49, 0x49, 0x3e, // ASCII 57, 9
0x00, 0x36, 0x36, 0x00, 0x00, // ASCII 58, :
0x00, 0x00, 0x36, 0x16, 0x00, // ASCII 59, ;
0x00, 0x08, 0x14, 0x22, 0x00, // ASCII 60, <
0x00, 0x14, 0x14, 0x14, 0x14, // ASCII 61, =
0x00, 0x22, 0x14, 0x08, 0x00, // ASCII 62, >
0x02, 0x01, 0x59, 0x05, 0x02, // ASCII 63, ?
0x3e, 0x41, 0x5d, 0x55, 0x5e, // ASCII 64, @
0x7e, 0x09, 0x09, 0x09, 0x7e, // ASCII 65, A
0x7f, 0x49, 0x49, 0x49, 0x36, // ASCII 66, B
0x3e, 0x41, 0x41, 0x41, 0x22, // ASCII 67, C
0x7f, 0x41, 0x41, 0x41, 0x3e, // ASCII 68, D
0x7f, 0x49, 0x49, 0x49, 0x41, // ASCII 69, E
0x7f, 0x09, 0x09, 0x09, 0x01, // ASCII 70, F
0x3e, 0x41, 0x49, 0x49, 0x3a, // ASCII 71, G
0x7f, 0x08, 0x08, 0x08, 0x7f, // ASCII 72, H
0x41, 0x41, 0x7f, 0x41, 0x41, // ASCII 73, I
0x20, 0x40, 0x40, 0x40, 0x3f, // ASCII 74, J
0x7f, 0x08, 0x14, 0x22, 0x41, // ASCII 75, K
0x7f, 0x40, 0x40, 0x40, 0x40, // ASCII 76, L
0x7f, 0x02, 0x0c, 0x02, 0x7f, // ASCII 77, M
0x7f, 0x04, 0x08, 0x10, 0x7f, // ASCII 78, N
0x3e, 0x41, 0x41, 0x41, 0x3e, // ASCII 79, O
0x7f, 0x09, 0x09, 0x09, 0x06, // ASCII 80, P
0x3e, 0x41, 0x51, 0x21, 0x5e, // ASCII 81, Q
0x7f, 0x09, 0x19, 0x29, 0x46, // ASCII 82, R
0x26, 0x49, 0x49, 0x49, 0x32, // ASCII 83, S
0x01, 0x01, 0x7f, 0x01, 0x01, // ASCII 84, T
0x3f, 0x40, 0x40, 0x40, 0x3f, // ASCII 85, U
0x07, 0x18, 0x60, 0x18, 0x07, // ASCII 86, V
0x1f, 0x60, 0x18, 0x60, 0x1f, // ASCII 87, W
0x63, 0x14, 0x08, 0x14, 0x63, // ASCII 88, X
0x07, 0x08, 0x70, 0x08, 0x07, // ASCII 89, Y
0x61, 0x51, 0x49, 0x45, 0x43, // ASCII 90, Z
0x00, 0x7f, 0x41, 0x41, 0x00, // ASCII 91, [
0x01, 0x06, 0x08, 0x30, 0x40, // ASCII 92,
0x00, 0x41, 0x41, 0x7f, 0x00, // ASCII 93, ]
0x04, 0x02, 0x01, 0x02, 0x04, // ASCII 94, ^
0x40, 0x40, 0x40, 0x40, 0x40, // ASCII 95, _
0x01, 0x03, 0x00, 0x00, 0x00, // ASCII 96, `
0x38, 0x44, 0x44, 0x24, 0x78, // ASCII 97, a
0x7f, 0x44, 0x44, 0x44, 0x38, // ASCII 98, b
0x38, 0x44, 0x44, 0x44, 0x28, // ASCII 99, c
0x38, 0x44, 0x44, 0x44, 0x7f, // ASCII 100, d
0x38, 0x54, 0x54, 0x54, 0x48, // ASCII 101, e
0x00, 0x08, 0x7e, 0x09, 0x02, // ASCII 102, f
0x18, 0xa4, 0xa4, 0xa4, 0x78, // ASCII 103, g
0x7f, 0x04, 0x04, 0x04, 0x78, // ASCII 104, h
0x00, 0x00, 0x7d, 0x40, 0x00, // ASCII 105, i
0x40, 0x80, 0x80, 0x7d, 0x00, // ASCII 106, j
0x00, 0x7f, 0x10, 0x28, 0x44, // ASCII 107, k
0x00, 0x00, 0x7f, 0x00, 0x00, // ASCII 108, l
0x78, 0x04, 0x18, 0x04, 0x78, // ASCII 109, m
0x7c, 0x08, 0x04, 0x04, 0x78, // ASCII 110, n
0x38, 0x44, 0x44, 0x44, 0x38, // ASCII 111, o
0xf8, 0x24, 0x24, 0x24, 0x18, // ASCII 112, p
0x18, 0x24, 0x24, 0x24, 0xf8, // ASCII 113, q
0x7c, 0x08, 0x04, 0x04, 0x04, // ASCII 114, r
0x48, 0x54, 0x54, 0x54, 0x24, // ASCII 115, s
0x04, 0x04, 0x7e, 0x44, 0x04, // ASCII 116, t
0x3c, 0x40, 0x40, 0x20, 0x7c, // ASCII 117, u
0x0c, 0x30, 0x40, 0x30, 0x0c, // ASCII 118, v
0x3c, 0x40, 0x30, 0x40, 0x3c, // ASCII 119, w
0x44, 0x28, 0x10, 0x28, 0x44, // ASCII 120, x
0x1c, 0xa0, 0xa0, 0xa0, 0x7c, // ASCII 121, y
0x44, 0x64, 0x54, 0x4c, 0x44, // ASCII 122, z
0x08, 0x08, 0x36, 0x41, 0x41, // ASCII 123, {
0x00, 0x00, 0x77, 0x00, 0x00, // ASCII 124, |
0x41, 0x41, 0x36, 0x08, 0x08, // ASCII 125, }
0x02, 0x01, 0x01, 0x02, 0x01, // ASCII 126, ~
0xaa, 0x55, 0xaa, 0x55, 0xaa // ASCII 127
};
char hexstr[16] = {'0', '1', '2', '3' ,'4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
void LCD_Write(int a0, unsigned short data)
{
PC55XX_GPIO pGPIO = (PC55XX_GPIO)C55XX_GPIO_ADDR;
// Wait for display if busy
while (!(pGPIO -> iodata & LCD_BUSY));
// Write a byte to the display
Logic_WriteDisplay(a0, data);
}
void LCD_SetPos(int col, int page)
{
LCD_Write(0, LCDCMD_SETPAGE | page);
LCD_Write(0, LCDCMD_SETCOLH | ((col >> 4) & 0xf));
LCD_Write(0, LCDCMD_SETCOLL | (col & 0xf));
}
void LCD_SetReverse(int rev)
{
LCD_Write(0, LCDCMD_REVERSE_ON | rev);
}
void LCD_SetStartLine(int row)
{
LCD_Write(0, LCDCMD_SETLINE | row);
}
LCD_SetRatio(int ratio)
{
LCD_Write(0, LCDCMD_SETRATIO | ratio);
}
void LCD_Raw(unsigned char *pdata, int len)
{
int i;
for (i = 0; i < len; i++)
LCD_Write(1, *pdata++);
}
void LCD_RawPos(int x, int y, unsigned char *pdata, int len)
{
LCD_SetPos(x, y);
LCD_Raw(pdata, len);
}
void LCD_Char(char ch)
{
int i;
unsigned char *pdata;
if (ch < 32)
ch = 32;
pdata = &charset[(ch - 32) * 5];
for (i = 0; i < 5; i++)
LCD_Write(1, *pdata++);
LCD_Write(1, 0);
}
void LCD_CharPos(int x, int y, char ch)
{
LCD_SetPos(x * 6, y);
LCD_Char(ch);
}
void LCD_Text(char *str)
{
while (*str & 0xff)
LCD_Char(*str++);
}
void LCD_TextPos(int x, int y, char *str)
{
LCD_SetPos(x * 6, y);
LCD_Text(str);
}
void LCD_Hex(unsigned short hexnum)
{
int i;
char hextext[5];
// Build a ASCII hex string
for (i = 3; i >= 0; i--)
{
hextext[i] = hexstr[hexnum & 0xf];
hexnum = hexnum >> 4;
}
hextext[4] = 0;
// Display the hex number
LCD_Text(hextext);
}
void LCD_HexPos(int x, int y, unsigned short int hexnum)
{
LCD_SetPos(x * 6, y);
LCD_Hex(hexnum);
}
void LCD_FillScreen(unsigned char value)
{
int x, y;
for (y = 0; y < LCD_TEXTROWS; y++)
{
LCD_SetPos(0, y);
for (x = 0; x < LCD_PIXELCOLS; x++)
LCD_Write(1, value);
}
}
void LCD_ClearRow(int row)
{
int i;
LCD_SetPos(0,row);
for ( i = 0 ; i<128 ; i++ )
LCD_Write(1,0);
}
void LCD_ClearScreen()
{
LCD_FillScreen(0);
}
void LCD_Init()
{
PC55XX_GPIO pGPIO = (PC55XX_GPIO)C55XX_GPIO_ADDR;
// Configure LCD_BUSY/GPIO_4 for input
ClearMask(pGPIO -> iodir, LCD_BUSY);
// Configure the display
LCD_Write(0, LCDCMD_RESET); // Reset the display
LCD_Write(0, LCDCMD_SETPOWER | 7); // Turn internal voltage regulator/booster on
LCD_Write(0, LCDCMD_SETRATIO | 4); // Set contrast ratio to 4
LCD_Write(0, LCDCMD_SETBIAS_HI); // Set LCD bias high
LCD_Write(0, LCDCMD_DISPLAY_ON); // Turn display on
LCD_Write(0, LCDCMD_SETCOMDIR_REV); // Reverse the row addressing so 0,0 is in upper left
// Set the first line to 0 (normal mode)
LCD_SetStartLine(0);
// Clear the screen
LCD_ClearScreen();
}
void LCD_Charset()
{
int x, y;
for (y = 0; y < 6; y++)
for (x = 0; x < 16; x++)
LCD_CharPos(x + 2, y + 1, 32 + (y << 4) + x);
}
void LCD_Fill1(int value)
{
int i, j, middlescreen;
middlescreen = LCD_PIXELCOLS >> 1;
for (i = 0; i < middlescreen; i+=1)
{
for (j = 0; j < LCD_TEXTROWS; j++)
{
LCD_SetPos(middlescreen - i - 1, j);
LCD_Write(1, value);
LCD_SetPos(middlescreen + i, j);
LCD_Write(1, value);
}
SWDelayMsec(20);
}
}
unsigned short LCD_Test()
{
int i;
// Initialize the display
LCD_Init();
// Set all pixels on and off to check for dead pixels
for (i = 0; i < 12; i++)
{
LCD_FillScreen(0x00);
SWDelayMsec(50);
LCD_FillScreen(0xff);
SWDelayMsec(50);
}
LCD_ClearScreen();
// Draw lines across the screen to check addressability
LCD_Fill1(0xff);
LCD_Fill1(0x00);
LCD_ClearScreen();
return 0;
}
void LCD_Debug()
{
LCD_Init();
// while(1)
// LCD_Write(1, 0xa5);
LCD_Charset();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -