📄 k90ti_lcd.c
字号:
#include "CPU.H"
#include "K90Ti_LCD.H"
#define _CONST_ const
#include "ASCII.c"
//HZDotReader 输出格式中以code 为const
#define code const
#include "Chinese.c"
#undef code
/*
-------------------------------------------------------------------------
GUI相关全局变量
-------------------------------------------------------------------------
*/
INT8U GUIEnFont = En_8x16; //英文字体
INT8U GUITextMode = GUI_TEXTMODE_NORMAL; //显示模式
INT8U GUIZoomMode = GUI_TEXTMODE_ZOOMx1;
INT8U Char_XSIZE; //英文字体X宽度
INT8U Char_YSIZE; //英文字体Y宽度
INT8U Chinese_XSIZE;
INT8U Chinese_YSIZE;
GUI_COLOR BkColor = GUI_BLACK;//背景颜色
GUI_COLOR FgColor = GUI_WHITE;//前景颜色
INT16U PosX = 0; //当前系统X坐标
INT16U PosY = 0; //当前系统Y坐标
INT8U NoXY = TRUE;//是否使用PosX PosY的标志 1-->不使用 0-->使用
void SomeNop(void)
{
INT16U j;
for(j = 0x0F; j > 0; j--);
}
//获得LCD型号
INT8U LCD_GetLCDType(void)
{
INT8U temp;
temp = (0x07 & DCU_DATA_PORT);
return temp;
}
//设置显存地址
void LCD_SetSRAMAddr(INT32U Addr)
{
INT8U temp;
Addr = Addr &0x0003FFFF;//18bit Addr
temp = Addr & 0x3F;
DCU_CMD_PORT = DCU_CMD_Set_Addr_L | temp;
SomeNop();
Addr = Addr >> 6;
temp = Addr & 0x3F;
DCU_CMD_PORT = DCU_CMD_Set_Addr_M | temp;
SomeNop();
Addr = Addr >> 6;
temp = Addr & 0x3F;
DCU_CMD_PORT = DCU_CMD_Set_Addr_H | temp;
SomeNop();
}
void LCD_SetBkColor(INT8U BkColor)
{
INT8U temp;
temp = BkColor & 0x07;
DCU_CMD_PORT = DCU_CMD_Set_RGB_0 | temp;//设置数据0 对应的颜色
SomeNop();
}
void LCD_SetColor(INT8U Color)
{
INT8U temp;
temp = Color & 0x07;
DCU_CMD_PORT = DCU_CMD_Set_RGB_1 | temp;//设置数据1 对应的颜色
SomeNop();
}
void LCD_Delayus(INT16U us)
{
INT16U i;
INT16U j;
for(i = us; i > 0; i--){ /* delay */
for(j = 0x0D; j > 0; j--); /* delay */
}
}
void LCD_DelayMs(INT16U Ms)
{
INT16U i;
for(i = 0; i < Ms; i++){ /* delay */
LCD_Delayus(1000);
}
}
/*
void LCD_Init(void)
{
DCU_CMD_PORT = DCU_CMD_Set_State_B;
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit;//VEE_ON
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit;//
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit;//
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit;//
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit;//
SomeNop();
LCD_DelayMs(25);
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit|LCD_DISP_ON_Bit;//VEE_ON + Disp_ON
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit|LCD_DISP_ON_Bit;//
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit|LCD_DISP_ON_Bit;//
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit|LCD_DISP_ON_Bit;//
SomeNop();
DCU_CMD_PORT = DCU_CMD_Set_State_A |LCD_VEE_ON_Bit|LCD_DISP_ON_Bit;//
SomeNop();
}
void LCD_SetBkLight(BOOL Up_nDown)
{
if(Up_nDown){
DCU_CMD_PORT = DCU_CMD_Set_Light |X9313_nCS_Bit|X9313_UnD_Bit|X9313_INC_Bit;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light | X9313_UnD_Bit|X9313_INC_Bit;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light | X9313_UnD_Bit;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light | X9313_UnD_Bit|X9313_INC_Bit;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light |X9313_nCS_Bit|X9313_UnD_Bit|X9313_INC_Bit;
}else{
DCU_CMD_PORT = DCU_CMD_Set_Light |X9313_nCS_Bit|X9313_INC_Bit;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light | X9313_INC_Bit;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light ;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light | X9313_INC_Bit;
LCD_Delayus(2);
DCU_CMD_PORT = DCU_CMD_Set_Light |X9313_nCS_Bit|X9313_INC_Bit;
}
}
void LCD_Clear(INT8U BkColor)
{
INT16U LCD_X;
INT16U LCD_Y;
// LCD_SetBkColor(BkColor);
// LCD_SetColor(0xFF);
// LCD_SetSRAMAddr(0);
for(LCD_Y = 0; LCD_Y < LCD_YSIZE; LCD_Y++){
for(LCD_X = 0; LCD_X < LCD_X_BYTE_SIZE; LCD_X++){
// SomeNop();
// DCU_DATA_PORT = 0x00;
GUI_X_Lock();
LCDSIM_SetPixelIndex(LCD_X,LCD_Y,BkColor);
GUI_X_Unlock();
}
}
}
*/
void GUI_Clear(void)
{
INT16U LCD_X;
INT16U LCD_Y;
for(LCD_Y = 0; LCD_Y < LCD_YSIZE; LCD_Y++){
for(LCD_X = 0; LCD_X < LCD_X_BYTE_SIZE; LCD_X++){
Display_Locate(0x00, LCD_X,LCD_Y);
}
}
}
void GUI_Init(void)
{
// INT8U LCDType;
// LCD_Init();
// LCDType = LCD_GetLCDType();
// if(LCDType==0x01){//黑白 LCD
// LCD_Clear(0x00);
// }
BkColor = GUI_BLUE;
FgColor = GUI_RED;
GUI_Clear();
GUI_SetEnFont(En_8x16);
GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
GUI_SetFontZoom(GUI_TEXTMODE_ZOOMx1);
PosX = 0;
PosY = 0;
NoXY = TRUE;
}
/*
*****************************************************************************
* Display_Locate - LCD上指定位置 显示指定数据
* DESCRIPTION: -
*
* @Param x0:0--(640/8-1) 横向坐标 LCD 是横向8个点为一个Byte
* @Param y0:0--(480-1) 纵向坐标
* @Param DisplayData:写入的数据
* @Return :
* ----
*****************************************************************************
*/
/*
void Display_Locate(INT8U DisplayData, INT16U x0, INT16U y0)
{
INT32U Addr;
if ((x0 <= (LCD_X_BYTE_SIZE-1))&&(y0 <= (LCD_YSIZE-1))){
Addr = y0 * LCD_X_BYTE_SIZE + x0;
LCD_SetSRAMAddr(Addr);
DCU_DATA_PORT = DisplayData;
SomeNop();
}
}
*/
//该表格把字体放大
//
INT16U _CONST_ Changedot[] =
{
0x0000, 0x0003, 0x000c, 0x000f, 0x0030, 0x0033, 0x003c, 0x003f, 0x00c0, 0x00c3,
0x00cc, 0x00cf, 0x00f0, 0x00f3, 0x00fc, 0x00ff, 0x0300, 0x0303, 0x030c, 0x030f,
0x0330, 0x0333, 0x033c, 0x033f, 0x03c0, 0x03c3, 0x03cc, 0x03cf, 0x03f0, 0x03f3,
0x03fc, 0x03ff, 0x0c00, 0x0c03, 0x0c0c, 0x0c0f, 0x0c30, 0x0c33, 0x0c3c, 0x0c3f,
0x0cc0, 0x0cc3, 0x0ccc, 0x0ccf, 0x0cf0, 0x0cf3, 0x0cfc, 0x0cff, 0x0f00, 0x0f03,
0x0f0c, 0x0f0f, 0x0f30, 0x0f33, 0x0f3c, 0x0f3f, 0x0fc0, 0x0fc3, 0x0fcc, 0x0fcf,
0x0ff0, 0x0ff3, 0x0ffc, 0x0fff, 0x3000, 0x3003, 0x300c, 0x300f, 0x3030, 0x3033,
0x303c, 0x303f, 0x30c0, 0x30c3, 0x30cc, 0x30cf, 0x30f0, 0x30f3, 0x30fc, 0x30ff,
0x3300, 0x3303, 0x330c, 0x330f, 0x3330, 0x3333, 0x333c, 0x333f, 0x33c0, 0x33c3,
0x33cc, 0x33cf, 0x33f0, 0x33f3, 0x33fc, 0x33ff, 0x3c00, 0x3c03, 0x3c0c, 0x3c0f,
0x3c30, 0x3c33, 0x3c3c, 0x3c3f, 0x3cc0, 0x3cc3, 0x3ccc, 0x3ccf, 0x3cf0, 0x3cf3,
0x3cfc, 0x3cff, 0x3f00, 0x3f03, 0x3f0c, 0x3f0f, 0x3f30, 0x3f33, 0x3f3c, 0x3f3f,
0x3fc0, 0x3fc3, 0x3fcc, 0x3fcf, 0x3ff0, 0x3ff3, 0x3ffc, 0x3fff, 0xc000, 0xc003,
0xc00c, 0xc00f, 0xc030, 0xc033, 0xc03c, 0xc03f, 0xc0c0, 0xc0c3, 0xc0cc, 0xc0cf,
0xc0f0, 0xc0f3, 0xc0fc, 0xc0ff, 0xc300, 0xc303, 0xc30c, 0xc30f, 0xc330, 0xc333,
0xc33c, 0xc33f, 0xc3c0, 0xc3c3, 0xc3cc, 0xc3cf, 0xc3f0, 0xc3f3, 0xc3fc, 0xc3ff,
0xcc00, 0xcc03, 0xcc0c, 0xcc0f, 0xcc30, 0xcc33, 0xcc3c, 0xcc3f, 0xccc0, 0xccc3,
0xcccc, 0xcccf, 0xccf0, 0xccf3, 0xccfc, 0xccff, 0xcf00, 0xcf03, 0xcf0c, 0xcf0f,
0xcf30, 0xcf33, 0xcf3c, 0xcf3f, 0xcfc0, 0xcfc3, 0xcfcc, 0xcfcf, 0xcff0, 0xcff3,
0xcffc, 0xcfff, 0xf000, 0xf003, 0xf00c, 0xf00f, 0xf030, 0xf033, 0xf03c, 0xf03f,
0xf0c0, 0xf0c3, 0xf0cc, 0xf0cf, 0xf0f0, 0xf0f3, 0xf0fc, 0xf0ff, 0xf300, 0xf303,
0xf30c, 0xf30f, 0xf330, 0xf333, 0xf33c, 0xf33f, 0xf3c0, 0xf3c3, 0xf3cc, 0xf3cf,
0xf3f0, 0xf3f3, 0xf3fc, 0xf3ff, 0xfc00, 0xfc03, 0xfc0c, 0xfc0f, 0xfc30, 0xfc33,
0xfc3c, 0xfc3f, 0xfcc0, 0xfcc3, 0xfccc, 0xfccf, 0xfcf0, 0xfcf3, 0xfcfc, 0xfcff,
0xff00, 0xff03, 0xff0c, 0xff0f, 0xff30, 0xff33, 0xff3c, 0xff3f, 0xffc0, 0xffc3,
0xffcc, 0xffcf, 0xfff0, 0xfff3, 0xfffc, 0xffff,
};
//extern void GUI_X_Lock(void);
//extern void GUI_X_Unlock(void);
//extern void LCDSIM_SetPixelIndex(int x, int y, int Index);
void Display_Locate(INT8U DisplayData, INT16U x0, INT16U y0)
{
// INT32U Addr;
INT8U LByte;
INT8U HByte;
unsigned char i;
if ((x0 <= (LCD_X_BYTE_SIZE-1))&&(y0 <= (LCD_YSIZE-1))){
if (GUIZoomMode == GUI_TEXTMODE_ZOOMx2){
/*
Addr = y0 * LCD_X_BYTE_SIZE + x0;
LByte = (INT8U) Changedot[DisplayData];
HByte = (INT8U) ((Changedot[DisplayData]&0xFF00) >> 8);
SomeNop();
LCD_SetSRAMAddr(Addr);
DCU_DATA_PORT = HByte;
SomeNop();
SomeNop();
SomeNop();
SomeNop();
DCU_DATA_PORT = LByte;
SomeNop();
SomeNop();
SomeNop();
SomeNop();
Addr = Addr + LCD_X_BYTE_SIZE;//下一行
LCD_SetSRAMAddr(Addr);
DCU_DATA_PORT = HByte;
SomeNop();
SomeNop();
SomeNop();
SomeNop();
SomeNop();
DCU_DATA_PORT = LByte;
SomeNop();
*/
LByte = (INT8U) Changedot[DisplayData];
HByte = (INT8U) ((Changedot[DisplayData]&0xFF00) >> 8);
GUI_X_Lock();
x0 = x0*8;
for(i = 0; i < 8; i++){
if (HByte&(1<<(7-i))){
LCDSIM_SetPixelIndex(x0++,y0,FgColor);
}else {
LCDSIM_SetPixelIndex(x0++,y0,BkColor);
}
}
for(i = 0; i < 8; i++){
if (LByte&(1<<(7-i))){
LCDSIM_SetPixelIndex(x0++,y0,FgColor);
}else {
LCDSIM_SetPixelIndex(x0++,y0,BkColor);
}
}
GUI_X_Unlock();
}else{
// Addr = y0 * LCD_X_BYTE_SIZE + x0;
// LCD_SetSRAMAddr(Addr);
// DCU_DATA_PORT = DisplayData;
// SomeNop();
/*
y0 = y0*8*2;
for(i = 0; i < 8; i++){
if (DisplayData&(1<<i)){
GUI_SetColor(GUI_LIGHTRED);
LCD_DrawPixel(y0*2, y0);
LCD_DrawPixel(y0*2, y0+1);
LCD_DrawPixel(y0*2+1, y0);
LCD_DrawPixel(y0*2+1, y0+1);
y0 = y0+2;
}else {
GUI_SetColor(GUI_LIGHTGREEN);
LCD_DrawPixel(y0*2, y0);
LCD_DrawPixel(X*2, Y+1);
LCD_DrawPixel(X*2+1, Y);
LCD_DrawPixel(X*2+1, Y+1);
Y = Y+2;
}
}
*/
GUI_X_Lock();
// x0 = x0*8;
for(i = 0; i < 8; i++){
if (DisplayData&(1<<(7-i))){
// GUI_X_Lock();
LCDSIM_SetPixelIndex(x0++,y0,FgColor);
// GUI_X_Unlock();
}else {
// GUI_X_Lock();
LCDSIM_SetPixelIndex(x0++,y0,BkColor);
// GUI_X_Unlock();
}
}
GUI_X_Unlock();
}
}
}
/*
*****************************************************************************
* Display_ASCII - 显示一个ASCII
* DESCRIPTION: -
*
* @Param X:X轴坐标 0--LCD_X_BYTE_SIZE (注意边界)
* @Param Y:Y轴坐标 0-- LCD_YSIZE (注意边界)
* @Param Char:ASCII码
* @Return :
* ----
*****************************************************************************
*/
void Display_ASCII(INT8U AscciiChar, INT16U X, INT16U Y)
{
INT8U i, ImgData;
INT16U Disp_y = Y;
if(GUIEnFont == En_5x8){
for(i = 0; i < 8; i++){
ImgData = chardot_5x8[i+(AscciiChar-0x20)*8];
Display_Locate(ImgData, X, Disp_y);
Disp_y ++;
}
} else {
for(i = 0; i < 16; i++){
ImgData = chardot_8x16[i+(AscciiChar-0x20)*16];
Display_Locate(ImgData, X, Disp_y);
if(GUIZoomMode == GUI_TEXTMODE_ZOOMx1){
Disp_y ++;
}else{
Disp_y += 2;
}
}
}
}
void Display_InvASCII(INT8U AscciiChar, INT16U X, INT16U Y)
{
INT8U i, ImgData;
INT16U Disp_y = Y;
if(GUIEnFont == En_5x8){
for(i = 0; i < 8; i++){
ImgData = chardot_5x8[i+(AscciiChar-0x20)*8] ^0xFF;
Display_Locate(ImgData, X, Disp_y);
Disp_y++;
}
} else {
for(i = 0; i < 16; i++){
ImgData = chardot_8x16[i+(AscciiChar-0x20)*16] ^0xFF;
Display_Locate(ImgData, X, Disp_y);
Disp_y++;
}
}
}
void Display_ASCII_UnderLine(INT8U AscciiChar, INT16U X, INT16U Y)
{
INT8U i, ImgData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -