基于STM32的TM1629的驱动代码

发布者:AdventureSeeker最新更新时间:2018-10-16 来源: eefocus关键字:STM32  TM1629  驱动代码 手机看文章 扫描二维码
随时随地手机看文章

某年写个番禺龙美游戏机IO板用到了STM32F103VBT6及TM1629.写下了一个驱动程序。希望能帮助到有需要的朋友。不多说了,代码如下:

#ifdef GAME

#include "stm32f10x.h"

#include "stdio.h"

//TM1629片选 //STB

#define TM1629_STB GPIOC

#define TM1629_CSA GPIOC, GPIO_Pin_0

#define TM1629_CSB GPIOC, GPIO_Pin_1

#define TM1629_CSC GPIOC, GPIO_Pin_2

#define TM1629_CSD GPIOC, GPIO_Pin_3

//TM1629信号脚

#define TM1629_SCLK GPIOC, GPIO_Pin_6

#define TM1629_MOSI GPIOC, GPIO_Pin_7

#define TM1629_MISO GPIOE, GPIO_Pin_14

//键盘指示灯使能

#define KEY_LAMP_EN GPIOC, GPIO_Pin_4

#define CPU_LAMP_EN GPIOC, GPIO_Pin_5

//TM1629命令

#define TM1629_ADDR_INC 0x40

#define TM1629_ADDR_FIXED 0x44

#define TM1629_ADDR_BASE 0xc0

#define TM1629_DISP_OFF 0x80

#define TM1629_DISP_MINON 0x88

#define TM1629_DISP_MAXON 0x8f

#define TM1629_DISP_ONX 7

#define TM1629_DISP_ON (0x88+TM1629_DISP_ONX)

#define TM1629_KEY_READ 0x42

//TM1629延时

#define TM1629_DELAY 2

//TM1629应用

#define TM1629_LED_DARK 0x00

#define TM1629_LED_BRIGHT 0x7F

#define TM1629_LED_BRIGHT_DOT 0xFF

#define TM1629_CS_MASK 0xFFF0

#ifdef PART5

#define TM1629_CS_NONE 7

#else

#define TM1629_CS_NONE 0

#endif

const unsigned char TM1629_CODE[16]=

{0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0X7C, 0x39, 0x5E, 0x79, 0x71};

const unsigned char TM1629_CODE_LED[16]=

{0xBF, 0x86, 0xDB, 0xCF, 0xE6, 0xED, 0xFD, 0x87, 0xFF, 0xEF, 0xF7, 0XFF, 0xB9, 0xBF, 0xF9, 0xF1};

const unsigned char TM1629_SEGMENT[8]=

