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

2012-10-31 23:39 2177 18 18 分类: 消费电子

接上次的话茬

并行的接线比较多,主要是数据的发送用的是8根数据线,而在串行中,用的是2根数据线,这样一对比就立马能看见区别了,不过串行的在后面再讲,先讲并行的。

主要的工作就是提供驱动所需的所有的部件—函数,然后按照时序图和说明书上的说明“按图索骥”,在对的时间发送对的数据就行了,那么我们一步一步的完成函数的书写,这里用的Arduino的环境,个人感觉这个真心很好用,用多了有一些依赖。所以慎重啦。

定义管脚的部分不详细讲,主要是常用的的语法,基本和C差不多,这里比较常用的数据类型是unsigned char ,主要原因来说,单片机的空间有限,所以不比电脑中,可以比较随意,当然,需要多少就定义多少,也是一种好的习惯。

定义如下:

int back_posi_pin = 7;

int back_nega_pin = 6;

int vcc_pin = 13;

int not_serial_pin = A1;

int light_control_pin = A0;

// the data pins

int data_pin_2 = 2;

int data_pin_3 = 8;

int data_pin_1 = 3;

int data_pin_0 = 12;

int data_pin_4 = 11;

int data_pin_5 = 10;

int data_pin_6 = 9;

int data_pin_7 = 5;

int reset_pin = 4;

 

int lightness = 200;

// these are the control pins

int rw_pin = A2;

int e_pin = A3;

int rs_pin = A4;

 

这里有一半的管脚是定义的8个数据端口,这个比较明显,而另外的一些需要说明一下,lightness这个管脚,是用来控制屏幕的亮度的,是通过一个电阻进行调节的,具体的原理和滑变差不多,定义这个变量的值,可以调整屏幕的亮度,太小了你会在之后发现屏幕不能正常的显示你需要它显示的东西,这里定的值(最大是255)是200,稍小一点也是可以的。

重点的是下面的rw,e和rs管脚,这三个管脚对12864进行了控制,没有了他们,即使你发送给12864数据他也不知道怎么去理解这些数据,就比如啥时候发送的是数据,啥时候发送的是指令,e,在英文中是enable的意思,也就是使能,rs决定的是数据和指令,也就是能够告诉12864发的是数据还是指令,而rw,就是read和write的意思,读写的控制,决定是要读数据还是写数据,这里读的时候,单片机就能从8个数据端口获取电平情况,而写的时候,是12864从这8个数据管脚获取电平高低情况,所以很显然,比如你需要写数据,首先把数据放到管脚上,然后告诉12864我数据已经准备好,你可以取了。这三个信号在时序图上都有具体的说明,马上给出,其实时序图的职能就是这个,提供关于控制的时间上的顺序,提供具体的步骤,驱动者的任务就是根据这个进行一步一步的操作,只要他们的单片机和12864没有坏,那么肯定能够成功的,这个也是一大乐趣呀。

在Arduino中,程序被分为初始化部分和持续执行部分,这一点如果你用过processing编过程,应该是熟悉的,也就是说,初始化的部分只会被执行一次,而持续部分就是以一定的frameRate进行反复的执行,除非你在程序中设置了退出,程序是不会停止的。

这里只进行一次性的赋值显示,还没有做到高级的功能,所以暂时不用持续执行部分,只是用初始化的部分,而这里我们又可以将初始化的部分分为前后两个部分,一个是初始化中的初始化,而另一部分就是任务的具体完成代码段。

这前半部分是比较常规的初始化部分,完成一件事,管脚方向定义和器件的初始设置。

  // first set the output and inout pin in mode

    pinMode(back_posi_pin,OUTPUT);  

    pinMode(vcc_pin,OUTPUT);      

    pinMode(back_nega_pin,OUTPUT);

    pinMode(light_control_pin,OUTPUT);

   

    pinMode(data_pin_0,OUTPUT);  

    pinMode(data_pin_1,OUTPUT);

    pinMode(data_pin_2,OUTPUT);

    pinMode(data_pin_3,OUTPUT);

    pinMode(data_pin_4,OUTPUT);

    pinMode(data_pin_5,OUTPUT);

    pinMode(data_pin_6,OUTPUT);

    pinMode(data_pin_7,OUTPUT);  

   

    pinMode(not_serial_pin,OUTPUT);

   

    pinMode(rw_pin,OUTPUT); 

    pinMode(rs_pin,OUTPUT);   

    pinMode(e_pin,OUTPUT);     

    pinMode(reset_pin,OUTPUT);     

   

   

    digitalWrite(vcc_pin,HIGH);

    digitalWrite(back_posi_pin,HIGH);

    digitalWrite(back_nega_pin,LOW);

    analogWrite(not_serial_pin,255); // set the mode to parallel

    digitalWrite(data_pin_2,HIGH);

    analogWrite(light_control_pin,lightness);

 

    // initial work

    delay(1000);

    digitalWrite(reset_pin,LOW);

    digitalWrite(reset_pin,HIGH);   // reset the system

 

代码比较好阅读,解释也就少一点了,pinMode就是制定管脚的方向,这个在很多的单片机都是需要的,就比如51单片机和430单片机(以低功耗著称),单片机不是神,他不会自己判断方向,所以你就需要告诉他喽。

 

有一点需要说明一下,三个控制信号的端口,也就是之前提到的rs,rw,e这三个管脚,我在这里定义的是使用Arduino的模拟端,也就是区别于数字端的,这个其实不难理解,如果你用过AD,DA转换,这个就相当于这种转换,只不过这种转换是内置的,数字的,就是只有1,0两种状态,而模拟的,在Arduino中,有0-255这样一个范围的输入输出,所以更精确的感知外界,Arduino用在传感器的驱动制作方面很多,所以对于传感器的应用中,需要这些,比如你测量一个温度,总不能只有两个温度吧?热敏电阻必然是一个连续区间的测量值,好了,不再扯远了。

 

那么,这里我想当于把模拟当数字口用,所以只用到这里的0和255这两种状态,就相当于数字的0和1两种状态,不过你可以用电表进行测量,你能发现,其实这两种输出的值是一样的,也就是说,模拟口输出255时,电压值同数字口设为1时的输出值。

 

所以类比数字口,提供了三对控制电平高低的函数:

 

void set_e()

{

   digitalWrite(e_pin,HIGH);

}

 

void clear_e()

{

   digitalWrite(e_pin,LOW);

}

 

void set_rs()

{

   digitalWrite(rs_pin,HIGH);

}

 

void clear_rs()

{

   digitalWrite(rs_pin,LOW);

}

 

void set_rw()

{

   digitalWrite(rw_pin,HIGH);

}

 

void clear_rw()

{

   digitalWrite(rw_pin,LOW);

}

 

 

好了,现在我们在添加一些函数,我们需要的可能很简单,只要一个函数:write,参数先不说。

你可能会问,怎么会只需要一个函数呢?是的,确实只需要一个函数,前面其实有一些提示,主要的问题在于,你可能会疑问我说的数据/命令怎么区别,还有读写的方向怎么确定,其实都不难,主要是确定一点,那就是写数据的模式,数据有两种,一种就是单纯的数字,还有一种就是命令,在三个控制信号的指引下,我们就能很好的告诉12864这些额外的信息,这样,我们确实只需要一个写的函数就可以了,不过我们需要告诉这个函数我们对于读写方向以及数据。命令的选择,这个也就是入口参数的意义。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
18
关闭 站长推荐上一条 /3 下一条