1.驱动按照规格书写就行,主要是电路问题,规格书感觉有问题,规格书给出的电路不适用。
注意事项:
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(); #endifWS1625Driver.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);//亮度选择,可以根据休眠标志自己选择亮度 }