{0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

void TM1629_Test(void);

void TM1629_Configuration(void);

void TM1629_Write_Byte(uint8_t wrdata);

void TM1629_Write_CMD(uint8_t chip,uint8_t wrdata);

void TM1629_Write_CMD2(uint8_t chip,uint8_t wrdata);

uint8_t TM1629_Read_Byte(void);

uint32_t TM1629_Read_Keys(unsigned char chip);

void TM1629_Activation(uint8_t chip);

void TM1629_Write_Chip(uint8_t chip,uint8_t *led_data);

void TM1629_Write_Led(uint8_t chip,uint8_t led_index,uint8_t led_data);

void TM1629_Write_Leds(uint8_t chip,uint8_t index,uint32_t *data,uint8_t length);

void TM1629_Write_Digital(uint8_t chip,uint8_t led_index,uint8_t led_data);

void TM1629_Write_3Digital(uint8_t chip,uint8_t led_index,uint32_t led_data);

void TM1629_Write_Digitals(uint8_t chip,uint8_t led_index,uint32_t led_data,uint8_t digit_limit);

void TM1629_Write_Segment(uint8_t chip,uint8_t led_index,uint8_t led_data);

extern void SEND_RS485_STRING(char *s);

extern void Delay(__IO uint32_t nTime);

void TM1629_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

uint32_t i,j;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_ResetBits(KEY_LAMP_EN);

GPIO_ResetBits(CPU_LAMP_EN);

TM1629_Activation(TM1629_CS_NONE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;

GPIO_Init(GPIOE, &GPIO_InitStructure);

//全部熄灭

for(i=1;i<=8;i++)

{for(j=0;j<16;j++){TM1629_Write_Led(i,j,TM1629_LED_DARK);}}

GPIO_ResetBits(KEY_LAMP_EN);

}

void TM1629_Write_Byte(uint8_t wrdata)

{

uint8_t i; uint32_t j;

for(i=0;i<8;i++)

{

GPIO_ResetBits(TM1629_SCLK); //拉低时钟

if(wrdata&0x01) //最低位判断

{GPIO_SetBits(TM1629_MOSI); } //最低位为1,则写1到DIN口

else

{GPIO_ResetBits(TM1629_MOSI);} //最低位为0,则写0到DIN口

for(j=0;j //delay

GPIO_SetBits(TM1629_SCLK); //拉高时钟

for(j=0;j //delay

wrdata>>=1; //数据移到下一位

}

}

uint8_t TM1629_Read_Byte(void)

{

uint8_t i,rddata=0x0; uint32_t j;

for(i=0;i<8;i++)

{

GPIO_ResetBits(TM1629_SCLK); //拉低时钟

for(j=0;j //delay

GPIO_SetBits(TM1629_SCLK); //拉高时钟

rddata>>=1; //数据移到下一位

//DOUT为1,最高位付值为1

if(GPIO_ReadInputDataBit(TM1629_MISO)) //最高位判断

{rddata|=0x80;}

//DOUT为0,最高位付值为0

for(j=0;j //delay

}

return rddata;

}

void TM1629_Activation(uint8_t chip)

{

uint16_t temp = (GPIO_ReadOutputData(TM1629_STB)&TM1629_CS_MASK)+chip;

GPIO_Write(TM1629_STB, temp);

}

void TM1629_Write_CMD(uint8_t chip,uint8_t wrdata)

{ uint32_t j;

TM1629_Activation(TM1629_CS_NONE);

for(j=0;j

TM1629_Activation(chip);

TM1629_Write_Byte(wrdata);

}

void TM1629_Write_CMD2(uint8_t chip,uint8_t wrdata)

{

TM1629_Write_CMD(chip,wrdata);

TM1629_Activation(TM1629_CS_NONE);

}

void TM1629_Write_Led(uint8_t chip,uint8_t led_index,uint8_t led_data)

{

TM1629_Write_CMD(chip,TM1629_ADDR_FIXED);

TM1629_Write_CMD(chip,TM1629_ADDR_BASE+led_index);

TM1629_Write_Byte(led_data);

TM1629_Write_CMD2(chip,TM1629_DISP_ON);

}

void TM1629_Write_Digital(uint8_t chip,uint8_t led_index,uint8_t led_data)

{TM1629_Write_Led(chip,led_index,TM1629_CODE[led_data]);}

void TM1629_Write_Segment(uint8_t chip,uint8_t led_index,uint8_t led_data)

{TM1629_Write_Led(chip,led_index,TM1629_SEGMENT[led_data]);}

void TM1629_Write_Leds(uint8_t chip,uint8_t index,uint32_t *data,uint8_t length)

{

uint8_t i;

TM1629_Write_CMD(chip,TM1629_ADDR_INC);

TM1629_Write_CMD(chip,TM1629_ADDR_BASE+index);

for(i=0;i

TM1629_Write_CMD2(chip,TM1629_DISP_ON);

}

void TM1629_Write_3Digital(uint8_t chip,uint8_t led_index,uint32_t led_data)

{

TM1629_Write_CMD(chip,TM1629_ADDR_INC);

TM1629_Write_CMD(chip,TM1629_ADDR_BASE+led_index);

TM1629_Write_Byte(TM1629_CODE[(led_data% 10)/ 1]);

TM1629_Write_Byte(TM1629_LED_DARK);

if(led_data>99)TM1629_Write_Byte(TM1629_CODE[(led_data% 1000)/ 100]);

else TM1629_Write_Byte(TM1629_LED_DARK);

if(led_data> 9)TM1629_Write_Byte(TM1629_CODE[(led_data% 100)/ 10]);

else TM1629_Write_Byte(TM1629_LED_DARK);

TM1629_Write_CMD2(chip,TM1629_DISP_ON);

}

void TM1629_Write_Digitals(uint8_t chip,uint8_t led_index,uint32_t led_data,uint8_t digit_limit)

{

uint8_t i,data[16];

data[0]=TM1629_CODE[0];

for(i=1;i

for(i=0;(led_data>0)&&(i

{data[i++]=TM1629_CODE[led_data];}

TM1629_Write_CMD(chip,TM1629_ADDR_INC);

TM1629_Write_CMD(chip,TM1629_ADDR_BASE+led_index);

for(i=0;i

{TM1629_Write_Byte(data[i]);}

TM1629_Write_CMD2(chip,TM1629_DISP_ON);

}

void TM1629_Write_Chip(uint8_t chip,uint8_t *led_data)

{

uint8_t i;

TM1629_Write_CMD(chip,TM1629_ADDR_INC);

TM1629_Write_CMD(chip,TM1629_ADDR_BASE);

for(i=0;i<16;i++){TM1629_Write_Byte(led_data[i]);}

TM1629_Write_CMD2(chip,TM1629_DISP_ON);

}

uint32_t TM1629_Read_Keys(uint8_t chip)

{

uint32_t i,j;

union {__IO uint32_t u32data;__IO uint8_t u8data[4];} data;

TM1629_Write_CMD(chip,TM1629_KEY_READ);

for(j=0;j

for(i=0;i<4;i++){data.u8data[i]=TM1629_Read_Byte(); }

TM1629_Activation(TM1629_CS_NONE);

return data.u32data;

}

void TM1629_Clear_All(void)

{

uint8_t i,data[16];

for(i=0;i<16;i++){data[i]=0;}

TM1629_Configuration();

for(i=1;i<=9;i++)

{TM1629_Write_Chip(i,data);}

}

#endif

/**


关键字:STM32  TM1629  驱动代码 引用地址:基于STM32的TM1629的驱动代码

上一篇:stm32 多路ADC+DMA 在内存中各路ADC的数据是如何界定的
下一篇:STM32 DMA详细说明

推荐阅读最新更新时间:2024-03-16 16:16

STM32系统中的五个时钟源介绍
时钟信号好比是单片机的脉搏,了解STM32时钟系统很有必要。下图是STM32F1xx用户手册中的时钟系统结构图。 在STM32F1xx中,有五个时钟源,分别为HSI、HSE、LSI、LSE、PLL。 HSI是高速内部时钟,RC振荡器,频率为8MHz HSE是高速外部时钟,可接石英/陶瓷谐振器或者接外部时钟源,频率范围为4MHz~16MHz LSI是低速内部时钟,RC振荡器,频率为40kHz LSE是低速外部时钟,接频率为32.768kHz的石英晶振 PLL为锁相环倍频输出,其输出频率最大不得超过72MHz SYSCLK系统时钟SYSCLK最大频率为72MHz,它是供STM32中绝大部分部件工作的时钟源。系统时钟可由PLL、
[单片机]
<font color='red'>STM32</font>系统中的五个时钟源介绍
STM32时钟库函数RCC_DeInit介绍
void RCC_DeInit(void) { RCC- CR |= (uint32_t)0x00000001; //开启内部8MHz时钟 #ifndef STM32F10X_CL //STM32F10X_CL指的是STM32互联系列微处理器 RCC- CFGR &= (uint32_t)0xF8FF0000; //其它类型处理器的CFGR寄存器中27-31位是保留位,24-26为MCO位 #else //而互联型处理器的CFGR寄存器中,28-31位是保留位,24-27位属MCO RCC- CFGR &= (uint32_t)0xF0FF0000; //初始化CFGR寄存器,详见注释第1条 #endif RCC-
[单片机]
STM32位段别名位
1. 什么是位段、位带别名区? 2. 它有什么好处? 答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作, MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0置。 而现在STM32的位段、位带别名区就为了实现这样的功能。 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。 它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT) 就对应SRAM或I/O的一位。
[单片机]
STM32的库如何实现对同一组IO口的一部分引脚进行读写
以写数据为例,提供的函数有 GPIO_SetBits GPIO_ResetBits GPIO_WriteBit GPIO_Write 比如我在PD口的高八位接了个并行的数据线,低八位为控制,有输入有输出。怎么实现对高八位写任意数而第八位不受影响呢。 前两个函数肯定都不可以。 第三个也不行,是对一个或多个IO口置位或复位。 第四个是写整个口,势必影 响到第八位的控制信号啊。 能想到的是写一个for循环,判断每一位然后调用八次 GPIO_SetBits GPIO_ResetBits 是不是太麻烦了。。。。 知道一个方法,读输出再写输入就可以了。 GPIO的寄存器BSRR和BRR 端口位设置/
[单片机]
意法半导体STM32全系产品部署Microsoft® Azure RTOS开发包
STM32Cube工具和扩展包为从入门级到高性能的MCU提供专用Azure RTOS高质量中间件 2022 年6月 8日,中国 —— 意法半导体在 STM32Cube 开发环境中扩大对Microsoft® Azure RTOS的支持范围,涵盖STM32产品家族中更多的高性能、主流、超低功耗和无线微控制器 (MCU)。 用户可以利用Azure RTOS的特质、STM32Cube的便利性,以及STM32系列优化微控制器特性的灵活性,在拥有700余款微控制器的STM32 Arm® Cortex®-M 产品组合中来优化微控制器的性能。在本次范围扩大之后,所有的STM32G0主流产品线,STM32L4、STM32L4+、STM
[嵌入式]
意法半导体<font color='red'>STM32</font>全系产品部署Microsoft® Azure RTOS开发包
STM32开发笔记40: Keil链接时”No section matches selector“解决方法
单片机型号:STM32F070F6P6 首先指明,此问题是STM32CubeMX升级时造成的,我现在STM32CubeMX的版本是4.27.0,原先的版本生成的程序在Keil中打开是不报错的。 这个问题是链接错误,仔细查看工程目录就可以看见4.27.0版本生成的程序,在工程目录中缺少启动的汇编文件startup_stm32f070x6.s,只需将此文件加载到工程中,再重新生成,此问题就可以解决。
[单片机]
STM32学习手记③-EXTI中断
用系统滴答定时器的精确定时函数,新手尽量少用,容易出错,还是用简单的延时操作好了。 抢占式优先级别与响应式优先级概念不懂,因为没看什么资料书就直接上程序了,以后有时间要看看相关方面的书。 STM的外部中断与51的不同,他的外部中断不是固定的IO口,例如,STM32有80个IO口,他每个IO口都可以映像到16个个外部中断,即PA3可以映像成外部中断1,也可以映像成外部中断2。 中断开启过程: 1、在RCC里将要使用的IO口时钟打开(为什么一定要设置RCC_APB2Periph_AFIO,不懂,待以后理解) 2、在GPIO里将该IO口映像到相应的外部中断 3、在NVIC里将该中断通道打开 中断使用注意事项:
[单片机]
STM32的时钟系统学习笔记(基于STM32F407)
RCC(Reset clock Control 复位时钟控制器) 时钟源(时钟生成) 常规:外部晶振、芯片内部振荡器、锁相环(PLL) PS:(Phase Locked Loop): 为锁相回路或锁相环 其他:以太网、USB OTG FS、或其他外设的时钟源 STM32F407时钟树关系图(重点理解经常用到) 时钟总线 RCC通过多个预分频器配置时钟总线 PS:预分频器 (Prescaler-PSC)用来将定时器时钟源进行分频输出 总线类型:AHB、低速APB1、高速APB2 PS: AHB(Advanced High Performance Bus),高级高性能总线 APB(Advanc
[单片机]
<font color='red'>STM32</font>的时钟系统学习笔记(基于STM32F407)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved