📄 panel.c
字号:
* 名称:LCD_ClearAll()
* 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
* 入口参数:ucDATA 要填充的数据
* 出口参数:无
***********************************************************************/
void LCD_ClearAll(void)
{
uint16 i;
LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指针
LCD_WriteTCommand1(LCD_AUT_WR); // 自动写
for(i=0;i<128*30;i++)
LCD_WriteTData1(0x00); // 白底黑字.
LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
}
/***********************************************************************
* 名称:LCD_Initialize()
* 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
* 入口参数:无
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void LCD_Initialize(void)
{
LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 设置文本方式RAM起始地址
LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00); // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 设置图形方式RAM起始地址
LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00); // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
LCD_WriteTCommand1(LCD_MOD_OR); // 设置显示方式为"或"
LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 设置纯图形显示模式
}
/****************************************************************************
* 名称:LCD_UpdateDate()
* 功能:在指定位置上更新8个点。
* 入口参数:x 指定点所在列的位置
* y 指定点所在行的位置
* 出口参数:
* 说明:
****************************************************************************/
void LCD_UpdateByte(uint16 x, uint16 y, uint8 ucDATA)
{
uint16 addr;
addr = (GUI_LCM_XMAX>>3) * y + (x>>3); /* 找出目标地址 */
LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8 ); /* 置地址指针 */
LCD_WriteTCommand2(LCD_INC_WR, ucDATA); /* 输出数据 */
}
/****************************************************************************
* 名称:LCD_UpdatePoint()
* 功能:在指定位置上画点,刷新某一点。
* 入口参数:x 指定点所在列的位置
* y 指定点所在行的位置
* bCOLOR 0/1 显示/不显示
* 出口参数:
* 说明:
****************************************************************************/
void LCD_UpdatePoint(uint16 x, uint16 y, bit bCOLOR)
{
uint16 addr;
uint8 ucTMP;
ucTMP = x % 8;
ucTMP = 7 - ucTMP;
if( bCOLOR == 1 )
ucTMP = 0x01 << ucTMP;
else
ucTMP = 0x00;
addr = (GUI_LCM_XMAX>>3) * y + (x>>3); /* 找出目标地址 */
LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8); /* 置地址指针 */
LCD_WriteTCommand2(LCD_INC_WR, ucTMP); /* 输出数据 */
}
/****************************************************************************
* 名称:LCD_DisASCII16_8()
* 功能:显示ASCII 16×8字符。
* 入口参数:x 指定显示位置,x坐标
* y 指定显示位置,y坐标
* ch 要显示的ASCII字符对应的数组的地址。
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
bit LCD_DisASCII16_8(uint16 x, uint16 y, uint8 *ch)
{
uint8 ucTMP;
uint8 i;
if( x >= (GUI_LCM_XMAX-8) ) /* 参数过滤 */
return(0);
if( y >= (GUI_LCM_YMAX-8) ) /* 参数过滤 */
return(0);
for(i=0; i<16; i++) // 显示共16行
{
ucTMP = *(ch + i);
LCD_UpdateByte(x, y, ucTMP);
y++; // 指向下一行
}
return(1);
}
/****************************************************************************
* 名称:LCD_DisChCH16_16()
* 功能:显示汉字(16*16字体)。
* 入口参数:x 指定显示位置,x坐标
* y 指定显示位置,y坐标
* ch 要显示的汉字对应的数组的地址。
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
bit LCD_DisChCH16_16(uint16 x, uint16 y, uint8 *ch)
{
uint8 ucTMP;
uint8 i, j;
if( x >= (GUI_LCM_XMAX-8) ) /* 参数过滤 */
return(0);
if( y >= (GUI_LCM_YMAX-8) ) /* 参数过滤 */
return(0);
for(i=0; i<16; i++) // 显示共16行
{
for(j=0; j<2; j++) // 每行共16点
{
ucTMP = *(ch + i*2 + j );
LCD_UpdateByte(x, y, ucTMP);
x = x + 8;
}
y++; // 指向下一行
x = x - 16; // 恢复x值
}
return(1);
}
/****************************************************************************
* 名称:LCD_DisChSTR16_16()
* 功能:输出显示字符串(16*16字体,自动换行)。
* 入口参数:x 指定显示位置,x坐标
* y 指定显示位置,y坐标
* str 要显示的字符串
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void LCD_DisChSTR16_16(uint16 x, uint16 y, char *str)
{
while(1)
{
if( (*str)=='\0' )
break;
if( LCD_DisChCH16_16(x, y, str++) == 0 )
break;
x = x + 16; // 下一个字符显示位置,y不变(即不换行)
}
}
/****************************************************************************
* 名称:LCD_DisASCII8_8()
* 功能:显示ASCII码(8*8字体),显示值为20H-7FH(若为其它值,则显示' ')。
* 入口参数:x 指定显示位置,x坐标
* y 指定显示位置,y坐标
* ch 要显示的ASCII码值。
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
bit LCD_DisASCII8_8(uint16 x, uint16 y, uint8 ch)
{
uint8 ucTMP;
uint8 i;
if( x>=(GUI_LCM_XMAX-8) ) /* 参数过滤 */
return(0);
if( y>=(GUI_LCM_YMAX-8) ) /* 参数过滤 */
return(0);
if( (ch<0x20) || (ch>0x7f) )
ch = 0x20;
ch -= 0x20;
for(i=0; i<8; i++)
{
ucTMP = FONT8x8ASCII[ch][i]; /* 读取点阵数据 */
LCD_UpdateByte(x, y, ucTMP);
y++; /* 指向下一行 */
}
return(1);
}
/****************************************************************************
* 名称:LCD_DisASCIISTR16_8()
* 功能:输出显示字符串((16*8字体,自动换行)。
* 入口参数:x 指定显示位置,x坐标
* y 指定显示位置,y坐标
* str 要显示的ASCII码字符串
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void LCD_DisASCIISTR16_8(uint16 x, uint16 y, char *str)
{
while(1)
{
if( (*str)=='\0' )
break;
if( LCD_DisASCII16_8(x, y, str++) == 0 )
break;
x += 8; // 下一个字符显示位置,y不变(即不换行)
}
}
/****************************************************************************
* 名称:LCD_DisASCIINoSTR16_8()
* 功能:输出显示字符串((16*8字体,没有自动换行功能),若显示的字符个数大于指定个数,则直接退出。
* 入口参数:x 指定显示位置,x坐标
* y 指定显示位置,y坐标
* str 要显示的ASCII码字符串。
* num 显示字符的个数
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void LCD_DisASCIINoSTR16_8(uint16 x, uint16 y, char *str, uint8 num)
{
if(num == 0)
return;
for(; num>0; num--)
{
if( (*str)=='\0' )
break;
if( LCD_DisASCII16_8(x, y, str++) == 0 )
break;
x += 8; // 下一个字符显示位置,y不变(即不换行)
}
}
/****************************************************************************
* 名称:LCD_SelfTest()
* 功能:RT240128A显示自检测试.
* 入口参数:无
* 出口参数:无
* 说明:在LCD上显示“苏州市友明科技有限公司”.
****************************************************************************/
void LCD_SelfTest(void)
{
uint16 i;
uint8 j;
LCD_Reset(); // LCM硬件复位.
LCD_Initialize(); // LCM初始化设置,图形模式.
LCD_ClearAll(); // LCM清屏.
LCD_DisChCH16_16(16, 16, su );
LCD_DisChCH16_16(32, 16, zhou );
LCD_DisChCH16_16(48, 16, shi );
LCD_DisChCH16_16(64, 16, you0 );
LCD_DisChCH16_16(80, 16, ming );
LCD_DisChCH16_16(96, 16, ke );
LCD_DisChCH16_16(112, 16, ji );
LCD_DisChCH16_16(128, 16, you1 );
LCD_DisChCH16_16(144, 16, xian );
LCD_DisChCH16_16(160, 16, gong );
LCD_DisChCH16_16(176, 16, si );
LCD_DisChCH16_16(16, 16, Matrix001);
LCD_DisChCH16_16(32, 16, Matrix002);
LCD_DisASCII16_8(192, 16, ASCII_3);
LCD_DisASCII16_8(200, 16, ASCII_7);
LCD_DisASCII16_8(208, 16, ASCII_Dot);
LCD_DisASCII16_8(216, 16, ASCII_2);
LCD_DisASCII16_8(224, 16, du2);
LCD_DisChCH16_16(16, 32, su );
LCD_DisChCH16_16(32, 32, zhou );
LCD_DisChCH16_16(48, 32, shi );
LCD_DisChCH16_16(64, 32, you0 );
LCD_DisChCH16_16(80, 32, ming );
LCD_DisChCH16_16(96, 32, ke );
LCD_DisChCH16_16(112, 32, ji );
LCD_DisChCH16_16(128, 32, you1 );
LCD_DisChCH16_16(144, 32, xian );
LCD_DisChCH16_16(160, 32, gong );
LCD_DisChCH16_16(176, 32, si );
LCD_DisChCH16_16(16, 32, Matrix001);
LCD_DisChCH16_16(32, 32, Matrix002);
LCD_DisASCII16_8(192, 32, ASCII_3);
LCD_DisASCII16_8(200, 32, ASCII_7);
LCD_DisASCII16_8(208, 32, ASCII_Dot);
LCD_DisASCII16_8(216, 32, ASCII_2);
LCD_DisASCII16_8(224, 32, du2);
LCD_DisChCH16_16(16, 48, Matrix004);
LCD_DisChCH16_16(32, 48, Matrix005);
LCD_DisChCH16_16(48, 48, Matrix006);
LCD_DisChCH16_16(64, 48, Matrix007);
LCD_DisChCH16_16(80, 48, Matrix008);
LCD_DisChCH16_16(96, 48, Matrix009);
LCD_DisASCII16_8(112, 48, ASCII_3);
LCD_DisASCII16_8(120, 48, ASCII_7);
LCD_DisASCII16_8(128, 48, ASCII_Dot);
LCD_DisASCII16_8(136, 48, ASCII_2);
LCD_DisASCII16_8(144, 48, du2);
LCD_DisChCH16_16(16, 64, Matrix004);
LCD_DisChCH16_16(32, 64, Matrix005);
LCD_DisChCH16_16(48, 64, Matrix006);
LCD_DisChCH16_16(64, 64, Matrix007);
LCD_DisChCH16_16(80, 64, Matrix008);
LCD_DisChCH16_16(96, 64, Matrix009);
LCD_DisASCII16_8(112, 64, ASCII_3);
LCD_DisASCII16_8(120, 64, ASCII_7);
LCD_DisASCII16_8(128, 64, ASCII_Dot);
LCD_DisASCII16_8(136, 64, ASCII_2);
LCD_DisASCII16_8(144, 64, du2);
j = 0;
for( i=120; i<240; i = i + 1 )
{
LCD_UpdatePoint(i, 108 - SIN[j], 1);
j++;
if( j>=32 )
j = 0;
}
LCD_DisASCII16_8(16, 80, ASCII_0);
LCD_DisASCII16_8(24, 80, ASCII_Dot);
LCD_DisASCII16_8(32, 80, ASCII_1);
LCD_DisASCII16_8(40, 80, ASCII_2);
LCD_DisASCII16_8(48, 80, ASCII_3);
LCD_DisASCII16_8(56, 80, ASCII_4);
LCD_DisASCII16_8(64, 80, ASCII_5);
LCD_DisASCII16_8(72, 80, ASCII_6);
LCD_DisASCII16_8(80, 80, ASCII_7);
LCD_DisASCII16_8(88, 80, ASCII_8);
LCD_DisASCII16_8(96, 80, ASCII_9);
LCD_DisChCH16_16(104, 80, du);
}
/**********BEGIN OF ChCHAR_Sort()**********************************************/
#if ChCHAR_Sort_EN > 0 // 条件编译.
uint16 ChCHAR[256];
uint16 ChCHAR_FreQ[256];
/****************************************************************************
** 函数名称: ChCHAR_Sort()
** 功能描述: 对输入的汉字字符串计算单个汉字出现的频率,按照多少通过串口输出.
** 入口参数: str: 要显示的汉字字符串;
** 出口参数: 无
** 全局变量: 无
** 调用模块: 无
** 说明:
****************************************************************************/
void ChCHAR_Sort(const char *str)
{
uint8 i, j, k, ucChNum;
uint8 Indux;
uint16 uiTMP;
uint8 *ucCHAR;
for(i=0; i<=255; i++)
{
ChCHAR[i] = 0;
ChCHAR_FreQ[i] = 0;
}
ucCHAR = str;
i = 0;
ucChNum = 0;
while(*ucCHAR != '\0')
{
ucChNum++;
uiTMP = *ucCHAR << 8;
ucCHAR++;
uiTMP = uiTMP | *ucCHAR;
ucCHAR++;
k = 0;
for(i=0; i<=255; i++)
if(uiTMP == ChCHAR[i])
{
ChCHAR_FreQ[i]++; // 找到相同的汉字.
k = 1;
}
if(k == 0) // 找不到相同的汉字.
for(j=0; j<=255; j++)
if(ChCHAR[j] == 0)
{
ChCHAR[j] = uiTMP; // 在最后添加.
ChCHAR_FreQ[j]++;
}
}
// 对汉字出现的频度计数ChCHAR_FreQ[j]排序,并对字库排序.
for(i=0; i<=(ucChNum-1); i++)
{
k = i;
for(j=i+1; j<=ucChNum; j++)
{
if(ChCHAR_FreQ[j] > ChCHAR_FreQ[i])
{
k = ChCHAR_FreQ[i];
ChCHAR_FreQ[i] = ChCHAR_FreQ[j];
ChCHAR_FreQ[j] = k;
uiTMP = ChCHAR[i];
ChCHAR[i] = ChCHAR[j];
ChCHAR[j] = uiTMP;
}
}
}
}
#endif /* END OF ChCHAR_Sort() */
/**********END OF ChCHAR_Sort()**********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -