好了,有了这一些的函数的铺垫,接下来的事情好办多了。
首先是画点前的模式设置和清屏:
write_cmd_adapt(0x34);
clean_screen();
clean_screen如下:
void clean_screen()
{
settemp(0,0,1,0,1,1,0,0);
write_cmd(temp);
for(int i=0;i<32;i++){
write_cmd_adapt(0x80+i);
write_cmd_adapt(0x80);
for(int j=0;j<16;j++){
write_data_adapt(0x00);
}
}
for(int i=0;i<32;i++){
write_cmd_adapt(0x80+i);
write_cmd_adapt(0x88);
for(int j=0;j<16;j++){
write_data_adapt(0x00);
}
}
}
这个清屏的函数需要解释一下,这样后面的画点的函数就好办了,清屏其实就是画点,不过貌似12864没有直接的一条指令可以清屏,当然,这样我觉得速度必然受到了很大的影响,不过这里只是普通用途,不是很计较,不过后面还是有一件有意思的事情发生,后面说。
写点的时候,先写指令,告诉12864点的位置,分为x和y,具体的映射关系你需要查看一下手册或是datasheet,上面其实能看出来,从0x80开始,前面的空间是系统使用的,你可以想见,12864中,有自己的符号的预定义的空间,如果有中文字库,还有字库的空间,这样这些空间都是固化的,不能给你使用的,不然就乱套了。
Temp是一个临时的使用数组,算是之前不方便的“遗留”
void settemp(int a,int b,int c,int d,int e,int f,int g,int h)
{
temp[0] = a;
temp[1] = b;
temp[2] = c;
temp[3] = d;
temp[4] = e;
temp[5] = f;
temp[6] = g;
temp[7] = h;
}
这样你能明白画点是怎么画的了,在说明白一点吧,你现在只需要写一个画点的函数,这个你马上打开Arduino环境,5分钟,应该就出来了,可是有一个问题,这里画的不是一个点,其实一次画的是8个数据------ write_data_adapt(0x00); 这就麻烦了,我只需要你画一个点,当然,这是可以的,不过至少现在不可以,8的间隔导致我只能8个8个的重复的操作,我可以只亮8个数据中的一个,但是之后是隔了8个以后绘画,问题就出来了,如果我需要画两个相邻的点怎么办?这个你还不能预先知道,所以只能事后查询得知,这样,我们还需要一个函数------读8个数据管脚的电平的函数。
unsigned char read_data()
{
unsigned char Rdata;
pinMode(data_pin_0,INPUT);
pinMode(data_pin_1,INPUT);
pinMode(data_pin_2,INPUT);
pinMode(data_pin_3,INPUT);
pinMode(data_pin_4,INPUT);
pinMode(data_pin_5,INPUT);
pinMode(data_pin_6,INPUT);
pinMode(data_pin_7,INPUT);
set_rs();
set_rw();
clear_e();
set_e();
delayMicroseconds(500);
Rdata = digitalRead(data_pin_0)+digitalRead(data_pin_0)*2+digitalRead(data_pin_0)*4
+digitalRead(data_pin_0)*8+digitalRead(data_pin_0)*16+digitalRead(data_pin_0)*32
+digitalRead(data_pin_0)*64+digitalRead(data_pin_0)*128;
clear_e();
return Rdata;
}
这样就完整了,这个也是根据12864手册说明写出来的,看到这里的管脚方向的变化了吗?所以先前的再次设置管脚方向就是必须的了,你会想,会冲突吗?不会,因为之间有足够的时间的间隔,不会有问题。
查询的思路就是,先给出要查询的点的位置,然后查询。
查询到管脚的信息后,就是一些函数中的处理了,小技巧,就不详细说明了,好了,最后的一个函数:
unsigned char read_data()
{
unsigned char Rdata;
pinMode(data_pin_0,INPUT);
pinMode(data_pin_1,INPUT);
pinMode(data_pin_2,INPUT);
pinMode(data_pin_3,INPUT);
pinMode(data_pin_4,INPUT);
pinMode(data_pin_5,INPUT);
pinMode(data_pin_6,INPUT);
pinMode(data_pin_7,INPUT);
set_rs();
set_rw();
clear_e();
set_e();
delayMicroseconds(500);
Rdata = digitalRead(data_pin_0)+digitalRead(data_pin_0)*2+digitalRead(data_pin_0)*4
+digitalRead(data_pin_0)*8+digitalRead(data_pin_0)*16+digitalRead(data_pin_0)*32
+digitalRead(data_pin_0)*64+digitalRead(data_pin_0)*128;
clear_e();
return Rdata;
}
名字很霸气,恩,不过还是有一点小问题,暂时还没有解决,你可以看看是啥问题喽。
还有一个有趣的是,我之前的write_data函数中的间隔取得太大,结果在频繁调用的时候就来问题了----太慢,所以我开始烧进去没看到反应,还以为错了,正在调试程序呢,过了大概有5分钟,突然看到屏上有预期的图案了!真是意外啊。所以间隔还是小一点,你可以测试一下极限是多少。
文章评论(0条评论)
登录后参与讨论