⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k90ti_lcd.c

📁 本代码包为本人的一篇文章<一个占用内存极少的菜单系统的实现>在在PC上的测试移植代码。 ------------------------------ Menu_Src目录为Menu的源
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -