原创 12864学习笔记4(并行)

2012-10-31 23:44 1207 18 18 分类: 消费电子

好了,有了这一些的函数的铺垫,接下来的事情好办多了。

首先是画点前的模式设置和清屏:

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条评论)

登录后参与讨论
我要评论
0
18
关闭 站长推荐上一条 /2 下一条