好了,这里需要按照时序图,一点也不能违背,所以小心啦,全靠这个时序图了。
在一开始的时候,我写的写数据函数显得比较笨拙:
void write_data(int b[])
{
//delay(2);
delayMicroseconds(500);
set_e();
set_rs();
clear_rw();
set_data(b);
set_e();
clear_e();
}
这里写入的数据预先的定义在一个数组中,不过,这件事情好像显得不那么近人情,很多的时候我们不会把东西算好后一个一个的放在数组中,而是直接的一个16进制的数,所以这样有一些不方便,以至于之前的好多的命令只能以数组的方式给出,不过也别有一番风味啊:
int funcset[] = {0,0,0,0,1,1,0,0};
int funcset2[] = {0,0,0,0,1,1,0,0};
int display_clear[] = {1,0,0,0,0,0,0,0};
int entry_mode_set[] = {1,1,1,0,0,0,0,0}; // not sure
// the usual used commands
int extend_func_on[] = {0,0,1,0,1,1,0,0};
int extend_func_off[] = {0,0,0,0,1,1,0,0};
int paint_on[] = {0,1,1,0,1,1,0,0};
int paint_off[] = {0,0,1,0,1,1,0,0};
int open_show[]= {1,1,1,1,0,0,0,0};
不过这些有助于新手熟悉怎样去使用手册和说明,比如说,在上面的数组中,每一个中都是安放着特定的一个命令的数据组合,extend_func_on就是开启扩充指令集,这是因为之后一些命令需要在扩充模式下进行使用,下面是我截取的一张图,上面讲述的是扩充模式时管脚的各个电平设定的情况,这就是我们设定需要的“地图”了
对照着你就可以看出各个引脚的电平值了,而我的数组中的值,正是与之一一对应的。
由于这个带来的不便,后来又写了一个调整的函数,美其名为write_data_adapt:
void write_data_adapt(unsigned char b){
int adapt[] = {bitRead(b,0),bitRead(b,1),bitRead(b,2),bitRead(b,3),
bitRead(b,4),bitRead(b,5),bitRead(b,6),bitRead(b,7)};
write_data(adapt);
}
这其实就是让一个中间的函数负责处理直接送入的16进制的数据,然后再拼成一个数组,使用的还是原来的那个函数,呵呵,不过确实方便了很多。
你应该还是注意到了,我还有一个问题没有解决,那就是数据/指令的区别,这个我之前说是可以通过给些数据的函数设置一个入口参数来进行条件判断选择的,确实可以,不过这里采用了分开的办法,也就是说,我提供了一个些指令的函数,与写数据的函数区分开。
void write_cmd(int a[])
{
//delay(2);
delayMicroseconds(500);
set_e();
clear_rs();
clear_rw();
set_data(a);
set_e();
clear_e();
}
当然,调整函数也有:
void write_cmd(int a[])
{
//delay(2);
delayMicroseconds(500);
set_e();
clear_rs();
clear_rw();
set_data(a);
set_e();
clear_e();
}
其中有一个函数还没有说明:
void set_data(int data_array[])
{
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);
if(data_array[0]==1){
digitalWrite(data_pin_0,HIGH);
}
else{
digitalWrite(data_pin_0,LOW);
}
if(data_array[1]==1){
digitalWrite(data_pin_1,HIGH);
}
else{
digitalWrite(data_pin_1,LOW);
}
if(data_array[2]==1){
digitalWrite(data_pin_2,HIGH);
}
else{
digitalWrite(data_pin_2,LOW);
}
if(data_array[3]==1){
digitalWrite(data_pin_3,HIGH);
}
else{
digitalWrite(data_pin_3,LOW);
}
if(data_array[4]==1){
digitalWrite(data_pin_4,HIGH);
}
else{
digitalWrite(data_pin_4,LOW);
}
if(data_array[5]==1){
digitalWrite(data_pin_5,HIGH);
}
else{
digitalWrite(data_pin_5,LOW);
}
if(data_array[6]==1){
digitalWrite(data_pin_6,HIGH);
}
else{
digitalWrite(data_pin_6,LOW);
}
if(data_array[7]==1){
digitalWrite(data_pin_7,HIGH);
}
else{
digitalWrite(data_pin_7,LOW);
}
}
这个函数是设置8个数据端的电平的,注意到这个函数的开头把管脚的方向做了一个调整,这个是必须的。不过暂时你并不能看出这句话的正确性,因为我之前初始的时候也是输出的方向啊,怎么还要设置一次?这个后面就能明白。
文章评论(0条评论)
登录后参与讨论