算是填了最先挖的VFD坑

最近pcb厂家神仙打架,为PCB普及做出了巨大贡献,到这事儿发生我也就开了两三次板,都赶上这个时间了,不开白不开!


不说了,上图!

sch:

pcb:

方案和之前的除了驱动电路都一样,以前那个自己绕变压器的方案发热量太大了。但是那组电路参数照样可以用的。

这次pcb除了几处纰漏,灯丝高压应该直接改为负高压,还有就是pmos不知道为啥错位了,可能是拼版的时候不小心移动了。

至于程序方面大部分直接用,由于不想改显示驱动,grid和digit还是将错就错,加一步call transcode() 罢了。

改动比较大的就是ds3231的驱动,原来使用stm8硬件iic。这次一开始调试的时候总是卡在忙,以前也有这个现象,一怒之下直接改成软件iic。

把以前的驱动拿过来改改方法就成了。

iic.h

 #ifndef __MYIICDS3231_H
#define __MYIICDS3231_H
#include "stm8s.h"
#include "delay.h"
#include "iostm8s103f3.h" //inc the .h to use bit control //transplanted to dsd3231
//modyfied:
//1.only leave 8 bit to work
//2.change the related macro definition
//3.use newer stm8s_i2c.h
//By katachi time:2018-1-20
//new added 19-3-14:
//DS3231IIC_BufferRead()
//new modify 19-4-12 fot stc15
//new modify 4-2x for stm8 software iic ////IO方向设置
//#define DS3231IIC_SDA_IN() {GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=8<<8;}
//#define DS3231IIC_SDA_OUT() {GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=3<<8;} ////IO操作函数
//#define DS3231IIC_SCL PBout(3) //SCL
//#define DS3231IIC_SDA PBout(2) //SDA
//#define DS3231IIC_READ_SDA PBin(2) //输入SDA ////IO方向设置
#define DS3231IIC_SDA_IN() {GPIO_Init(GPIOB,(GPIO_PIN_5),GPIO_MODE_IN_PU_NO_IT);}
#define DS3231IIC_SDA_OUT() {GPIO_Init(GPIOB,(GPIO_PIN_5),GPIO_MODE_OUT_PP_HIGH_FAST);} ////IO操作函数
#define DS3231IIC_SCL PB_ODR_ODR4 //SCL
#define DS3231IIC_SDA PB_ODR_ODR5 //SDA
#define DS3231IIC_READ_SDA PB_IDR_IDR5 //输入SDA //IIC所有操作函数
void DS3231IIC_Init(void); //初始化IIC的IO口
void DS3231IIC_Start(void); //发送IIC开始信号
void DS3231IIC_Stop(void); //发送IIC停止信号
void DS3231IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 DS3231IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 DS3231IIC_Wait_Ack(void); //IIC等待ACK信号
void DS3231IIC_Ack(void); //IIC发送ACK信号
void DS3231IIC_NAck(void); //IIC不发送ACK信号 void DS3231IIC_Write_One_Byte(u8 addr,u8 dat);
u8 DS3231IIC_Read_One_Byte(u8 addr);
void DS3231IIC_BufferRead(u8 *buffer,u8 startAddr,u8 bufferLen);
void DS3231IIC_ReverseDirBufferRead(u8 *buffer,u8 startAddr,u8 bufferLen);
#endif

iic.c

 #include "myiicForDs3231.h"
