📄 lcm12864zk.c
字号:
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 + -