1、使用C语言封装的控制实现
#include <stdio.h>
#include "wiringPi.h"int nums[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b1111101,0b00000111,0b01111111,0b01101111};
void initmode(int dio,int clk)
{wiringPiSetupGpio();pinMode(dio,OUTPUT);pinMode(clk,OUTPUT);digitalWrite(dio,HIGH);digitalWrite(clk,HIGH);
}
//开始条件,默认clk高,dio高,clk高的时候,将dio从高拉低
void start(int dio,int clk)
{digitalWrite(clk,HIGH);delayMicroseconds(2);digitalWrite(dio,HIGH);delayMicroseconds(2);digitalWrite(dio,LOW);delayMicroseconds(2);digitalWrite(clk,LOW);delayMicroseconds(2);
}//结束条件,默认clk低,dio低,clk低的时候,将dio从低拉高
void end(int dio,int clk)
{digitalWrite(clk,LOW);delayMicroseconds(2);digitalWrite(dio,LOW);delayMicroseconds(2);digitalWrite(clk,HIGH);delayMicroseconds(2);digitalWrite(dio,HIGH); delayMicroseconds(2);
}void lcdwrite(int dio,int clk,int data)
{for(int i=0;i<8;i++){//拉低clkdigitalWrite(clk,LOW);//切换dio状态,低位在前LSBif(data &0x01){digitalWrite(dio,HIGH);}else{digitalWrite(dio,LOW);}delayMicroseconds(3);data = data>>1;//上升沿触发数据锁存digitalWrite(clk,HIGH);delayMicroseconds(3);}//下降沿触发ack,第八个下降沿digitalWrite(clk,LOW);delayMicroseconds(5);//强制拉高dio,判断ack回应数据,必须在clk低电平时操作,否则可能触发stopdigitalWrite(dio,HIGH);delayMicroseconds(2);//第九个时钟digitalWrite(clk,HIGH);delayMicroseconds(2);pinMode(dio,INPUT);delayMicroseconds(2);if(digitalRead(dio)==HIGH){//没有响应,出错pinMode(dio,OUTPUT);delayMicroseconds(2);digitalWrite(dio,HIGH);delayMicroseconds(2);return;}else{//有响应了pinMode(dio,OUTPUT);delayMicroseconds(2);digitalWrite(dio,HIGH);delayMicroseconds(2);}
}//地址自动加一模式,data使用列表
void send_auto_data(int dio,int clk,int a1,int a2,int a3,int a4,int falg){//1.设置数据command1start(dio,clk);lcdwrite(dio,clk,0b01000000);end(dio,clk);//2.设置地址command2 1100 0000start(dio,clk);lcdwrite(dio,clk,0b11000000);//3.data-nlcdwrite(dio,clk,nums[a1]);if(falg==1)lcdwrite(dio,clk,nums[a2] |0X80);elselcdwrite(dio,clk,nums[a2]);lcdwrite(dio,clk,nums[a3]);lcdwrite(dio,clk,nums[a4]);end(dio,clk);//4.command3:控制显示start(dio,clk);lcdwrite(dio,clk,0b10001111);end(dio,clk);
}//固定地址模式,0x0为第一个数码管,以此类推
void send_addr_data(int dio,int clk,int addr,int data,int flag){if(addr<0||addr>3)return;//1.设置数据command1start(dio,clk);lcdwrite(dio,clk,0B01000100);end(dio,clk);//2.设置地址command2start(dio,clk);addr |=(0b11000000);lcdwrite(dio,clk,addr);//3.data-nif(flag==0)lcdwrite(dio,clk,nums[data]);elselcdwrite(dio,clk,nums[data] |0x80);end(dio,clk);//4.command3:控制显示start(dio,clk);lcdwrite(dio,clk,0B10001111);end(dio,clk);
}
2、编写Python调用声明
#include"Python.h"
static PyObject* LCD_init(PyObject* self,PyObject * args)
{int dio;int clk;if(!(PyArg_ParseTuple(args,"ii",&dio,&clk)))return (PyObject*)Py_BuildValue("z",NULL);initmode(dio,clk);return (PyObject*)Py_BuildValue("z",NULL);
}static PyObject* LCD_send_addr(PyObject* self,PyObject * args)
{int dio;int clk;int addr;int data;int flag;if(!(PyArg_ParseTuple(args,"iiiii",&dio,&clk,&addr,&data,&flag)))return (PyObject*)Py_BuildValue("z",NULL);send_addr_data(dio,clk,addr,data,flag);return (PyObject*)Py_BuildValue("z",NULL);
}
static PyObject* LCD_send_auto(PyObject* self,PyObject * args)
{int dio;int clk;int data1,data2,data3,data4;int flag;if(!(PyArg_ParseTuple(args,"iiiiiii",&dio,&clk,&data1,&data2,&data3,&data4,&flag)))return (PyObject*)Py_BuildValue("z",NULL);send_auto_data(dio,clk,data1,data2,data3,data4,flag);return (PyObject*)Py_BuildValue("z",NULL);
}
static PyMethodDef pyFunArr[]={{"init",LCD_init,METH_VARARGS},{"send_addr",LCD_send_addr,METH_VARARGS},{"send_auto",LCD_send_auto,METH_VARARGS},
};void initLCD(void)
{Py_InitModule("LCD",pyFunArr);
}
3、编写setup.py文件
#!/usr/bin/env pythonfrom distutils.core import setup,Extensionmodule=Extension('LCD',libraries=['wiringPi'],sources=['main.c'])
setup(name='LCD',ext_modules=[module])
然后用python进行编译python setup.py build
4、调用测试
#!/usr/bin/env python
#coding:utf-8import LCD
import timeLCD.init(23,24);
LCD.send_auto(23,24,0,0,0,0,1)
flag=False
while(1):t=time.localtime(time.time())h=t.tm_hourm=t.tm_minLCD.send_auto(23,24,h/10,h%10,m/10,m%10,flag)if flag==False:flag=Trueelse:flag=Falsetime.sleep(0.5)
5、其它相关
c封装调用:
Ubuntu中c语言编写扩展给Python调用-CSDN博客
数据管控制原理:
树莓派开发相关知识七 -串口数码管-CSDN博客