#include "ds3231.h" //only for iic addr
#include "delay.h" //初始化IIC
void DS3231IIC_Init(void)
{
//// GPIO_InitTypeDef GPIO_InitStructure;
//// RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );
//// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //remapping pb4,3 from jtag to general gpio
////
//// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
//// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
//// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//// GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOB,(GPIO_PIN_5|GPIO_PIN_4),GPIO_MODE_OUT_PP_HIGH_FAST); //scl pb4;sda pb5
DS3231IIC_SCL=;
DS3231IIC_SDA=;
delay_ms();
}
//产生IIC起始信号
void DS3231IIC_Start(void)
{
DS3231IIC_SDA_OUT(); //sda线输出
DS3231IIC_SDA=;
DS3231IIC_SCL=;
delay_us();
DS3231IIC_SDA=;//START:when CLK is high,DATA change form high to low
delay_us();
DS3231IIC_SCL=;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void DS3231IIC_Stop(void)
{
DS3231IIC_SDA_OUT();//sda线输出
DS3231IIC_SCL=;
DS3231IIC_SDA=;//STOP:when CLK is high DATA change form low to high
delay_us();
DS3231IIC_SCL=;
DS3231IIC_SDA=;//发送I2C总线结束信号
delay_us();
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 DS3231IIC_Wait_Ack(void)
{
u8 ucErrTime=;
DS3231IIC_SDA_IN(); //SDA设置为输入
DS3231IIC_SDA=;delay_us();
DS3231IIC_SCL=;delay_us();
while(DS3231IIC_READ_SDA)
{
ucErrTime++;
if(ucErrTime>)
{
DS3231IIC_Stop();
return ;
}
}
DS3231IIC_SCL=;//时钟输出0
return ;
}
//产生ACK应答
void DS3231IIC_Ack(void)
{
DS3231IIC_SCL=;
DS3231IIC_SDA_OUT();
DS3231IIC_SDA=;
delay_us();
DS3231IIC_SCL=;
delay_us();
DS3231IIC_SCL=;
}
//不产生ACK应答
void DS3231IIC_NAck(void)
{
DS3231IIC_SCL=;
DS3231IIC_SDA_OUT();
DS3231IIC_SDA=;
delay_us();
DS3231IIC_SCL=;
delay_us();
DS3231IIC_SCL=;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void DS3231IIC_Send_Byte(u8 txd)
{
u8 t;
DS3231IIC_SDA_OUT();
DS3231IIC_SCL=;//拉低时钟开始数据传输
for(t=;t<;t++)
{
DS3231IIC_SDA=(txd&0x80)>>;
txd<<=;
delay_us(); //对TEA5767这三个延时都是必须的
DS3231IIC_SCL=;
delay_us();
DS3231IIC_SCL=;
delay_us();
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 DS3231IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=;
DS3231IIC_SDA_IN();//SDA设置为输入
for(i=;i<;i++ )
{
DS3231IIC_SCL=;
delay_us();
DS3231IIC_SCL=;
receive<<=;
if(DS3231IIC_READ_SDA)receive++;
delay_us();
}
if (!ack)
DS3231IIC_NAck();//发送nACK
else
DS3231IIC_Ack(); //发送ACK
return receive;
}
void DS3231IIC_Write_One_Byte(u8 addr,u8 dat){
DS3231IIC_Start();
DS3231IIC_Send_Byte(DS3231_WriteAddress);
DS3231IIC_Wait_Ack();
DS3231IIC_Send_Byte(addr);
DS3231IIC_Wait_Ack();
DS3231IIC_Send_Byte(dat);
DS3231IIC_Wait_Ack();
DS3231IIC_Stop();
}
u8 DS3231IIC_Read_One_Byte(u8 addr){
u8 tmp; DS3231IIC_Start();
DS3231IIC_Send_Byte(DS3231_WriteAddress);
DS3231IIC_Wait_Ack();
DS3231IIC_Send_Byte(addr);
DS3231IIC_Wait_Ack(); DS3231IIC_Start();
DS3231IIC_Send_Byte(DS3231_ReadAddress);
DS3231IIC_Wait_Ack();
tmp = DS3231IIC_Read_Byte();
DS3231IIC_Stop(); return tmp;
}
void DS3231IIC_BufferRead(u8 *buffer, u8 startAddr, u8 bufferLen)
{
u8 t,add=startAddr; for(t=;t<bufferLen;t++)
{
*buffer=DS3231IIC_Read_One_Byte(add++);
buffer++;
}
}
void DS3231IIC_ReverseDirBufferRead(u8 *buffer, u8 startAddr, u8 bufferLen)
{
u8 t,add=startAddr; for(t=;t<bufferLen;t++)
{
*buffer=DS3231IIC_Read_One_Byte(add--);
buffer++;
}
}

main.c

 #include "stm8s.h"
#include "stm8s_clk.h"
#include "intrinsics.h"
#include "stm8s_uart1.h"
#include "uart.h"
#include "sysclock.h"
#include "delay.h"
#include "stm8s_i2c.h"
#include "pt6311.h"
#include "ds3231.h"
#include "myiicForDs3231.h"
#include "stm8s_tim1.h" void Tim1_Init(void)
{
TIM1_TimeBaseInit(,TIM1_COUNTERMODE_UP,,);//10ms
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
TIM1_Cmd(ENABLE);
} u8 t_flag,tempOrDate_flag,cnt_5s; int main(void)
{
u8 dat[];
//use this fuction to choose a clock
SystemClock_Init(HSI_Clock); //hsi //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); /*!<Set High speed internal clock */
Uart_Init();
delay_init();//@delay.c DS3231IIC_Init();
delay_ms();
//ModifyTime(4,30,2,0,16,0);//set a default time to avoid error!!!
__enable_interrupt();//enable it
printf("now system start!!!\r\n");
Init_PT6311();//initialize pt6311
//DeDisplayVfd();//dedisplay vfd screen
Tim1_Init();
while ()
{
if (t_flag){
t_flag=;
if (++cnt_5s>=)
{
cnt_5s=;
if (++tempOrDate_flag>=)tempOrDate_flag=;//0->date 1->temperature 2->week if (tempOrDate_flag==){
get_date(dat);
dspseg[]=dat[]/;
dspseg[]=dat[]%;//mon dspseg[]=(dat[]/);
dspseg[]=dat[]%;//day dspseg[]=dat[];//wk
dspseg[]=dat[];//dspseg[12] 0-3:wk 4-7:sec
}
else if (tempOrDate_flag==){
get_Temperature(dat);
dspseg[]=dat[]/;
dspseg[]='t';
dspseg[]=|COLON; dspseg[]=(dat[]/);
dspseg[]=dat[]%;
dspseg[]='c';
}
else{
get_date(dat);
WeekDisplay(dat[]);
dspseg[]=;
dspseg[]=;//clr
}
}
get_time(&dat[]);//get h m s
dspseg[]=dat[]/; //h
dspseg[]=dat[]%|COLON; dspseg[]=dat[]/; //min
dspseg[]=(dat[]%)|COLON; dspseg[]=dat[]/;
dspseg[]=(dat[]%);//sec
dspseg[]=(dspseg[]&0x0f)|(dspseg[]<<);//dspseg[12] 0-3:wk 4-7:sec//ui moving
if ((dat[]<=) && (dat[]>=)){
OpenStrobe_PT6311();
WriteByte_PT6311(CMD_DisplaySetting|0x08|);
STB=;
}else
{
OpenStrobe_PT6311();
WriteByte_PT6311(CMD_DisplaySetting|0x08|);
STB=;
}
DisplayVfd();//reflash vfd
}
if(UART_RX_NUM&0x80)//uart catch
{
CMD_Compare();
}
}
} //#ifdef USE_FULL_ASSERT //@stm8s_conf.h commented the macro
//
///**
// * @brief Reports the name of the source file and the source line number
// * where the assert_param error has occurred.
// * @param file: pointer to the source file name
// * @param line: assert_param error line source number
// * @retval : None
// */
//void assert_failed(u8* file, u32 line)
//{
// /* User can add his own implementation to report the file name and line number,
// ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
//
// /* Infinite loop */
// while (1)
// {
// }
//}
//#endif

uart.c

 #include "uart.h"
#include "stm8s.h"
#include "stm8s_clk.h"
#include <stdarg.h>
#include "string.h"
#include "pt6311.h"
#include "ds3231.h" /* ********************************************
UART1 configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Receive and transmit enabled
- Receive interrupt
- UART1 Clock disabled
*********************************************/
void DataDel(u8 *str,u8 len)
{
u8 i;
for (i=;i<len-;i++)
str[i]=str[i+];
}
void CMD_Compare(void) //
{
u8 tmp[]={};
u8 i,len; len=UART_RX_NUM&0x3f;//get the length
printf("\r\nWhat you have in put is:\r\n");
UART1_SendString(RxBuffer,len);
printf("\r\n");
//get cmd
// for (i=0;i<8;i++)
// tmp[i]=RxBuffer[i];
strncpy(tmp,(const char*)RxBuffer,);
//cmd explaine
if (strcmp("cmd_time",(const char*)tmp)==)
{
printf("now modify time!\r\n");
DataDel(RxBuffer,len);//del cmd to get data
//combine the data && transport from ascii to value
//ModifyTime(4,12,5,11,21,0);// 4-12 w5 tm11-21-00
ModifyTime((RxBuffer[]-'')* + RxBuffer[]-'', //month
(RxBuffer[]-'')* + RxBuffer[]-'',//day
(RxBuffer[]-''), //week
(RxBuffer[]-'')* + RxBuffer[]-'',//hr
(RxBuffer[]-'')* + RxBuffer[]-'',//min
(RxBuffer[]-'')* + RxBuffer[]-'');//sec
}
else if (strcmp("cmd_ala1",(const char*)tmp)==)
{ }
else if(strcmp("cmd_ligh",(const char*)tmp)==)
{
printf("now modify light!\r\n");
DataDel(RxBuffer,len);//del cmd to get data
RxBuffer[]-=''; printf("to level :%d", RxBuffer[]);
OpenStrobe_PT6311();
WriteByte_PT6311(CMD_DisplaySetting|0x08|RxBuffer[]);//on 14/16
STB=;
}
//clr
for (i=;i<len;i++)
RxBuffer[i]=;
UART_RX_NUM=;//clr
}
void Uart_Init(void)
{
UART1_DeInit();
UART1_Init((u32), UART1_WORDLENGTH_8D, UART1_STOPBITS_1, \
UART1_PARITY_NO , UART1_SYNCMODE_CLOCK_DISABLE , UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE );
UART1_Cmd(ENABLE ); } void UART1_SendByte(u8 data)
{
UART1_SendData8((unsigned char)data);
/* Loop until the end of transmission */
while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
} void UART1_SendString(u8* Data,u16 len)
{
u16 i=;
for(;i<len;i++)
UART1_SendByte(Data[i]); } u8 UART1_ReceiveByte(void)
{
u8 USART1_RX_BUF;
while (UART1_GetFlagStatus(UART1_FLAG_RXNE) == RESET);
USART1_RX_BUF=UART1_ReceiveData8();
return USART1_RX_BUF; } /*
* 函数名:fputc
* 描述 :重定向c库函数printf到USART1
* 输入 :无
* 输出 :无
* 调用 :由printf调用
*/
int fputc(int ch, FILE *f)
{
/* 将Printf内容发往串口 */
UART1_SendData8((unsigned char) ch);
while (!(UART1->SR & UART1_FLAG_TXE)); return (ch);
}

主程序流程就是定时器中断产生节拍,然后去读3231,显示,以及串口命令解析

效果图:

这个屏比较长,pcb只画了10cm,设计时忘记考虑usb口了,短在里面难受!

安鑫那边应该还在卖。

这个月点了3个VFD屏,还屯了不少。中间快递丢了,重新花50+RMB重新买,都是泪,哭。

VFD 时钟(VFD Clock with STM8 v2.0)的更多相关文章

  1. 阅读<<HDMI 1.4/2.0 Transmitter Subsystem V2.0>>笔记

    阅读<<HDMI 1.4/2.0 Transmitter Subsystem V2.0>>笔记 1.Subsystem Block Diagram 2.HDMI TX Subs ...

  2. [Android]Android端ORM框架——RapidORM(v2.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...

  3. JuCheap V2.0响应式后台管理系统模板正式发布beta版本

    JuCheap V1.* 查看地址: http://blog.csdn.net/allenwdj/article/details/49155339 经过半年的努力,JuCheap后台通用响应式管理后台 ...

  4. python gettitle v2.0

    #!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...

  5. ".NET Compact Framework v2.0 could not be found."

    参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...

  6. 【JS】heatmap.js v1.0 到 v2.0,详细总结一下:)

    前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这 ...

  7. 怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块

     因为项目的需要,所以研究了一下自动生成测试代码.将经验记录下来,总会有用的.我个人认为,好记性不如多做笔记多反思总结. 1.    前提条件 开发环境已正确配置 工程已解决JUnit依赖关系(pom ...

  8. 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github

    4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ------------------------------------------ ...

  9. 【原创】风讯DotNetCMS V1.0~V2.0 SQL注入漏洞

      文章作者:rebeyond 注:文章首发I.S.T.O信息安全团队,后由原创作者友情提交到乌云-漏洞报告平台.I.S.T.O版权所有,转载需注明作者. 受影响版本:貌似都受影响. 漏洞文件:use ...

随机推荐

  1. [转帖]InfiniBand, RDMA, iWARP, RoCE , CNA, FCoE, TOE, RDMA, iWARP, iSCSI等概念

    InfiniBand, RDMA, iWARP, RoCE , CNA, FCoE, TOE, RDMA, iWARP, iSCSI等概念 2017-12-15 15:37:00 jhzh951753 ...

  2. (零)引言——关于effective Java 3th

    去年4月份那时候,读过本书的第二版本,那时候寻思着好好读完,但是事与愿违,没有读完! 现在起,寻思着再次开始读吧: 现在第三版也出版了,还有第二版的翻译问题,遂决定读第三版的英文版吧: PDF版本可以 ...

  3. 开始使用 Manjaro(添加源+字体渲染去模糊+软件安装+优化配置+常见错误)(30)

    1. 添加 archlinux 镜像源 1. 步骤一 向 /etc/pacman.d/mirrorlist 中添加国内镜像地址 1.1 方法1:自动添加 1. 输入如下命令查看国内镜像源,并按质量排序 ...

  4. QT 创建一个线程播放监控视频

    1.创建一个线程类(PlayVideoThread): PlayVideoThread.h头文件 #pragma once #include <QObject> #include &quo ...

  5. python学习-53 正则表达式

    正则表达式 就其本质而言,正则表达式是一种小型的/高度专业化的编程语言,它内嵌在python中,并通过RE模块实现,正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. 1.元字符 - ...

  6. C/C++中内存泄漏、内存溢出与野指针的解释与说明

    1.内存泄漏 内存泄漏是指我们在堆中申请(new/malloc)了一块内存,但是没有去手动的释放(delete/free)内存,导致指针已经消失,而指针指向的东西还在,已经不能控制这块内存, 所以就是 ...

  7. Angular 学习笔记 (Custom Accessor + Mat FormField + Custom select)

    custom form control 之前就写过了,这里简单写一下. 创建一个组件实现 ControlValueAccessor 接口 @Component({ providers: [ { pro ...

  8. ORACLE锁表查询及解锁方法

    --查看锁表情况 select distinct a.sid, to_char(a.logon_time, 'YYYY-MM-DD HH24:mi:ss') loginTime, a.serial#, ...

  9. maven一些简单常用却容易记混的命令参数-U -e -B

    install 命令完成了项目编译.单元测试.打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程Maven私服仓库: deploy 命令完成了项目 ...

  10. Python之特征工程-3

    一.什么是特征工程?其实也是数据处理的一种方式,和前面的原始数据不一样的是,我们在原始数据的基础上面,通过提取有效特征,来预测目标值.而想要更好的去得出结果,包括前面使用的数据处理中数据特征提取,新增 ...