算是填了最先挖的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. SSH无密码(密钥验证)登录的配置

    进入到我的home目录 cd ~/.ssh [root@shtppATTSTPUBv03 home]# cd ~/.ssh [root@shtppATTSTPUBv03 .ssh]# pwd /roo ...

  2. Kubernetes(k8s)目录

    Kubernetes(k8s)目录 Kubernetes集群安装(亲测有效)

  3. LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)

    515. 在每个树行中找最大值 515. Find Largest Value in Each Tree Row 题目描述 You need to find the largest value in ...

  4. 【转帖】kubernetes 部署ingress

    kubernetes 部署ingress https://www.cnblogs.com/dingbin/p/9754993.html 明天尝试一下 之前的文档里面一直没有提 需要改host文件 我有 ...

  5. [WCF] - 访问任意方法耗时长问题之解决

    问题 访问 WCF 任意方法耗时都很长(15s+) 原因 当执行语句 log4net.Config.XmlConfigurator.Configure(); 时需要连接到 log4net 对应的数据库 ...

  6. [Visual Studio] - Unable to launch the IIS Express Web server 问题之解决

    背景 Visual Studio 2015 在 Debug 模式下调试失败. 错误 解决 删除解决方案下 .vs/config 文件夹,重新运行解决方案可进行调试. 参考资料 https://stac ...

  7. Python列表生成式测试

    print('*'*50) list1 = list(range(1,6)) print(list1) del(list1) #range(1,20) 按顺序生成列表 list1 = [] for x ...

  8. 微信小程序DEMO——面包旅行的代码

    API 集合在一起写了一个页面,并导出, const apiURL = 'http://xxx.xxxx.com'; const trip = { hot(data,callback){ wx.req ...

  9. Spring Cloud Alibaba学习笔记(14) - Spring Cloud Stream + RocketMQ实现分布式事务

    发送消息 在Spring消息编程模型下,使用RocketMQ收发消息 一文中,发送消息使用的是RocketMQTemplate类. 在集成了Spring Cloud Stream之后,我们可以使用So ...

  10. MongoDB安装及环境配置

    一.什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...