#include "TM1650.H"
//written by JY-MCU,QQ:179383020
//Contact:QQ:179383020,Website:http://jy-mcu.taobao.com
//#ifndef _TM1650_H
//#define _TM1650_H
//#include <avr/io.h>
//#include <util/delay.h>
#include "stm32f0xx.h"
#include "my_sys.h"
#include "ALL_Includes.h"
#include "GPIO.h"
#define SDA_COMMAND 0X40
#define DISP_COMMAND 0x80
#define ADDR_COMMAND 0XC0
//#define SET_BIT(PORT,BIT) PORT|=(1<<BIT)
//#define CLR_BIT(PORT,BIT) PORT&=~(1<<BIT)
//#define BIT_IN(DDR,BIT) DDR&=~(1<<BIT)
//#define BIT_OUT(DDR,BIT) DDR|=(1<<BIT)
//#define READ_BIT(PIN,BIT) (PIN&(1<<BIT))
//#define SDA PD7
//#define SCL PD6
//#define SDA_high SET_BIT(PORTD,SDA)
//#define SDA_low CLR_BIT(PORTD,SDA)
//#define SCL_high SET_BIT(PORTD,SCL)
//#define SCL_low CLR_BIT(PORTD,SCL)
#define SDA_high GPIO_SetBits(GPIOA,SDA_GPIO); //PA2输出高
#define SDA_low GPIO_ResetBits(GPIOA,SDA_GPIO);//PA2输出低
#define SCL_high GPIO_SetBits(GPIOA,SCL_GPIO); //PA0输出高
#define SCL_low GPIO_ResetBits(GPIOA,SCL_GPIO); //PA0输出低
//#define SDA_IN BIT_IN(DDRD,SDA) //输入状态
//#define SDA_OUT BIT_OUT(DDRD,SDA) //输出状态
//IO操作函数
#define IIC_SCL PAout(2) //SCL JC5
#define IIC_SDA PAout(0) //SDA JC3
//#define SDA_READ READ_BIT(PIND,SDA) //读引脚电平
#define SDA_READ GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) // PAin(2) //输入SDA
unsigned char tab1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//上拉电阻去
//JC1 JC2 JC3 JC5
void I2C_MyInit(void)
{
GPIO_InitTypeDef GPIO_InitStructA;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
//I2C模拟
GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;
GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructA);
// GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO); //PA0,PA2输出高
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructA;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
//I2C模拟
GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
GPIO_Init(GPIOA, &GPIO_InitStructA);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructA;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
//I2C模拟
GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
GPIO_InitStructA.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructA);
}
/*
数据输入开始条件是CLK高时候,DIO由高变成低
*/
void TM1650_start(void) //开始信号
{
SDA_OUT(); //set SDA output
SCL_high;
SDA_high;
delay_us(5);
SDA_low;
// delay_us(1);
}
/*
TM1650_READ_DIO 是读取SDA信号
*/
void TM1650_ACK(void) //ACK信号
{
unsigned char timeout=1;
SCL_high;
// SDA_IN(); //set SDA input
delay_us(5);
SCL_low;
while((SDA_READ)|(timeout<=100))
{
timeout++;
}
delay_us(5);
SCL_low;
}
/*
数据输入结束条件是CLK高时候,DIO由低变成高
*/
void TM1650_stop(void)
{
SDA_OUT();
SCL_high;
delay_us(5);
SDA_low;
delay_us(5);
SDA_high;
}
void TM1650_Write(unsigned char DATA) //写数据函数 //写一个字节高位在前,低位在后
{
unsigned char i;
SDA_OUT();
SCL_low;
delay_us(5);
for(i=0;i<8;i++)
{
if((DATA&0x80)) { SDA_high;}
else {SDA_low; }
// if ((DATA&0X80)) SDA_high;
// else SDA_low;
SCL_low;
delay_us(5);
SCL_high;
delay_us(5);
SCL_low;
delay_us(5);
DATA<<=1;
}
delay_us(5);
}
数码管显示
void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入命令
{
//写显存必须从高地址开始写
TM1650_start();
TM1650_Write(add);//第一个显存地址
TM1650_ACK();
TM1650_Write(DATA);
// TM1650_ACK();
TM1650_stop();
}
void Display_Fix(unsigned char add,unsigned char DATA) //指定地址写入显示数据
{
if(add>3) return;
else
Write_DATA(0x68+2*add,DATA);
}
void Display_Char(unsigned char add,unsigned char dis_char) //固定地址显示数据,add代表数码管位置,dis_char为要显示的字符
{
unsigned char point_flag,char_code;
point_flag=dis_char&0x80;
dis_char&=0x7f;
if((dis_char>='0')&&(dis_char<='9'))
char_code=tab1[dis_char-0x30];
else if((dis_char>='A')&&(dis_char<='F'))
char_code=tab1[dis_char-0x37];
else if((dis_char>='a')&&(dis_char<='f'))
char_code=tab1[dis_char-0x57];
else switch(dis_char)
{
case 'L':char_code=0x38;break;
case 'l':char_code=0x30;break;
case 'H':char_code=0x76;break;
case 'h':char_code=0x74;break;
case 'U':char_code=0x3e;break;
case 'u':char_code=0x1c;break;
case 'N':char_code=0x37;break;
case 'n':char_code=0x54;break;
case 'P':char_code=0x73;break;
case 'p':char_code=0x73;break;
case 'J':char_code=0x1e;break;
case 'j':char_code=0x1e;break;
case 'O':char_code=0x3f;break;
case 'o':char_code=0x5c;break;
case 'S':char_code=0x6d;break;
case 's':char_code=0x6d;break;
case 'Y':char_code=0x6e;break;
case 'y':char_code=0x6e;break;
case ' ':char_code=0;break;
default:char_code=dis_char;break;
}
char_code|=point_flag;
Display_Fix(add,char_code);
}
void Display_Num(unsigned char add,unsigned char dis_num) //固定地址显示数字,add为数码管位置,dis_num为要显示的数字
{
unsigned char point_flag;
point_flag=dis_num&0x80;
dis_num&=0x7f;
if(dis_num>9)return; //要显示的数据大于10则返回不处理
else
Display_Fix(add,tab1[dis_num]|point_flag);
}
#ifndef _TM1650_H
#define _TM1650_H
#include "stm32f0xx.h"
#include "my_sys.h"
#include "ALL_Includes.h"
#include "GPIO.h"
//unsigned char tab1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
extern unsigned char tab1[] ;
#define SCL_GPIO GPIO_Pin_0 //(模拟I2C) PA0 SCL
#define SDA_GPIO GPIO_Pin_2 //(模拟I2C) PA2 SDA
//IO方向设置
//#define SDA_IN() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)8<<8;}// PA2
//#define SDA_OUT() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)3<<8;}
/*
*/
//GPIOA->MODER |= 1 << 2; OTYPER // 配置PA1 通用输出模式
#define SDA_INtest() {GPIOA->MODER|=((uint32_t)1<<4);GPIOA->MODER&=(~((uint32_t)1<<5))}// PA2
//#define SDA_OUT() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)3<<8;}
void I2C_MyInit(void);
void SDA_IN(void);
void SDA_OUT(void);
void TM1650_start(void);
void TM1650_stop(void);
void TM1650_ACK(void);
void TM1650_Write(unsigned char DATA); //写数据函数
void Write_DATA(unsigned char add,unsigned char DATA) ; //指定地址写入命令
void Display_Fix(unsigned char add,unsigned char DATA); //指定地址写入显示数据
void Display_Char(unsigned char add,unsigned char dis_char); //固定地址显示数据,add代表数码管位置,dis_char为要显示的字符
void Display_Num(unsigned char add,unsigned char dis_num); //固定地址显示数字,add为数码管位置,dis_num为要显示的数字
#endif
#include "delay.h"
#include "GPIO.H"
#include "USART.h"
#include "TIM.h"
#include "EXTI.h"
#include "ADC.h"
#include "my_sys.h"
#include "mytype.h"
#include "IWDG.H"
#include "stdlib.H"
#include "TM1650.H"
sPkg usasPkg ;
#define point 0x80
#define ADD_NUM 0x20
newPkg_usart(4) jiadianPkg={8,0xa2,0x90,0x01,0x00,{00,00,00,00}};//发送协议
u8 USART[8]={0X7F,0X80,0X00,0X00,0X00,0X00,0X00,0X82}; //
unsigned char tab_num[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void ADJC(void) ; //电池电压检测
void YIBIAO2(void) ; //仪表驱动反转
void YIBIAO1(void) ; //仪表驱动正转
void YIBIAO(void) ; //仪表开机检测
void STMFLASH_Read(void); //读取flash数据
void STMFLASH_Write(u16 NumToWrite); 写入flash数据
u16 STMFLASH_ReadHalfWord(u32 faddr) ; //写入flash数据
unsigned char i,j;
int main(void)
{
GPIO_MyInit();
USART_MyInit();
// TIM14_MyInit(400,50); // 10分频。PWM频率=48000000/50/40=24000hz 蜂鸣器
// ADC_MyInit();
I2C_MyInit();
delay_init();
TIM14_Init();//定时器
Write_DATA(0x48,0x01);
Write_DATA(0x48,0x51);//数据命令:0x48,5级亮度,7段显示
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
// Display_Fix(j,tab1[(j+i)%16]|point);//
Display_Num(j,i);
}
delay_ms(50);
}
for(j=0;j<4;j++)
{
// Display_Fix(j,tab1[(j+i)%16]|point);//
Display_Num(j,0);
}
while(1)
{
// ADJC();
// GPIO_ResetBits(GPIOB,GPIO_Pin_1); //无线模式发送 SEA接口 接地
//USART[2]=usasPkg.beepled;
//USART[3]=usasPkg.shumaguan1;
//USART[4]=usasPkg.shumaguan2;
//USART[5]=usasPkg.shumaguan3;
//USART[6]=usasPkg.shumaguan4;
USART[2]=checkdata[0];
USART[3]=checkdata[1];
USART[4]=checkdata[2];
USART[5]=checkdata[3];
USART[6]=checkdata[4];
USART[7]=checkdata[5];
//协议 AA BB 02 04 CC DD
if((usasPkg.beepled==0x01)&&(usasPkg.end==0x01))
{
//beep_led=!beep_led; //蜂鸣器响
beep_led=1; //蜂鸣器响
//BEEP=1;
}
if((usasPkg.beepled==0x02)&&(usasPkg.end==0x02))
{
//beep_led=!beep_led; //蜂鸣器关闭
beep_led=0; //蜂鸣器关闭
BEEP=0;
}
//数码管显示
// Write_DATA((0x68),tab1[usasPkg.shumaguan1]); //104 110 116 122
// Write_DATA((0x6a),tab1[usasPkg.shumaguan2]);
// Write_DATA((0x6c),tab1[usasPkg.shumaguan3]);
// Write_DATA((0x6e),tab1[usasPkg.shumaguan4]);
//Display_Num(0,usasPkg.shumaguan1|((usasPkg.shumaguanpoint[1]&0x01)|0x80));
//Display_Num(1,usasPkg.shumaguan2);
//Display_Num(2,usasPkg.shumaguan3);
//Display_Num(3,usasPkg.shumaguan4);
switch(usasPkg.shumaguanpoint[1])
{
case 0x01:
Display_Num(0,usasPkg.shumaguan1|0x80);
Display_Num(1,usasPkg.shumaguan2);
Display_Num(2,usasPkg.shumaguan3);
Display_Num(3,usasPkg.shumaguan4);
break;
case 0x02:
Display_Num(0,usasPkg.shumaguan1);
Display_Num(1,usasPkg.shumaguan2|0x80);
Display_Num(2,usasPkg.shumaguan3);
Display_Num(3,usasPkg.shumaguan4);
break;
case 0x03:
Display_Num(0,usasPkg.shumaguan1);
Display_Num(1,usasPkg.shumaguan2);
Display_Num(2,usasPkg.shumaguan3|0x80);
Display_Num(3,usasPkg.shumaguan4);
break;
case 0x04:
Display_Num(0,usasPkg.shumaguan1);
Display_Num(1,usasPkg.shumaguan2);
Display_Num(2,usasPkg.shumaguan3);
Display_Num(3,usasPkg.shumaguan4|0x80);
break;
default :
Display_Num(0,usasPkg.shumaguan1);
Display_Num(1,usasPkg.shumaguan2);
Display_Num(2,usasPkg.shumaguan3);
Display_Num(3,usasPkg.shumaguan4);
break;
}
#if 0
if(usasPkg.shumaguanpoint[1]==0x01) Display_Num(0,usasPkg.shumaguan1|0x80);
else Display_Num(0,usasPkg.shumaguan1);
if(usasPkg.shumaguanpoint[1]==0x02) Display_Num(1,usasPkg.shumaguan2|0x80);
else Display_Num(1,usasPkg.shumaguan2);
if(usasPkg.shumaguanpoint[1]==0x03) Display_Num(2,usasPkg.shumaguan3|0x80);
else Display_Num(2,usasPkg.shumaguan3);
if(usasPkg.shumaguanpoint[1]==0x04) Display_Num(4,usasPkg.shumaguan4|0x80);
else Display_Num(3,usasPkg.shumaguan4);
#endif
//Display_Num(0,usasPkg.shumaguan4|0x80);
// Write_DATA(0x68,tab1[0]);
// Write_DATA(0x6a,tab1[1]);
// Write_DATA(0x6c,tab1[2]);
// Write_DATA(0x6e,tab1[3]);
#if 0
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
// Display_Fix(j,tab1[(j+i)%16]|point);//
Display_Num(j,i);
}
delay_ms(100);
}
#endif
if(time_flag_1s==1)
{
WUSART1_sendN(USART,8) ;
time_flag_1s=0;
}
}
}
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(u16*)faddr;
}
u16 C;
//从指定地址开始读出指定长度的数据
void STMFLASH_Read()
{
C=STMFLASH_ReadHalfWord(0x08002000);//读取2个字节
}
void STMFLASH_Write(u16 NumToWrite)
{
FLASH_Unlock(); //解锁
FLASH_ErasePage(0x08002000);//擦除这个扇区
FLASH_ProgramHalfWord(0x08002000, NumToWrite);//写入16位数据
// FLASH_ProgramOptionByteData(0x08002000,NumToWrite);//写入8位数据
FLASH_Lock();//上锁
}