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

📄 main.c

📁 ARM程序
💻 C
字号:
#include "config.h"  
#define LCD_DI   0x1<<20                    // 定义LCM12864的RS控制线
#define LCD_RW    0x1<<21                    // 定义LCM12864的RW控制线
#define LCD_E     0x1<<22                    // 定义LCM12864的E控制线
#define LCD_CS1   0x1<<23                    // 定义LCM12864的CS1控制线 
#define LCD_CS2   0x1<<24                    // 定义LCM12864的CS2控制线
#define LCD_RESET 0x1<<25                    // 定义LCM12864的RESET控制线
#define LCD_LEDK  0x1<<26                    // 定义LCM12864的LEDK(BLK)控制线
                   
#define     LCD_DB7_DB0    0xFF<<8	

#define LCD_DISP_ON            0x3f        
#define LCD_DISP_OFF           0x3e         
#define LCD_START_ROW          0xc0   //显示起始行0,可以用LCM12864_START_ROW+x设置起始行。(x<64)       
#define LCD_PAGE_START_ADDR    0xb8   // 页起始地址,可以用LCM12864_PAGE_START_ADDR+x设置当前页。(x<8)      
#define LCD_COL_START_ADDR     0x40   //列起始地址,可以用LCM12864_COL_START_ADDR+x设置当前列。(x<64)
 #define LCD_STATUS_BUSY        0x80          // LCM12864忙状态屏蔽码
#define LCD_STATUS_DISP_OFF    0x20          // LCM12864显示关闭状态屏蔽码
#define LCD_STATUS_REST        0x10          // LCM12864复位状态屏蔽码
uint8 huan1[]={      
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};

/********************************************************************************************
* 函数名称:Delay()
* 功    能:软件延时
* 入口参数:count    延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
  uint8 i;                

  while(--count != 0)        
    {
     for(i = 0;i < 125; i++);               
   }                               
}
/********************************************************************************************
* 函数名称:LCM12864_TestBusy()
* 功    能:LCM12864测忙函数
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCD_TestBusy(void)
{
  IO0SET=LCD_RW; 
  IO0CLR=LCD_DI;
  IO0SET=LCD_E;
  Delay(1);
  while(((IO0PIN&LCD_DB7_DB0)>>8) & LCD_STATUS_BUSY);
}

//写命令
//*********************************************************************************************/
void wcodel(uint8 code)
{ 
   IO0CLR=LCD_RW; 
   IO0CLR=LCD_DI; 
   IO0SET=code<<8;
   IO0CLR=((~code)<<8)&LCD_DB7_DB0;
   IO0SET=LCD_E;
   Delay(1);
   IO0CLR=LCD_E;
}
/********************************************************************************************
写数据
*********************************************************************************************/
void wdata1(uint8 data)
{ 
   IO0CLR=LCD_RW; 
   IO0SET=LCD_DI; 
   IO0SET=data<<8;
   IO0CLR=((~data)<<8)&LCD_DB7_DB0; 
   IO0SET=LCD_E;
   Delay(1);
   IO0CLR=LCD_E;
}
/********************************************************************************************
空读一次 从LCD读一字节数据
*********************************************************************************************/
uint8 Readwdata1(void)
 {    uint8 data;
     IO0SET=LCD_RW; 
     IO0SET=LCD_DI; 
     IO0SET=LCD_E;
     /* 按LCM12864数据手册,先空读一次 */
     data = (IO0PIN&LCD_DB7_DB0)>>8;
     LCD_TestBusy();
     /* 按LCM12864数据手册,再读一次 */
     data = (IO0PIN&LCD_DB7_DB0)>>8;
     LCD_TestBusy();
     IO0CLR=LCD_E;
     return data;
 }
