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

📄 lcd.c

📁 LED显示 大家看法 搭街坊 豆腐干 广泛
💻 C
字号:
#include "lcd.h"
#include "delaytime.h"
#include "dotarry.h"
#include "uart0.h"

LCD_COM lcdcom ;

/**************************************************************************************
*文件名:LCD延时子函数
*功能:LCD延时子函数
*输入参数:LCD延时time
*输出参数:无
*说明: 
***************************************************************************************/ 
void LCD_SYS_Delay ( uint32 time )
{
    while ( time != 0 ) time--;		

}
/**************************************************************************************
*文件名:LCD初始化
*功能:配置LCD
*主要函数列表:
*修改纪录:
   
*说明:
***************************************************************************************/ 
void LCD_Init ( void )
{     
     LCD_CONTRL;                       /* 配置LCD的控制线 */
     LCD_DATA;                         /* 配置LCD的数据线 */
     LCD_Clr_Con;                      /* LCD的控制线清0 */
     LCD_Clr_Data;                     /* LCD的数据线清0 */
     
     LCD_SYS_Delay ( 1 );

     LCD_POWER_1;                      /* 打开LCD的电源 */
     
     delay_ms ( 1 );
     
     LCD_RSET_1;
  
     LCD_Set_Windows ( 0x07 );
     
     LCD_SetCom ( LCD_COM_DisplayKey,0x00 );
     LCD_SetCom ( LCD_COM_BeginLine,0x00 );
     LCD_Clr_Window (  );
}
/*****************************************************************************************
*文件名:LCD显示数据转化为IO口输出
*功能:显示数据转化为IO口输出
*输入参数:显示数据
*输出参数:无
*说明: 
******************************************************************************************/
void LCD_DoData ( uint8 data )
{
     uint8 i,j;
       
       i = data;
       
       for ( j = 0;j < 8;j++)  
        {
           
            switch ( j )
                 {
                 case 0:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D0_1; 
                      else
                           LCD_D0_0; 
                      break;
                  
                 case 1:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D1_1; 
                      else
                           LCD_D1_0; 
                      break;
                      
                 case 2:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D2_1; 
                      else
                           LCD_D2_0; 
                      break;
                      
                 case 3:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D3_1; 
                      else
                           LCD_D3_0; 
                      break;         
               
                 case 4:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D4_1; 
                      else
                           LCD_D4_0; 
                      break;
                      
                 case 5:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D5_1;
                      else
                           LCD_D5_0; 
                      break;
                      
                case 6:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D6_1;
                      else
                           LCD_D6_0; 
                      break;
                      
                case 7:
                      if ( ( 0x01&i )  == 1 )
                           LCD_D7_1;
                      else
                           LCD_D7_0; 
                      break; 
                      
                default: break;
                }
              
                i = ( i >> 1 );
          }
}
/*****************************************************************************************
*文件名:LCD命令设置
*功能:根据不同的命令执行不同的操作
*输入参数:
*输出参数:无
*说明: 对命令的处理
       1,判断是什么命令
       2,判断后进入相应的处理程序
       3,
******************************************************************************************/
void LCD_SetCom ( LCD_COM lcdcom,uint8 data )
{ 
    uint8 i;
    
    i = data;
   
    switch ( lcdcom )
           {
            case LCD_COM_DisplayKey:
                               i = ( 0x3e | i );
                               LCD_ACOM;  
                               LCD_SYS_Delay ( 1 );
                               LCD_RS_0; 
                               LCD_DoData ( i );
                               LCD_SYS_Delay ( 1 );
                               LCD_E_1;
                               LCD_SYS_Delay ( 5 );
                               LCD_E_0;
                               LCD_SYS_Delay ( 5 );
                               break;
           
           case LCD_COM_BeginLine: 
                               i = ( 0xc0 | i );
                               LCD_ACOM;  
                               LCD_SYS_Delay ( 1 );
                               LCD_RS_0; 
                               LCD_DoData ( i );
                               LCD_SYS_Delay ( 1 );
                               LCD_E_1;
                               LCD_SYS_Delay ( 5 );
                               LCD_E_0;
                               LCD_SYS_Delay ( 5 );
                               break;
           
           case LCD_COM_SetXAddr:
                               i = ( 0xb8 | i );
                               LCD_ACOM;  
                               LCD_SYS_Delay ( 1 );
                               LCD_RS_0; 
                               LCD_DoData ( i );
                               LCD_SYS_Delay ( 1 );
                               LCD_E_1;
                               LCD_SYS_Delay ( 5 );
                               LCD_E_0;
                               LCD_SYS_Delay ( 5 );
                               break;
           
           case LCD_COM_SetYAddr: 
                               i = ( 0x40 | i ); 
                               LCD_ACOM;  
                               LCD_SYS_Delay ( 1 );
                               LCD_RS_0; 
                               LCD_DoData ( i );
                               LCD_SYS_Delay ( 1 );
                               LCD_E_1;
                               LCD_SYS_Delay ( 5 );
                               LCD_E_0;
                               LCD_SYS_Delay ( 5 );
                               break;
           
           case LCD_COM_WRData:                        
                               LCD_ACOM;  
                               LCD_SYS_Delay ( 1 );
                               LCD_RS_1; 
                               LCD_DoData ( i );
                               LCD_SYS_Delay ( 1 );
                               LCD_E_1;
                               LCD_SYS_Delay ( 5 );
                               LCD_E_0;
                               LCD_SYS_Delay ( 5 ); 
                               break;
           
           case LCD_COM_REData:   
                               break;
           
           default: break;
           }
}
/**************************************************************************************
*文件名:LCD全屏清O
*功能:LCD全屏清O
*主要函数列表:
*修改纪录:
   
*说明:
***************************************************************************************/ 
void LCD_Clr_Window ( void )
{
  uint8 i,j;
  for( i = 0; i < 8; i++ )
  {  
   LCD_SetCom ( LCD_COM_SetXAddr,i );
   LCD_SetCom ( LCD_COM_SetYAddr,0x00 );
   for( j=0; j<64; j++ ) 
      {
      LCD_SetCom ( LCD_COM_WRData,0x00 );
      }
  } 
}
/**************************************************************************************
*文件名:设置显示器显示区域
*功能:设置显示器显示区域
*输入参数列表;显示的区域数值
*输出参数列表:无
*主要函数列表:
*修改纪录:
   
*说明:显示的区域数值是根据"area"的底3位判断;
      如果显示左边,右边的屏幕,则数据是xxxx1011,也就是xxxx1101,要显示的屏对应的数值为1,
      第3位是表示是否选择屏幕显示区域
***************************************************************************************/
void LCD_Set_Windows ( uint8 area )
{
    uint8 i,j;  
    
    i = ( 0x07 & area );

    for ( j = 0; j < 3; j ++ )
      {
    
    switch  ( j )
          {
          case 0: 
               if ( ( 0x01 & i ) == 1 )
               LCD_CS3_0;
               else
               LCD_CS3_1;
               break;
               
          case 1: 
               if ( ( 0x01 & i ) == 1 )
               LCD_CS2_0;
               else
               LCD_CS2_1;
               break;
               
          case 2: 
               if ( ( 0x01 & i ) == 1 )
               LCD_CS1_0;
               else
               LCD_CS1_1;
               break;
               
          default: break;
          }
         i = ( i >> 1 );
      }           
}
/**************************************************************************************
*文件名:LCD写显示数据
*功能:LCD写数据
*输入参数列表;
*输出参数列表:无
*主要函数列表:
*修改纪录:
   
*说明:
***************************************************************************************/
void LCD_WR_Data ( uint8 x_addr,uint8 y_addr,uint8 x_num,uint8 y_num,uint8 *displaydata )
{
   uint8 i,j;
   
   for( i = 0; i < x_num; i++ )
     {  
     LCD_SetCom ( LCD_COM_SetXAddr,( x_addr + i ) );
     LCD_SetCom ( LCD_COM_SetYAddr,y_addr );
      for( j = 0; j < y_num; j++ ) 
         {
         LCD_SetCom ( LCD_COM_WRData,*displaydata );
         displaydata++;
         }
     }  
}
/**************************************************************************************
*文件名:LCD显示
*功能:LCD显示
*输入参数列表;显示数值
*输出参数列表:无
*主要函数列表:
*修改纪录:   
*说明:对于输入的LCD显示参数,x_addr,y_addr,x_num,y_num有一定的输入关系
      由于LCD的是192x64的
      
***************************************************************************************/
void LCD_Display ( uint8 x_addr,uint8 y_addr,uint8 x_num,uint8 y_num,uint8 *displaydata )
{
    uint8 y,i,j,k,m; 
    uint8 count;
      
    if ( ( y_addr >= 64 ) )       
       {
       if ( ( y_addr <= 127 ) )
          {
          y_addr = y_addr - 64;
          y = y_addr + y_num;
              if ( ( y >= 1 ) & ( y <= 64 ) )
                 {
                 LCD_Set_Windows ( 0x02 );
                 LCD_WR_Data ( x_addr,y_addr,x_num,y_num,displaydata );
                 }
              else
                 {
                 if ( ( y >= 65 ) & ( y <= 128 ) )
                    {
                     count = 0;

                   for ( i = x_addr; i < ( x_addr + x_num ); i ++ )  
                     {            
                     j = 64 - y_addr;
                     LCD_Set_Windows ( 0x02 );
                     LCD_WR_Data ( i,y_addr,1,j,( displaydata + count ) ); 
                     
                     k = y_num - j;
                     LCD_Set_Windows ( 0x01 );
                     LCD_WR_Data ( i,0x00,1,k,( displaydata + count + j ) );
                 
                     count = count + y_num;  
                     }
                   }
            }
         }
        else if ( ( y_addr >= 128 ) & ( y_addr <= 191 ) )
                {
                y_addr = y_addr - 128;
                LCD_Set_Windows ( 0x01 );
                LCD_WR_Data ( x_addr,y_addr,x_num,y_num,displaydata );
                }
       }     
    
    else if ( ( y_addr <= 63 ) )
       {
       y = y_addr + y_num;
 
       if ( ( y >= 1 ) & ( y <= 64) )
          {
          LCD_Set_Windows ( 0x04 );
          LCD_WR_Data ( x_addr,y_addr,x_num,y_num,displaydata ); 
          }
       else
         {
          if ( ( y >= 65 ) & ( y <= 128 ) )
             {
             count = 0;

             for ( i = x_addr; i < ( x_addr + x_num ); i ++ )  
                 {            
                 j = 64 - y_addr;
                 LCD_Set_Windows ( 0x04 );
                 LCD_WR_Data ( i,y_addr,1,j,( displaydata + count ) ); 
                 
                 k = y_num - j;
                 LCD_Set_Windows ( 0x02 );
                 LCD_WR_Data ( i,0x00,1,k,( displaydata + count + j ) );
                 
                 count = count + y_num;  
                 }  
             }
          else if ( ( y >= 129 ) & ( y <= 192 ) )
               {
              count = 0;
    
              for ( i = x_addr; i < ( x_addr + x_num ); i ++ )   
                 {           
                 j = 64 - y_addr;
                 LCD_Set_Windows ( 0x04 );
                 LCD_WR_Data ( i,y_addr,1,j,( displaydata + count ) ); 
                 
                 k = 64;
                 LCD_Set_Windows ( 0x02 );
                 LCD_WR_Data ( i,0x00,1,k,( displaydata + count + j ) );
                 
                 m = y_num - ( j + k );
                 LCD_Set_Windows ( 0x01 );
                 LCD_WR_Data ( i,0x00,1,m,( displaydata + count + j + k ) );
                 
                 count = count + y_num;  
                 }
              }
         }
    }
}
/**************************************************************************************
*文件名:LCD显示输出
*功能:LCD显示输出
*输入参数列表;显示数值
*输出参数列表:无
*主要函数列表:
*修改纪录:   
*说明:     
***************************************************************************************/
void LCD_Output_Windows ( uint8 *outputdata )
{
      //uint8 i,j;
      uint8 count;
      
      count = 0;
     /* 
      for ( i = 0; i < 2; i++)
      {
        for ( j = 0; j < 5; j ++ )
            {
            LCD_Display ( i,0x00 + j*16,1,16,outputdata  + j*32 );
            }
      }
      */
      
      LCD_Display ( 0,64,1,16,outputdata );
      LCD_Display ( 0,80,1,16,outputdata + 32 );
      LCD_Display ( 0,96,1,16,outputdata + 64 );
      LCD_Display ( 0,112,1,16,outputdata + 96 );
      LCD_Display ( 0,128,1,16,outputdata + 128 );
      
      LCD_Display ( 1,64,1,16,outputdata + 16 );
      LCD_Display ( 1,80,1,16,outputdata + 48 );
      LCD_Display ( 1,96,1,16,outputdata + 80 );
      LCD_Display ( 1,112,1,16,outputdata + 112 );
      LCD_Display ( 1,128,1,16,outputdata + 144 );
	   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -