单片机的动手实践篇--51单片机玩转12864
12864液晶的驱动和1602的类似,只不过是多了几个扩展的功能,不如画图功能:
本文引用地址:http://www.amcfsurvey.com/article/201701/342707.htm这里讲一下:不要简单的认为12864是y轴64,x为128,那是点阵的分布,不是读写的分布,如正图表示,y轴的32行,从0到31,x轴的16 从0到15,0到7为上半个屏幕,8到15在下半个屏幕,所以绘图的时候,有两个部分要进行书写
在12864上载入任意一幅图:
示例代码:
#include
#define uint unsigned int
#define uchar unsigned char
sbit lcdrs = P2^4;//数据还是指令的选择端口
sbit lcdwr = P2^5;//读写操作端口
sbit lcden = P2^6;//使能端延时端口
sbit PSB = P2^1;//串行数据还是并行数据的选择段
//图片的编码,这幅图片的编码是一个哆啦a梦
unsigned char code pic1[] = { /* 0X10,0X01,0X00,0X80,0X00,0X40, */
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X3F,0XC0,0X0F,0XC0,0X0F,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X07,0XFF,0X00,0X07,0X80,0X03,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X3F,0XFE,0XF7,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XFF,0XFE,0X00,0X01,0X80,0X01,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X03,0XFF,0XFE,0X00,0X03,0XFF,0X01,0X0F,0XFE,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X0F,0XFF,0X83,0X00,0X07,0XFB,0X86,0X00,0XFF,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X1F,0XFE,0X00,0XE0,0X0F,0XFF,0XFC,0X00,0X1F,0XC0,0X00,0X00,0X00,0X00,
0X00,0X00,0X7F,0XF8,0X00,0X3F,0XE3,0XFF,0X00,0X00,0X07,0XF0,0X00,0X00,0X00,0X00,
0X00,0X00,0XFF,0XE0,0X00,0X00,0X00,0X38,0X00,0X00,0X01,0XF8,0X00,0X00,0X00,0X00,
0X00,0X01,0XFF,0XC7,0X7F,0XF0,0X00,0X0C,0X00,0X1F,0XFF,0XFC,0X00,0X00,0X00,0X00,
0X00,0X01,0XFF,0X00,0X00,0X00,0X00,0X04,0X00,0X00,0X00,0X7E,0X00,0X00,0X00,0X00,
0X00,0X03,0XFF,0X00,0X00,0X00,0X00,0X06,0X00,0X03,0XC0,0X3E,0X00,0X00,0X00,0X00,
0X00,0X03,0XFE,0X0F,0XFF,0XF0,0X00,0X02,0X00,0X0C,0X3F,0X9E,0X00,0X00,0X00,0X00,
0X00,0X07,0XFC,0X00,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X1F,0X00,0X00,0X00,0X00,
0X00,0X07,0XFC,0X00,0X1F,0XC0,0X00,0X02,0X00,0X00,0X00,0X0F,0X00,0X00,0X00,0X00,
0X00,0X07,0XF8,0X03,0XE0,0X00,0X00,0X02,0X00,0X07,0XFE,0X0F,0X00,0X00,0X00,0X00,
0X00,0X07,0XF8,0X1E,0X00,0X00,0X00,0X02,0X00,0X00,0X01,0XC6,0X00,0X00,0X00,0X00,
0X00,0X07,0XF8,0X30,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X06,0X00,0X00,0X00,0X00,
0X00,0X03,0XFC,0X00,0X00,0X00,0X00,0X02,0X00,0X03,0XFE,0X0E,0X00,0X00,0X00,0X00,
0X00,0X01,0XFC,0X00,0X00,0X00,0X00,0X7F,0XC0,0X00,0X03,0X0C,0X00,0X00,0X00,0X00,
0X00,0X01,0XFE,0X00,0X00,0X00,0X3F,0X80,0X3E,0X00,0X01,0X18,0X00,0X00,0X00,0X00,
0X00,0X00,0XFE,0X00,0X00,0X0F,0XC0,0X00,0X01,0XF0,0X06,0X30,0X00,0X00,0X00,0X00,
0X00,0X00,0X7F,0X00,0X01,0XE0,0X00,0X00,0X00,0X1F,0XF8,0X60,0X00,0X00,0X00,0X00,
0X00,0X00,0X3F,0X80,0X04,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,
0X00,0X00,0X0F,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X03,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X06,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XFC,0X00,0X00,0X00,0X00,0X00,0X01,0XFC,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X01,0XFF,0XF8,0X00,0X03,0XFF,0XE0,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,
0X00,0X00,0X07,0XFF,0XE0,0X00,0X03,0XFF,0XC0,0X07,0XFF,0XE0,0X00,0X00,0X00,0X00,
0X00,0X00,0X0F,0XFF,0XC0,0X00,0X00,0XFF,0X80,0X03,0XFF,0XF0,0X00,0X00,0X00,0X00,
0X00,0X00,0X1F,0XFF,0X80,0X00,0X00,0X00,0X00,0X01,0XFF,0XF8,0X00,0X00,0X00,0X00,
0X00,0X00,0X3F,0XFF,0X80,0X00,0X00,0X00,0X00,0X01,0XFF,0XF8,0X00,0X00,0X00,0X00,
0X00,0X00,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X01,0XFF,0XFC,0X00,0X00,0X00,0X00,
0X00,0X03,0X80,0X3F,0X80,0X0F,0XFF,0XFF,0XFC,0X01,0XFE,0X3E,0X00,0X00,0X00,0X00,
0X00,0X06,0X00,0X0F,0XC0,0X70,0X00,0X00,0X03,0XC1,0XF8,0X07,0X00,0X00,0X00,0X00,
0X00,0X06,0X00,0X07,0XE0,0X30,0X00,0X00,0X00,0X43,0XF8,0X03,0X00,0X00,0X00,0X00,
0X00,0X07,0X00,0X07,0XF0,0X38,0X00,0X00,0X00,0XCF,0XFC,0X03,0X00,0X00,0X00,0X00,
0X00,0X03,0XC0,0X1F,0XFC,0X0F,0X00,0X00,0X03,0X1F,0XFC,0X0E,0X00,0X00,0X00,0X00,
0X00,0X00,0X7F,0XFF,0XFF,0X81,0XF0,0X00,0XFC,0XFF,0XFE,0XF8,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X1F,0XFF,0XFE,0X1F,0XFF,0X1F,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X0F,0XFF,0X07,0XF0,0XFF,0XF0,0X7F,0X8F,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X7F,0XFF,0X83,0XE0,0XFF,0XF8,0X0F,0XBF,0XF8,0X00,0X00,0X00,0X00,
0X00,0X00,0X01,0XDF,0XF8,0X7D,0XFF,0X7F,0X0F,0XFF,0XC7,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X07,0XFF,0XF7,0X00,0X41,0XEF,0XF8,0X02,0X0F,0X78,0X00,0X00,0X00,0X00,
0X00,0X00,0X0F,0XFF,0XCC,0X00,0X40,0X7F,0XE0,0X02,0X01,0XBF,0XE0,0X00,0X00,0X00,
0X00,0X00,0X0F,0XFE,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,
0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0X7E,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};
void delay1ms(uint x)//延时函数
{
uint i,j;
for(i= x;i>0;i--)
for(j=110;j>0;j--);
}
void write_cmd(uchar cmd)//写指令函数
{
lcdrs = 0;
lcdwr = 0;
P0 = cmd;
lcden = 1;
delay1ms(5);//
lcden = 0;
}
void write_date(uchar date)//写数据函数
{
lcdrs = 1;
lcdwr = 0;
P0 = date;
lcden = 1;
delay1ms(5);//
lcden = 0;
}
void init_12864()
{
PSB = 1;//确定是并行传送
write_cmd(0x30);//基本指令操作
write_cmd(0x0c);//开显示,关掉光标
write_cmd(0x01);//清楚lcd的内容
}
void lcd_putpic(unsigned char code *img)//载入图画的函数
{
uint i,j;
//显示上半个屏幕的内容
for(i = 0;i<32;i++)
{
write_cmd(0x80+i);//垂直的地址
write_cmd(0x80);//水平的地址
for(j=0;j<16;j++)
{
write_date(*img);
img++;
}
}
//显示下半个屏幕的内容
for(i = 0;i<32;i++)
{
write_cmd(0x80+i);//垂直的内容
write_cmd(0x88);//水平的地址第三行的内容
for(j=0;j<16;j++)
{
write_date(*img);
img++;
}
}
}
void setpic()//图像显示模式设置函数
{
write_cmd(0x36);//选择8bit的数据流,图像显示模式
delay1ms(5);
}
main()
{
init_12864();//初始化液晶
setpic();//初始化液晶图片显示
lcd_putpic(pic1);//载入一幅图片
delay1ms(5);
while(1);
}
以后载入图片只需要将图片用取模的软件,注意图片的大小必须是128x64的尺寸,否则会出现乱码,这是个比较容易犯的错误,希望大家注意
评论