📄 lcd_gui.c
字号:
LCD_DATA_OUT(Bk_Clr);
}
#endif
}
}
LCD_WR_END();
LCD_SetWindow(0, 0, X_END, Y_END); //恢复全屏作图区域
}
void Set_HZWindow(unsigned int Start_X, unsigned int Start_Y)
{
unsigned int X_Region = 0;
unsigned int Y_Region = 0;
#if LCD_CHAR_HORIZONTAL > 0
Start_X <<= 4; //一个英文字符占区域为8*16
Start_Y <<= 4;
X_Region = Start_X + 15; //一行可以显示30个字符
Y_Region = Start_Y + 15; //一列可以显示20个字符
#else
Start_X <<= 4; //一个英文字符占区域为8*16
Start_Y <<= 4;
X_Region = Start_X + 15; //一行可以显示15个字符
Y_Region = Start_Y + 15; //一列可以显示40个字符
#endif
LCD_SetWindow(Start_X, Start_Y, X_Region, Y_Region);
}
void LCD_WriteHZ(unsigned int Start_X, unsigned int Start_Y,
unsigned int Char_Clr,
unsigned int Bk_Clr,
unsigned char *p_str)
{
unsigned char nowchar = *p_str ++;
while( nowchar != 0 )
{
unsigned char show_cnt = 0;
unsigned char bit_cnt = 0;
signed char temp = 0;
nowchar -= 48;
Set_HZWindow(Start_X, Start_Y); //设置起始坐标,xy是16*16的方格坐标
LCD_WriteGRAM_EN();
for(show_cnt = 0; show_cnt < 32; show_cnt ++)
{ //-> 1010 1100 ->
//-> 1100 1000 ->...
if(show_cnt & BIT(0))
{
temp = 1;
}
else
{
temp = -1;
}
for(bit_cnt = 0; bit_cnt < 8; bit_cnt ++)
{
#if LCD_CHAR_HORIZONTAL > 0
if( HZtable[nowchar][show_cnt] & BIT(7 - bit_cnt) )
{
LCD_DATA_OUT(Char_Clr);
}
else
{
LCD_DATA_OUT(Bk_Clr);
}
#else
if( HZtable[nowchar][31-show_cnt + temp] & BIT(7-bit_cnt) )
{
LCD_DATA_OUT(Char_Clr);
}
else
{
LCD_DATA_OUT(Bk_Clr);
}
#endif
}
}
LCD_WR_END();
LCD_SetWindow(0, 0, X_END, Y_END); //恢复全屏作图区域
nowchar = *p_str ++;
Start_Y += 1;
}
}
void LCD_WriteString(unsigned char Start_X, unsigned char Start_Y,
unsigned int Char_Clr,
unsigned int Bk_Clr,
unsigned char *p_str,
unsigned char is_transp)
{
#if LCD_CHAR_HORIZONTAL > 0
#else
Start_X = CHAR_X_NUM - Start_X - 1;
Start_X = (s8)Start_X;
#endif
while(*p_str)
{
//计算坐标
if(*p_str == '\n') //换行
{
Start_X = 0;
Start_Y ++;
p_str ++; //调过换行符,不用显示
continue; //查询下一个字符
}
else //未遇到换行符则按正常显示坐标自加
{
//显示字符
if(is_transp) //如果字符不为0则限制显示定长个字符
{ //调用显示单个字符显示函数(较慢)
LCD_WriteMenuChar(Start_X, Start_Y,
Char_Clr, Bk_Clr,
*p_str);
}
else
{
LCD_WriteChar(Start_X, Start_Y, //调用显示普通字符显示函数(较快)
Char_Clr, Bk_Clr,
*p_str);
}
#if LCD_CHAR_HORIZONTAL > 0
Start_X ++;
if(Start_X == CHAR_X_NUM)
{
Start_X = 0;
Start_Y ++;
if(Start_Y == CHAR_Y_NUM)
{
Start_Y = 0;
}
}
#else
Start_Y ++;
if(Start_Y == CHAR_Y_NUM)
{
Start_Y = 0;
Start_X --;
if(Start_X < 0)
{
Start_X = CHAR_X_NUM - 1;
}
}
#endif
}
//字符串指针自加
p_str ++;
}
}
////////////////////////////////////////////
//文本输出函数,前景色和背景色已经固定,使用块
//写,目的是达到的最快的文本显示
void LCD_Print(const unsigned char *p_str)
{
static unsigned char XLine = 0;
static unsigned char YLine = 0;
//设置画笔前景和背景色
# define CHAR_CLR 0x0000
# define BK_CLR 0x07E0
while(*p_str)
{
//计算坐标
if(*p_str == '\n') //换行
{
XLine = 0;
YLine ++;
p_str ++; //调过换行符,不用显示
continue; //查询下一个字符
}
else //未遇到换行符则按正常显示坐标自加
{
//如果不是换行符则显示字符
LCD_WriteChar(XLine, YLine, //调用显示普通字符显示函数(较快)
CHAR_CLR, BK_CLR,
*p_str);
#if LCD_CHAR_HORIZONTAL > 0
XLine ++; //行号加1
if(XLine == CHAR_X_NUM)
{
XLine = 0; //写满一行后行号清零
YLine ++; //写满一行后列号加1
if(YLine == CHAR_Y_NUM)
{
YLine = 0;
LCD_Clear(BK_CLR);
}
}
#else
YLine ++; //行号加1
if(YLine == CHAR_Y_NUM)
{
YLine = 0; //写满一行后行号清零
XLine ++; //写满一行后列号加1
if(XLine == CHAR_X_NUM)
{
XLine = 0;
LCD_Clear(BK_CLR);
}
}
#endif
}
//字符串指针自加
p_str ++;
}
}
//数字显示函数
const unsigned char Number[] = {'0', '1', '2', '3','4', '5', '6', '7','8', '9',
'A', 'B', 'C', 'D', 'E', 'F'};
void LCD_WriteNumber(unsigned long data, unsigned char ch_Dot)
{
# define DIGIT_SHOW 10 //最多可以显示10位
signed char digit_sum=0;
signed char digit=0;
static unsigned char NumberBuffer[] = "0123456789";
for(digit_sum = 0; digit_sum < DIGIT_SHOW; digit_sum ++)
{
digit = data%10; //求取最低位
data /= 10; //十进制左移
NumberBuffer[digit_sum]=Number[digit];
if(data == 0)
{
break; //如果已经移到了最高位则跳出循环
}
}
for(digit = 0; digit <= digit_sum; digit ++)
{
#if LCD_CHAR_HORIZONTAL > 0
LCD_WriteChar(digit,0,0,1234,NumberBuffer[digit_sum - digit]);
#else
LCD_WriteChar(0,digit,0,1234,NumberBuffer[digit_sum - digit]);
#endif
}
}
//
void LCD_WriteHexNumber(u16 x, u16 y, unsigned long data, unsigned char is_cap)
{
# define DIGIT_SHOW 10 //最多可以显示10位
signed char digit_sum=0;
signed char digit=0;
static unsigned char NumberBuffer[] = "ff ff ff ff ff ff";
for(digit_sum = 0; digit_sum < DIGIT_SHOW; digit_sum ++)
{
digit = data%16; //求取最低位
data /= 16; //十进制左移
if(!(digit_sum % 3))
{
NumberBuffer[digit_sum ++] = ' ';
}
NumberBuffer[digit_sum]=Number[digit];
if(data == 0)
{
break; //如果已经移到了最高位则跳出循环
}
}
if(digit_sum == 2)
{
NumberBuffer[digit_sum] = '0';
digit_sum += 1;
}
for(digit = 0; digit <= digit_sum; digit ++)
{
LCD_WriteChar(x, y+digit,0,1234,NumberBuffer[digit_sum - digit]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -