压缩包里面12864.H包含相应的函数声明,可以根据自己情况来选择是否反白,是否采用串口操作12864.C是函数实现
PORT.H包含12864里面的IO口声明
SYS.H和sys.c里面包括12864里面所需的延时函数,针对不同的平台可自己做优化。
单片机源程序如下:
- #include<LCD12864.H>
- #if TRANSMISSION_MODE
- //以下为串行传输方式
- void LCD12864_PortInit()
- {
- }
- void Lcd12864_SendByte(u8 byte)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- if((byte&0x80) == 0x80)
- LCD_SDA_SET();
- else
- LCD_SDA_CLR();
- LCD_SCL_SET();
- byte <<=1;
- LCD_SCL_CLR();
- }
- }
- void Lcd12864_Write_Com(unsigned char dataa)
- {
- u8 Hdata,Ldata;
- Hdata=dataa&0xf0;
- Ldata=(dataa<<4)&0xf0;
- Lcd12864_SendByte(0xf8);
- Lcd12864_SendByte(Hdata);
- Lcd12864_SendByte(Ldata);
- }
- void Lcd12864_Write_Data(unsigned char dataa)
- {
- u8 Hdata,Ldata;
- Hdata=dataa&0xf0;
- Ldata=(dataa<<4)&0xf0;
- Lcd12864_SendByte(0xfa);
- Lcd12864_SendByte(Hdata);
- Lcd12864_SendByte(Ldata);
- }
- void Lcd12864_Init(void)
- {
- LCD12864_PortInit();
- Lcd12864_Write_Com(0x30);
- delay_ms(2);
- Lcd12864_Write_Com(0x0c);
- delay_ms(2);
- Lcd12864_Write_Com(0x01);
- delay_ms(2);
- delay_ms(2);
- delay_ms(2);
- delay_ms(2);
- delay_ms(2);
- }
- void Lcd12864_Set_Address(u8 x,u8 y)
- {
- switch(x)
- {
- case 0:Lcd12864_Write_Com(0x80+y);break;
- case 1:Lcd12864_Write_Com(0x90+y);break;
- case 2:Lcd12864_Write_Com(0x88+y);break;
- case 3:Lcd12864_Write_Com(0x98+y);break;
- }
- }
- void Lcd12864_Write_Sring(char *p)
- {
- while(*p!='\0')
- {
- Lcd12864_Write_Data(*p);
- p++;
- }
- }
- #if SET_WHITE
- /******************************************************
- * 功能:反白初始化 *
- * 输入:无 *
- * 返回:无 *
- ******************************************************/
- void Lcd12864_SetWhite_Init(void)
- {
- u8 i,j;
- Lcd12864_Write_Com(0x36); //写GDRAM是扩展操作指令
- for(i=0;i<32;i++) //对GDRAM进行清屏操作
- {
- Lcd12864_Write_Com(0x80+i); //先写入水平做坐标值
- Lcd12864_Write_Com(0x80); //写入垂直坐标值
- for(j=0;j<16;j++) //写入两个8位元的数据
- {
- Lcd12864_Write_Data(0x00);
- Lcd12864_Write_Data(0x00);
- }
- }
- Lcd12864_Write_Com(0x36);
- Lcd12864_Write_Com(0x32); //开GPRAM显示、关基本指令
- }
- /******************************************************
- * 功能:设置一行16*16字符反白 *
- * 输入: --> y 反白行 *
- * --> x 开始反白列 *
- * --> endx 结束反白列 *
- * 返回:无 *
- ******************************************************/
- void Lcd12864_Set1616White(u8 y,u8 x,u8 endx)
- {
- u8 i,j,white_x,white_y,white_endx;
- white_endx = endx-x+1;
- switch(y)
- {
- case 0:
- white_x = 0x80+x;
- white_y = 0x80;
- break;
- case 1:
- white_x = 0x80+x;
- white_y = 0x90;
- break;
- case 2:
- white_x = 0x88+x;
- white_y = 0x80;
- break;
- case 3:
- white_x = 0x88+x;
- white_y = 0x90;
- break;
- }
- Lcd12864_Write_Com(0x36); //GDRAM--ON EXTEND--ON
- for(i=0;i<16;i++)
- {
- Lcd12864_Write_Com(white_y+i);
- Lcd12864_Write_Com(white_x);
- for(j=0;j<white_endx;j++)
- {
- Lcd12864_Write_Data(0xff);
- Lcd12864_Write_Data(0xff);
- }
- }
- Lcd12864_Write_Com(0x36);
- Lcd12864_Write_Com(0x32);
- }
- /******************************************************
- * 功能:设置一行16*08字符反白 *
- * 输入: --> y 反白行 *
- * --> x 开始反白列 *
- * --> endx 结束反白列 *
- * 返回:无 *
- ******************************************************/
- void Lcd12864_Set1608White(u8 y,u8 x,u8 endx)
- {
- u8 i,j,white_x,white_y,white_endx;
- x=x/2;
- endx=endx/2;
- white_endx = endx-x+1;
- switch(y)
- {
- case 0:
- white_x = 0x80+x;
- white_y = 0x80;
- break;
- case 1:
- white_x = 0x80+x;
- white_y = 0x90;
- break;
- case 2:
- white_x = 0x88+x;
- white_y = 0x80;
- break;
- case 3:
- white_x = 0x88+x;
- white_y = 0x90;
- break;
- }
- Lcd12864_Write_Com(0x36); //开绘图显示
- for(i=0;i<16;i++)
- {
- Lcd12864_Write_Com(white_y+i);
- Lcd12864_Write_Com(white_x);
- for(j=0;j<white_endx;j++)
- {
- if(x%2) //如果开始被2整除,就说明他开始是从0开始,可以写入0xff,否则写0x00
- Lcd12864_Write_Data(0x00);
- else
- Lcd12864_Write_Data(0xff);
- if((endx+1)%2) //如果结尾被2整除,就说明他正好是一个字,就可以写入0xff ,否则写0x00
- Lcd12864_Write_Data(0x00);
- else
- Lcd12864_Write_Data(0xff);
- }
- }
- Lcd12864_Write_Com(0x36);
- Lcd12864_Write_Com(0x32);
- }
- /******************************************************
- * 功能:设置一个ASCII字符反白 *
- * 输入: --> y 反白行 *
- * --> x 反白列 *
- * 返回:无 *
- ******************************************************/
- void Lcd12864_SetAscWhite(u8 y,u8 x)
- {
- u8 i,white_x,white_y,white_endx;
- white_endx=x;
- x=x/2;
- switch(y)
- {
- case 0:
- white_x = 0x80+x;
- white_y = 0x80;
- break;
- case 1:
- white_x = 0x80+x;
- white_y = 0x90;
- break;
- case 2:
- white_x = 0x88+x;
- white_y = 0x80;
- break;
- case 3:
- white_x = 0x88+x;
- white_y = 0x90;
- break;
- }
- Lcd12864_Write_Com(0x36); //开绘图显示
- for(i=0;i<16;i++)
- {
- Lcd12864_Write_Com(white_y+i);
- Lcd12864_Write_Com(white_x);
- if(white_endx%2) //如果开始被2整除,就说明他开始是从0开始,可以写入0xff,否则写0x00
- {
- Lcd12864_Write_Data(0x00);
- Lcd12864_Write_Data(0xff);
- }
- else
- {
- Lcd12864_Write_Data(0xff);
- Lcd12864_Write_Data(0x00);
- }
- }
- Lcd12864_Write_Com(0x36);
- Lcd12864_Write_Com(0x32); //开GPRAM显示、关基本指令
- }
- /******************************************************
- * 功能:清楚一行16*16字符反白 *
- * 输入: --> y 反白行 *
- * --> x 开始反白列 *
- * --> endx 结束反白列 *
- * 返回:无 *
- ******************************************************/
- void Lcd12864_Clr1616White(u8 y,u8 x,u8 endx)
- {
- u8 i,j,white_x,white_y,white_endx;
- white_endx = endx-x+1;
- switch(y)
- {
- case 0:
- white_x = 0x80+x;
- white_y = 0x80;
- break;
- case 1:
- white_x = 0x80+x;
- white_y = 0x90;
- break;
- case 2:
- white_x = 0x88+x;
- white_y = 0x80;
- break;
- case 3:
- white_x = 0x88+x;
- white_y = 0x90;
- break;
- }
- Lcd12864_Write_Com(0x36); //GDRAM--ON EXTEND--ON
- for(i=0;i<16;i++)
- {
- Lcd12864_Write_Com(white_y+i);
- Lcd12864_Write_Com(white_x);
- for(j=0;j<white_endx;j++)
- {
- Lcd12864_Write_Data(0x00);
- Lcd12864_Write_Data(0x00);
- }
- }
- Lcd12864_Write_Com(0x36);
- Lcd12864_Write_Com(0x32);
- }
- /******************************************************
- * 功能:清除一行16*08字符反白 *
- * 输入: --> y 反白行 *
- * --> x 开始反白列 *
- * --> endx 结束反白列 *
- * 返回:无 *
- ******************************************************/
- void Lcd12864_Clr1608White(u8 y,u8 x,u8 endx)
- {
- u8 i,j,white_x,white_y,white_endx;
- x=x/2;
- endx=endx/2;
- white_endx = endx-x+1;
- switch(y)
- {
- case 0:
- white_x = 0x80+x;
- white_y = 0x80;
- break;
- case 1:
- white_x = 0x80+x;
- white_y = 0x90;
- break;
- case 2:
- white_x = 0x88+x;
- white_y = 0x80;
- break;
- case 3:
- white_x = 0x88+x;
- white_y = 0x90;
- break;
- }
- Lcd12864_Write_Com(0x36); //开绘图显示
- for(i=0;i<16;i++)
- {
- Lcd12864_Write_Com(white_y+i);
- Lcd12864_Write_Com(white_x);
- for(j=0;j<white_endx;j++)
- {
- if(x%2) //如果开始被2整除,就说明他开始是从0开始,可以写入0xff,否则写0x00
- Lcd12864_Write_Data(0xff);
- else
- Lcd12864_Write_Data(0x00);
- if((endx+1)%2) //如果结尾被2整除,就说明他正好是一个字,就可以写入0xff ,否则写0x00
- Lcd12864_Write_Data(0xff);
- else
- Lcd12864_Write_Data(0x00);
- }
- }
- Lcd12864_Write_Com(0x36);
- Lcd12864_Write_Com(0x32); //开GPRAM显示、关基本指令
- }
- /******************************************************
- * 功能:清除一行ASCII字符反白 *
- * 输入: --> y 反白行 *
- * --> x 开始反白列 *
- * --> endx 结束反白列 *
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
驱动程序.zip
(4.72 KB, 下载次数: 137)
|