我使用的12864液晶是st7920的主控,带字库,所以文本操作很容易,但是使用绘图功能有点麻烦绘图功能有点麻烦。下面这个是12864液晶的最基础的操作
下面是程序,使用STC12C5A60S2,12M晶振。
这只是一个c文件,使用时请自行添加相关的函数
#include <reg52.h>
#include <LCM12864.h>
#include <intrins.h>
sbit LCM12864_RS = P0^5;
sbit LCM12864_E = P0^7;
sbit PSB = P3^7;
sbit LCM12864_RES = P3^6;
sbit LCM12864_RW = P0^6;
//IO口对调,因P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
unsigned char Convert(unsigned char In_Date)
{
unsigned char i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
//向12864中写入一个字节
void LCM12864_wr_Byte(unsigned char dat)
{
LCM12864_RW = 0;
LCM12864_RS = 1;
LCM12864_E = 0;
LCM12864_E = 1;
P2 = Convert(dat);
_nop_();_nop_();_nop_();
LCM12864_E = 0;
LCM12864_RW = 1;
}
//向12864中写入一个命令
void LCM12864_wr_Cmd(unsigned char com)
{
LCM12864_RW = 0;
LCM12864_RS = 0;
LCM12864_E = 0;
LCM12864_E = 1;
P2 = Convert(com);
_nop_();_nop_();_nop_();
LCM12864_E = 0;
}
//初始化12864液晶字符输入
void Init_12864Word()
{
int i; //LCD显示文字(基本)初始化
PSB = 1;
LCM12864_RS = 0;
LCM12864_RES = 1;
LCM12864_wr_Cmd(Basic_Fun); //基本指令功能设定
for(i=60;i>0;i--);
LCM12864_wr_Cmd(Basic_Fun);
for(i=60;i>0;i--);
LCM12864_wr_Cmd(0x0c); //整体显示,关游标,不反白
for(i=60;i>0;i--);
LCM12864_wr_Cmd(0x01); //清除显示
for(i=1000;i>0;i--);
LCM12864_wr_Cmd(0x02); //地址复位
for(i=60;i>0;i--);
LCM12864_wr_Cmd(0x06); //游标右移
for(i=60;i>0;i--);
}
//将12864液晶GRAM清零
void Clear_GRAM()
{
char i,j;
for(i=0;i<32;i++)
{
LCM12864_wr_Cmd(0x80+i);
LCM12864_wr_Cmd(0x80);
for(j=0;j<32;j++)
{
LCM12864_wr_Byte(0x00);
}
}
}
void Init_Graphic(void) //LCD显示图片(扩展)初始化程序
{
char i;
PSB=1; //设置为8BIT并口工作模式
for(i=20;i>0;i--); //延时
LCM12864_RES=0; //复位
for(i=20;i>0;i--); //延时
LCM12864_RES=1; //复位置高
LCM12864_wr_Cmd(0x36); //扩展指令,绘图显示
for(i=2;i>0;i--);
LCM12864_wr_Cmd(0x01); //清除显示
for(i=2;i>0;i--);
LCM12864_wr_Cmd(0x02); //地址复位
for(i=2;i>0;i--);
LCM12864_wr_Cmd(0x06); //游标右移
for(i=2;i>0;i--);
LCM12864_wr_Cmd(0x0c); //整体显示,关游标,不反白
for(i=2;i>0;i--);
}
//向12864液晶某一行,某一列写入一个数据
void LCM12864_wr_Data(unsigned char row,unsigned char col,unsigned char dat)
{
switch(row)
{
case 1: LCM12864_wr_Cmd(0x80+col-1);LCM12864_wr_Byte(dat);break;
case 2: LCM12864_wr_Cmd(0x90+col-1);LCM12864_wr_Byte(dat);break;
case 3: LCM12864_wr_Cmd(0x88+col-1);LCM12864_wr_Byte(dat);break;
case 4: LCM12864_wr_Cmd(0x98+col-1);LCM12864_wr_Byte(dat);break;
}
}
//向12864液晶某一行,某一列写入一个字符串
void LCM12864_wr_String(unsigned char row,unsigned char col,unsigned char code *dat)
{
unsigned char i;
switch(row)
{
case 1: LCM12864_wr_Cmd(0x80+col-1);
for(i=0;i<16;i++)
{
if(*dat=='\0')
break;
LCM12864_wr_Byte(*dat);
dat++;
}
break;
case 2: LCM12864_wr_Cmd(0x90+col-1);
for(i=0;i<16;i++)
{
if(*dat=='\0')
break;
LCM12864_wr_Byte(*dat);
dat++;
}
break;
case 3: LCM12864_wr_Cmd(0x88+col-1);
for(i=0;i<16;i++)
{
if(*dat=='\0')
break;
LCM12864_wr_Byte(*dat);
dat++;
}
break;
case 4: LCM12864_wr_Cmd(0x98+col-1);
for(i=0;i<16;i++)
{
if(*dat=='\0')
break;
LCM12864_wr_Byte(*dat);
dat++;
}
break;
}
}
//向12864液晶写入一个图形,(整屏显示)
void LCM12864_wr_Graphic(unsigned char code *dat)
{
int i,j;
for(i=0;i<32;i++) //写上半屏
{
LCM12864_wr_Cmd(0x80+i); //写垂直坐标RAM地址
LCM12864_wr_Cmd(0x80); //写水平坐标RAM地址
for(j=0;j<16;j++)
{
LCM12864_wr_Byte(*dat);
dat++;
}
}
for(i=0;i<32;i++) //写下半屏
{
LCM12864_wr_Cmd(0x80+i);
LCM12864_wr_Cmd(0x88);
for(j=0;j<16;j++)
{
LCM12864_wr_Byte(*dat);
dat++;
}
}
}
用户377235 2015-9-7 18:24