/********************************************************************************************
向LCD指定点写一字节数据。
*********************************************************************************************/
void Write1_x_y(uint8 x,uint8 y,uint8 data)
{    
     /* 参数过滤 */
  x = x&0x7f;                         
  y = y&0x3f;
     IO0CLR=LCD_CS1; 
     IO0CLR=LCD_CS2; 
     if(x<64)                                
      { 
         IO0SET=LCD_CS1;                          
      }
      else
      { 
         IO0SET=LCD_CS2;                         
         x = x-64;
      }
       wcodel(LCD_COL_START_ADDR+x);  // 设置当前列地址,即x坐标
       wcodel(LCD_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
       wdata1(data);             
} 
/********************************************************************************************
从LCD指定点上读取一字数据
*********************************************************************************************/
uint8 Read1_x_y(uint8 x,uint8 y)
 {  
       uint8 data;
       /* 参数过滤 */
       x = x&0x7f;                         
       y = y&0x3f;
       IO0CLR=LCD_CS1; 
       IO0CLR=LCD_CS2; 
       if(x<64)                                
          { 
             IO0SET=LCD_CS1;                        
          }
        else
          { 
             IO0SET=LCD_CS2;                       
               x = x-64;
          }
         wcodel(LCD_COL_START_ADDR+x);  // 设置当前列地址,即x坐标
         wcodel(LCD_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
         data=Readwdata1();
         return data;                
} 
/********************************************************************************************
LCD初始化
*********************************************************************************************/
void LCD_Init(void)
{
  IO0CLR=LCD_RESET;
  IO0SET=LCD_RESET;
  IO0SET=LCD_CS1; 
  IO0SET=LCD_CS2;
  wcodel(LCD_DISP_OFF);
  wcodel(LCD_PAGE_START_ADDR+0);
  wcodel(LCD_START_ROW+0);
  wcodel(LCD_COL_START_ADDR+0);
  wcodel(LCD_DISP_ON);
  //IO0SET=LCD_LEDK; 
  //IO0CLR=LCD_LEDK;
}
/********************************************************************************************
向LCD填充数据
*********************************************************************************************/
void LCD_Fill_Screen(uint8 LCD_FillData)
{
  uint8 x,y;
  IO0SET=LCD_CS1;
  IO0SET=LCD_CS2;                       
  wcodel(LCD_START_ROW+0);            
  for(x=0;x<8;x++)
 {
   wcodel(LCD_PAGE_START_ADDR+x);   
   wcodel(LCD_COL_START_ADDR);     
     for(y=0;y<64;y++) 
      wdata1(LCD_FillData);
  }

  IO0CLR=LCD_CS2;                                  
}
/********************************************************************************************
* 函数名称:LCM12864_Clear_Screen()
* 功    能:LCM12864清屏
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCD_Clear_Screen(void)
{
  LCD_Fill_Screen(0x55);
}

/********************************************************************************************
在LCD的指定点上显示16*16点阵汉字
*********************************************************************************************/
void LCD_Disp_Chinese_16_16(uint8 LCD_page,uint8 LCD_col, uint8 *Chinese_16_16)
{
  uint8 j=0,i=0;
  for(j=0;j<2;j++)
     {
   wcodel(LCD_PAGE_START_ADDR+LCD_page+j);
   wcodel(LCD_COL_START_ADDR+LCD_col);
   for(i=0;i<16;i++) 
     wdata1(Chinese_16_16[16*j+i]);
     }
}
/********************************************************************************************
* 函数名称:LCM12864_Frame()
* 功    能:在LCM12864上显示最大尺寸的边框
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCM12864_Frame(void)
{
  uint8 i;
  IO0SET=LCD_CS1; 
  IO0SET=LCD_CS2;
  wcodel(LCD_PAGE_START_ADDR+0);
  wcodel(LCD_COL_START_ADDR+0);
  for(i=0;i<64;i++) wdata1(0x01);
  
  wcodel(LCD_PAGE_START_ADDR+7);
  wcodel(LCD_COL_START_ADDR+0);
  
  for(i=0;i<64;i++){
  wdata1(0x80);
   }
  for(i=0;i<8;i++)
 {
   IO0CLR=LCD_CS1; 
   IO0SET=LCD_CS2;
   wcodel(LCD_PAGE_START_ADDR+i);
   wcodel(LCD_COL_START_ADDR+63);
   wdata1(0xff);
   IO0SET=LCD_CS1; 
   IO0CLR=LCD_CS2;
   wcodel(LCD_PAGE_START_ADDR+i);
   wcodel(LCD_COL_START_ADDR+0);
   wdata1(0xff);
 }
}
/********************************************************************************************
* 函数名称:main()
* 功    能:LCD12864液晶模块驱动演示。
******************************************************************************************/
int main(void)
{
    PINSEL0=0;
    PINSEL1=0;
    IO0DIR=~0;
    LCD_Init();                         // LCM12864初始化
    LCD_Clear_Screen();
  while(1)
      {
       LCD_Init(); 

        IO0SET=LCD_CS1; 
        IO0CLR=LCD_CS2;
        LCD_Disp_Chinese_16_16(1,0,huan1); 
   
       }
}

⌨️ 快捷键说明

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