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

📄 lcm12864zk.c

📁 ST7920液晶显示控制器的驱动编程
💻 C
📖 第 1 页 / 共 2 页
字号:
		   else if(row==4) 
			 break; 
           }
  }
 return(i);
}
/*
*************************************************************************************************************
- 函数名称 : void Lcd_clr_row(uint8 row)
- 函数说明 : LCM行清零
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/     
void Lcd_clr_row(uint8 row)
{uint8 i,y; 
 switch(row)
     {case 1:{y=0x80;break;}
      case 2:{y=0x90;break;}
      case 3:{y=0x88;break;}
      case 4:{y=0x98;break;}
     }
 Write_command(y); 
 for(i=16;i!=0;i--)
     Write_data(0x20);   
} 
/*
*************************************************************************************************************
- 函数名称 :void Lcm_hard_init(void)
- 函数说明 : LCD硬件初始化函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/          	      
void Lcm_hard_init(void)
{ PINSEL0&=(~0xc0000000);/*P0.15 为通用IO */
   PINSEL1&=(~0x0000000c);/*p0.17为通用IO */
   IO0DIR|=0x00028000;/*P0.15、P0.17为输出*/
   PINSEL2&=(~0x00000008);/*P1.20作为通用IO口*/
   PINSEL2|=0x00000030;/*P2.0-P2.15作为通用IO */
   IO1DIR|=0x00100000;/*P1口设置为P1.20输出*/
   IO2DIR|=0x000007ff;/*P2口设置为P2.0-10输出*/
   PINSEL2|=0x00000030;
   IO2DIR|=0x00000001;/*背光p2.0值为输出*/
   IO0SET|=PSB;
   IO0SET|=RST;
   Lcd_init();
}
/*
*************************************************************************************************************
- 函数名称 :void guangbiao(uint8 a,uint8 b);
- 函数说明 : 显示光标
- 输入参数 : a当前光标位置  b以前光标位置
- 输出参数 : 无
*************************************************************************************************************
*/ 
void guangbiao(uint8 a,uint8 b)
{ switch(b)
     {case 1:Write_command(0x80);break;
      case 2:Write_command(0x90);break;
      case 3:Write_command(0x88);break;
      case 4:Write_command(0x98);break;
     }
  Write_data(0x20);
  switch(a)
     {case 1:Write_command(0x80);break;
      case 2:Write_command(0x90);break;
      case 3:Write_command(0x88);break;
      case 4:Write_command(0x98);break;
     }
  Write_data(16);
}   
/*
*************************************************************************************************************
- 函数名称 :void backlights(uint8 st)
- 函数说明 : LCD背光开启关闭函数
- 输入参数 : st    1开启 0关闭
- 输出参数 : 无
*************************************************************************************************************
*/     
 void backlights(uint8 st)
 {if(st==1)
 	IO2SET|=0x00000001;
   else 
       IO2CLR|=0x00000001;
 }
/*
*************************************************************************************************************
- 函数名称 :void Graphy_display(uint8 h,uint8 v,uint8 *p)
- 函数说明 : 图形显示函数
- 输入参数 : 
- 输出参数 : 无
*************************************************************************************************************
*/ 
void disply_ModeAmend(uint8 mode)
{if(mode==0)
   {Write_command(0x30);/*功能设置---8BIT控制界面,基本指令集*/
    Write_command(0x30);
   }
 else
   {Write_command(0x34);
    Write_command(0x34);/*功能设置---8BIT控制界面,扩充指令集*/ 
   }
}
void Graphy_clr(void)
{uint8 i,j;
 Write_command(0x34);/*功能设置---8BIT控制界面,扩充指令集*/
 Write_command(0x34);
 for(i=0;i<32;i++)           //12864实际为256x32
     {Write_command(0x80|i); //行位置
      Write_command(0x80);   //列位置
      for(j=0;j<32;j++)      //256/8=32 byte
      //列位置每行自动增加
      Write_data(0);
     }
 disply_ModeAmend(0);
} 
void Graphy_set(void)
{uint8 i,j;
 Write_command(0x34);/*功能设置---8BIT控制界面,扩充指令集*/
 Write_command(0x34);
 Write_command(0x36);
 for(i=0;i<32;i++)           //12864实际为256x32
     {Write_command(0x80|i); //行位置
      Write_command(0x80);   //列位置
      for(j=0;j<32;j++)      //256/8=32 byte
      //列位置每行自动增加
      Write_data(0xff);
     }
} 

