1.驱动按照规格书写就行,主要是电路问题,规格书感觉有问题,规格书给出的电路不适用。
注意事项:
- SDA和SCL一定要直接连到MCU,不要串电阻,也不要并电容;(我是一直点不了,看案列发现直连才意识到的,把串联电阻短路,把并联电容拆了就好了)。
2.如果你还是想加电阻电容,请测通后自己再加,再测试,
以下是驱动
WS1625Driver.h
#ifndef __WS1625_DRIVER_H
#define __WS1625_DRIVER_H
typedef unsigned char BYTE;
typedef unsigned int WORD;
//*********************SDA*********************************************
#define WS1625_SDA_SET _pb6=1
#define WS1625_SDA_CLR _pb6=0
//*********************SCL*********************************************
#define WS1625_SCL_SET _pb4=1
#define WS1625_SCL_CLR _pb4=0
////////////////////////////////////////
//如何控制
//1.模式指令+显示模式指令
//2.地址命令+数据 n个
//3.模式指令+显示控制指令
///////////////////////////////////////
#define MODE_CMD 0X48//模式命令
//显示模式指令
//#define SCAN_TIME_0_5_T (0X00)
#define SCAN_TIME_1_0_T (0X10)
//#define SCAN_TIME_1_5_T (0X20)
//#define SCAN_TIME_2_0_T (0X30)
#define SCAN_TIME_CHOOSE SCAN_TIME_1_0_T
#define DSP_MODE_11_SEG_12 ((SCAN_TIME_CHOOSE)|(0X00))
#define DSP_MODE_11_SEG_11 ((SCAN_TIME_CHOOSE)|(0X01))
#define DSP_MODE_11_SEG_10 ((SCAN_TIME_CHOOSE)|(0X02))
#define DSP_MODE_11_SEG_9 ((SCAN_TIME_CHOOSE)|(0X03))
#define DSP_MODE_11_SEG_8 ((SCAN_TIME_CHOOSE)|(0X04))
#define DSP_MODE_11_SEG_7 ((SCAN_TIME_CHOOSE)|(0X05))
#define DSP_MODE_11_SEG_6 ((SCAN_TIME_CHOOSE)|(0X06))
#define DSP_MODE_11_SEG_5 ((SCAN_TIME_CHOOSE)|(0X07))
#define DSP_MODE_11_SEG_4 ((SCAN_TIME_CHOOSE)|(0X08))
#define DSP_MODE_11_SEG_3 ((SCAN_TIME_CHOOSE)|(0X09))
#define DSP_MODE_11_SEG_2 ((SCAN_TIME_CHOOSE)|(0X0A))
#define DSP_MODE_11_SEG_1 ((SCAN_TIME_CHOOSE)|(0X0B))
//地址命令
#define ADDR_CMD_START_ADDR 0XC0//地址0XC0~0XD7,一共24个
//显示模式指令
#define DSP_CONTROL_BRIGHTNESS_1 (0X90)
#define DSP_CONTROL_BRIGHTNESS_2 (0X91)
#define DSP_CONTROL_BRIGHTNESS_3 (0X92)
#define DSP_CONTROL_BRIGHTNESS_4 (0X93)
#define DSP_CONTROL_BRIGHTNESS_5 (0X94)
#define DSP_CONTROL_BRIGHTNESS_6 (0X95)
#define DSP_CONTROL_BRIGHTNESS_7 (0X96)
#define DSP_CONTROL_BRIGHTNESS_8 (0X97)
#define DSP_CONTROL_BRIGHTNESS_9 (0X98)
#define DSP_CONTROL_BRIGHTNESS_10 (0X99)
#define DSP_CONTROL_BRIGHTNESS_11 (0X9A)
#define DSP_CONTROL_BRIGHTNESS_12 (0X9B)
#define DSP_CONTROL_BRIGHTNESS_13 (0X9C)
#define DSP_CONTROL_BRIGHTNESS_14 (0X9D)
#define DSP_CONTROL_BRIGHTNESS_15 (0X9E)
#define DSP_CONTROL_BRIGHTNESS_16 (0X9F)
#define DSP_CONTROL_SLEEP (0X88)
#define DSP_CONTROL_CLOSE (0X80)
extern WORD D_Ws1625Buf[12];
extern void WS1625_DRIVER();
#endif
WS1625Driver.c
#include "WS1625Driver.h"
WORD D_Ws1625Buf[12];
void WS1625_DELAY()//延迟
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void WS1625_START()
{
WS1625_SCL_SET;
WS1625_SDA_SET;
WS1625_DELAY();
WS1625_SDA_CLR;
WS1625_DELAY();
WS1625_SCL_CLR;
WS1625_DELAY();
}
void WS1625_STOP()
{
WS1625_SCL_SET;
WS1625_DELAY();
WS1625_SDA_SET;
WS1625_DELAY();
}
void WS1625_ACK()
{
WS1625_SDA_CLR;
WS1625_DELAY();
WS1625_SCL_SET;
WS1625_DELAY();
WS1625_SCL_CLR;
WS1625_DELAY();
}
void WS1625_SND(BYTE cmd,BYTE dat)
{
BYTE i;
WS1625_START();
for(i=0;i<8;i++)
{
if(cmd&0X80)WS1625_SDA_SET;
else WS1625_SDA_CLR;
WS1625_DELAY();
WS1625_SCL_SET;
WS1625_DELAY();
WS1625_SCL_CLR;
WS1625_DELAY();
cmd<<=1;
}
WS1625_ACK();
for(i=0;i<8;i++)
{
if(dat&0X80)WS1625_SDA_SET;
else WS1625_SDA_CLR;
WS1625_DELAY();
WS1625_SCL_SET;
WS1625_DELAY();
WS1625_SCL_CLR;
WS1625_DELAY();
dat <<= 1;
}
WS1625_ACK();
WS1625_STOP();
}
void WS1625_DRIVER()
{
BYTE i;
WS1625_SND(MODE_CMD,DSP_MODE_11_SEG_12);//11段12位
for(i=0;i<12;i++)
{
WS1625_SND(ADDR_CMD_START_ADDR+(2*i),D_Ws1625Buf[i]&0X00FF);
WS1625_SND(ADDR_CMD_START_ADDR+(2*i)+1,D_Ws1625Buf[i]>>8);
}
WS1625_SND(MODE_CMD,DSP_CONTROL_BRIGHTNESS_16);//亮度选择,可以根据休眠标志自己选择亮度
}