/************************************************
************************************************/
#include "config.h"
/******************************************************************
lcd初始化后的延时
*******************************************************************/
void delay_lcd(void)
{
unsigned char i=200;
unsigned char j=0;
for(j=0;j<6;j++)
{
while(i--);
}
}
/******************************************************************
向lcd写入1B的数据或者命令
首先要传送5个bit的1,起始位,flag=1为命令传送,5个bit的1起始位后面接着为000
flag=0为数据传送,5个bit的1起始位后面接着为010
*******************************************************************/
void wr_lcd(unsigned char data,unsigned char flag)
{
unsigned char i,j,k;
CLR_LCD_SCLK; //clock清零
SET_LCD_STD; //data置1
for(i=0;i<5;i++) //首先要传送5个bit的1,起始位
{
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
if(flag) //flag=1为命令传送,5个bit的1起始位后面接着为000
{
CLR_LCD_STD; //清零数据线,传送3个bit的0
for(i=0;i<3;i++)
{
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
}
else //flag=0为数据传送,5个bit的1起始位后面接着为010
{
CLR_LCD_STD; //传送一位0
SET_LCD_SCLK;
CLR_LCD_SCLK;
SET_LCD_STD; //传送一位1
SET_LCD_SCLK;
CLR_LCD_SCLK;
CLR_LCD_STD; //传送一位0
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
k=0x80; //后面传送信息的时候用来取得特定的位
for(j=0;j<2;j++)//每一个八位的指令将被分为两个字节接收到:
//较高4位的指令资料将会被放在第一个字节的MSB部分
//而较低4位(DB3~DB0)的指令资料则会被放在第二个字节的MSB部分
//至于相关的另四位则都为0。
{
for(i=0;i<4;i++)
{
if(data&k) //如果相应的位为高
{
SET_LCD_STD; //传送一位1
}
else //如果相应的位为低
{
CLR_LCD_STD; //传送一位0
}
k>>=1;
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
CLR_LCD_STD; //传送4位0
for(i=0;i<4;i++)
{
SET_LCD_SCLK;
CLR_LCD_SCLK;
}
}
//CLR_LCD_SCLK;
CLR_LCD_STD;
}
/******************************************************************
lcd初始化
*******************************************************************/
void initial_lcd(void)
{
LCD_DDR |= (1<<LCD_STD)|(1<<LCD_SCLK);
wr_lcd(Lcd_Set_Function_Basic,1); //指令集设定
wr_lcd(Lcd_Set_Entrance_Point+2,1); //光标右移
wr_lcd(Lcd_Display_Status+4,1); //整屏显示
wr_lcd(Lcd_Clear,1); //clear the screen
delay_lcd();
}
/*********************************************************************************************************
绘制bmp图片
********************************************************************************************************/
void Lcd_drawbmp(const unsigned char *bmp)
{
unsigned char i,j;
Lcd_clrbmp();
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend,1);
for(i=0;i<32;i++)
{
for(j=0;j<8;j++)
{
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend+2,1);
wr_lcd(0x80+i,1);
wr_lcd(0x80+j,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(*bmp++,0);
wr_lcd(*bmp++,0);
}
}
for(i=0;i<32;i++)
{
for(j=8;j<16;j++)
{
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend+2,1);
wr_lcd(0x80+i,1);
wr_lcd(0x80+j,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(*bmp++,0);
wr_lcd(*bmp++,0);
}
}
wr_lcd(0x36,1);
wr_lcd(Lcd_Set_Function_Basic,1); //30H--基本指令操作
}
/*********************************************************************************************************
清除bmp图片
********************************************************************************************************/
void Lcd_clrbmp(void)
{
unsigned char i,j;
// wr_lcd(Lcd_Clear,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend,1);
for(i=0;i<32;i++)
{
for(j=0;j<16;j++)
{
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(Lcd_Set_Function_Extend+2,1);
wr_lcd(0x80+i,1);
wr_lcd(0x80+j,1);
wr_lcd(Lcd_Set_Function_Basic+2,1);
wr_lcd(0x00,0);
wr_lcd(0x00,0);
}
}
wr_lcd(0x36,1);
wr_lcd(Lcd_Set_Function_Basic,1); //30H--基本指令操作
}
/*********************************************************************************************************
清除一行的显示
*******************************************************************************************************/
void Lcd_lineclr(unsigned char row)
{
unsigned char i;
switch(row)
{
case 1:
{
wr_lcd(Lcd_Set_Ddram,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
case 2:
{
wr_lcd(Lcd_Set_Ddram+0x10,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
case 3:
{
wr_lcd(Lcd_Set_Ddram+0x08,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
case 4:
{
wr_lcd(Lcd_Set_Ddram+0x18,1);
for(i=0;i<16;i++) wr_lcd(' ',0);
break;
}
default: break;
}
}
/*********************************************************************************************************
在一行中显示
*******************************************************************************************************/
void Lcd_linedisp(unsigned char *p,unsigned char row)
{
unsigned char i;
switch(row)
{
case 1:
{
Lcd_lineclr(1);
wr_lcd(Lcd_Set_Ddram,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
case 2:
{
Lcd_lineclr(2);
wr_lcd(Lcd_Set_Ddram+0x10,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
case 3:
{
Lcd_lineclr(3);
wr_lcd(Lcd_Set_Ddram+0x08,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
case 4:
{
Lcd_lineclr(4);
wr_lcd(Lcd_Set_Ddram+0x18,1);
for(i=0;i<16;i++) wr_lcd(p[i],0);
break;
}
}
}
/*********************************************************************************************************
unsigned char row 要反白显示的行 row=0,1行3行反白显示 row=1,二行四行反白显示
*******************************************************************************************************/
void Lcd_backwhite(unsigned char line)
{
wr_lcd(Lcd_Set_Function_Extend,1);
wr_lcd(Lcd_Back_White+line,1);
wr_lcd(Lcd_Set_Function_Basic,1);
}
评论0