/*
*************************************************************************************************************
- 函数名称 :void Graphy_display(uint8 h,uint8 v,uint8 *p)
- 函数说明 : 图形显示函数
- 输入参数 : h(1~4),l(1~8),bytes(can not overflow)
- 输出参数 : 无
*************************************************************************************************************
*/  
void Graphy_display(uint h,uint l,uint8 bytes)
{/*set to extern command*/
 uint8 i,j,row,line;
 
 uint8 disp[]="您好!";
 Lcd_init();
 Lcd_clr();
 Delay_Lcd(20);
 Lcd_dispp(disp,4,2,sizeof(disp)-1);

 disply_ModeAmend(1);
 Graphy_clr();
 Write_command(0x36);/*功能设置---8BIT控制界面,绘图显示ON*/
 if(h==1||h==3)
    row=0;
 else 
    row=16;
 if(h==1|h==2)
    line=l-1;
 else line=(7+l);
 for(i=row;i!=(row+16);i++)            //12864实际为256x32
     {
      Write_command(0x80|i); //行位置(0~31)
      Write_command(0x80|line);     //列位置(0~31)
      for(j=0;j<bytes;j++)       //256/8=32 byte
      //列位置每行自动增加
          Write_data(0xff);
     }
 disply_ModeAmend(0);
// Lcd_dispp(disp,2,5,sizeof(disp)-1);
}
/*******************************************************************
;************显示的图形大小为128*64*********************************
;************超出后显示不正确***************************************
********************************************************************/
void Graphy(uint8 lenth,uint8 width,uint8 row,uint8 line,uint8 *p)/*display 128*64 picture*/
{uint8 i,j,row_disp;                                              //12864实际为256x32 
 uint16 t;
 disply_ModeAmend(1);
 Graphy_clr();
 Write_command(0x36);/*功能设置---8BIT控制界面,绘图显示ON*/
 t=0;
 if(row<32)//上半屏显示
   {i=row-1;//上屏行处理
    while(1)
    {if(i==32||i==width+row-1)break;/*当超出上屏或者显示完图形宽度退出*/
     Write_command(0x80|i);   //行位置(0~31)
     Write_command(0x80|(line-1));     //列位置(0~15)
     j=0;
     while(1)      //256/8=32 byte
         //列位置每行自动增加
         {if(j==(lenth/8-(line-1)*2))break;//当超出最后一列图形没有显示完,未显示的丢掉
          Write_data(*(p+j+t));
          j++;
         }
     t+=lenth/8;
     i++;
    }
   row_disp=i-(row-1);//已经显示行数
   }
 if(row<32&&width>row_disp)//下半屏显示(如果上半屏没有显示完所有图形)
    {i=0;//下屏行处理
     while(1)
         {if(i==width-row_disp||i==32)break;//当超出32行或者有效图形范围显示完则退出
          Write_command(0x80|i); //行位置(0~31)
          Write_command(0x80|(7+line));//列位置(0~15)
          j=0;
          while(1)      //256/8=32 byte
              //列位置每行自动增加
             {if(j==(lenth/8-(line-1)*2))break;//当超出最后一列图形没有显示完,未显示的丢掉
              Write_data(*(p+j+t));
              j++;
             }
          t+=lenth/8;
          i++;
         }
    }
 else if(row>=32)
    {i=row-32;//下屏行处理
     while(1)
         {if(i==width||i==32)break;//当超出32行或者有效图形范围显示完则退出
          Write_command(0x80|i); //行位置(0~31)
          Write_command(0x80|(7+line));//列位置(0~15)
          j=0;
          while(1)      //256/8=32 byte
              //列位置每行自动增加
             {if(j==(lenth/8-(line-1)*2))break;//当超出最后一列图形没有显示完,未显示的丢掉
              Write_data(*(p+j+t));
              j++;
             }
          t+=lenth/8;
          i++;
         }
    }
disply_ModeAmend(0);
}
/*
*************************************************************************************************************
- 函数名称 :void Character_Generate(uint8 address,uint8 *p)
- 函数说明 : 造字函数
- 输入参数 : 
- 输出参数 : 无
*************************************************************************************************************
*/
void Character_Generate(uint8 address,uint8 *p,uint8 mode)//仅仅是造字,对于显示还须写DDRAM(这时只须写相应编码到DDRAM即可)
{uint8 i;
 if(mode==1)//在0000h位置造字(即编码0000h)
   Write_command(0x40|address);
 else if(mode==2)
   Write_command(0x50|address);
 else if(mode==3)
   Write_command(0x60|address);
 else if(mode==4)
   Write_command(0x70|address);
 for(i=0;i!=32;i++)
     Write_data(*(p+i));
}
/*
*************************************************************************************************************
- 函数名称 :void Character_Generate_disp(uint8 address,format)
- 函数说明 : 造字函数的显示
- 输入参数 : 
- 输出参数 : 无
*************************************************************************************************************
*/
void Character_Generate_disp(uint8 row,uint8 line,uint8 format)
{uint8 y;
 switch(row)
     {case 1:{y=0x80+(--line);break;}
      case 2:{y=0x90+(--line);break;}
      case 3:{y=0x88+(--line);break;}
      case 4:{y=0x98+(--line);break;}
     }
 
  Write_command(y); /* 定位显示起始地址*/
  if(format==1)//在0000h位置造字(即编码0000h)
     {Write_data(0x00);
      Write_data(0x00);
     }
  else if(format==2)//在0002h位置造字(即编码0002h)
     {Write_data(0x00);
      Write_data(0x02);
     }
  else if(format==3)//在0004h位置造字(即编码0004h)
     {Write_data(0x00);
      Write_data(0x04);
     }
  else if(format==4)//在0006h位置造字(即编码0006h)
     {Write_data(0x00);
      Write_data(0x06);
     }
}
void Grapy_sifte(uint8 mode)//左右移动屏幕
{if(mode==0)
 Write_command(0x1c);
 else
 Write_command(0x18);
}
void Grapy_Scroll(uint8 addr)//上滚屏幕
{
 disply_ModeAmend(1);
 Write_command(0x34);
 Write_command(0x03);
    
 Write_command(0x40|addr);
 disply_ModeAmend(0);
 Delay_Lcd(200);
}

⌨️ 快捷键说明

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