stm32驱动TM1650 四位数码管

#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();//上锁
}

猜你喜欢

转载自blog.csdn.net/qq_36958104/article/details/112215716