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

📄 panel.c

📁 基于MST-G240128点阵液晶的 状态机机制 人机界面四级滚屏菜单 源代码 ,带时间片机制模拟操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
* 名称: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 + -