#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++){
//拉低clk
digitalWrite(clk,LOW);
//切换dio状态,低位在前LSB
if(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低电平时操作,否则可能触发stop
digitalWrite(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.设置数据command1
start(dio,clk);
lcdwrite(dio,clk,0b01000000);
end(dio,clk);
//2.设置地址command2 1100 0000
start(dio,clk);
lcdwrite(dio,clk,0b11000000);
//3.data-n
lcdwrite(dio,clk,nums[a1]);
if(falg==1)
lcdwrite(dio,clk,nums[a2] |0X80);
else
lcdwrite(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.设置数据command1
start(dio,clk);
lcdwrite(dio,clk,0B01000100);
end(dio,clk);
//2.设置地址command2
start(dio,clk);
addr |=(0b11000000);
lcdwrite(dio,clk,addr);
//3.data-n
if(flag==0)
lcdwrite(dio,clk,nums[data]);
else
lcdwrite(dio,clk,nums[data] |0x80);
end(dio,clk);
//4.command3:控制显示
start(dio,clk);
lcdwrite(dio,clk,0B10001111);
end(dio,clk);
}
#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);
}