历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2018年10月16日 | 基于STM32的TM1629的驱动代码

2018-10-16 来源:eefocus

某年写个番禺龙美游戏机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

/**


推荐阅读

史海拾趣

Comtech AHA Corp公司的发展小趣事

品质是Comtech AHA Corp的生命线。公司始终坚持严格的品质管理,从原材料采购到生产流程,再到成品检验,每一个环节都严格把关。正是这种对品质的执着追求,使得Comtech AHA Corp的产品在市场上赢得了良好的口碑。许多知名企业纷纷与Comtech AHA Corp建立长期合作关系,进一步推动了公司的发展。

Display Engineering Services公司的发展小趣事

品质是Comtech AHA Corp的生命线。公司始终坚持严格的品质管理,从原材料采购到生产流程,再到成品检验,每一个环节都严格把关。正是这种对品质的执着追求,使得Comtech AHA Corp的产品在市场上赢得了良好的口碑。许多知名企业纷纷与Comtech AHA Corp建立长期合作关系,进一步推动了公司的发展。

集创北方(CHIPONE)公司的发展小趣事

2022年2月,北京冬奥会盛大开幕。在这场全球瞩目的体育盛事中,鸟巢LED舞台的璀璨灯光吸引了无数目光。背后的功臣正是集创北方的LED驱动芯片ICND2153和ICND2055。这两款芯片以其卓越的性能和稳定性,确保了舞台效果的完美呈现,为冬奥会增添了无尽的光彩。

BROTHER公司的发展小趣事

随着全球市场的不断扩大,BROTHER意识到要实现持续发展,必须走国际化道路。因此,公司在上世纪五十年代开始积极实施国际化战略。首先,BROTHER在美国纽约建立了销售总部,以更好地服务北美市场。随后,公司又在欧洲等地建立生产基地和销售网络,进一步拓展国际市场。通过国际化战略的实施,BROTHER不仅提升了品牌知名度和市场份额,还积累了丰富的跨国经营经验。

固驰(GUERTE)公司的发展小趣事

浙江固驰电子有限公司,即固驰(GUERTE)品牌的发源地,于1995年在浙江省丽水市创立。公司由范*先生创立,初期专注于半导体器件的生产。经过数年的不懈努力,固驰电子逐渐在行业内崭露头角,通过持续的技术创新和产品优化,成功开发出ZQ系列整流管芯、CELL芯片、5-200A单三相整流桥及电力半导体模块等核心产品。这些产品广泛应用于变频器、逆变焊机、UPS电源等领域,为公司的快速发展奠定了坚实基础。

Federal Custom Cable公司的发展小趣事

Federal Custom Cable非常重视客户服务工作。他们建立了完善的客户服务体系,为客户提供从产品咨询、选型、定制到售后服务的全方位支持。同时,Federal Custom Cable还积极与合作伙伴建立长期稳定的合作关系,共同推动电缆行业的发展。这种以客户需求为导向、以合作伙伴关系为基础的经营模式,为Federal Custom Cable的持续发展提供了有力保障。

问答坊 | AI 解惑

ccd资料包

飞思卡尔智能车上用的ccd摄像头…

查看全部问答>

SPCE061A凌阳单片机编程红外遥控

我要做基于SPCE061A凌阳单片机红外遥控比赛计分器的设计, 需要软件编程红外识别,利用LED模组能显示比分,我需要知道利用的遥控器的名称和C编程的程序。重谢,有能帮我做的可以加QQ330254876讨论,重谢。…

查看全部问答>

【开发故事】DLP投影仪:坚持20年不放弃的男人

  不多的文章,与大家分享下:你有你的开发故事么?   美国德克萨斯州最大的城市达拉斯。在这个有着牧牛和牛仔历史的城市里,一项技术宣告诞生。这项技术在很长时间里“养在深闺人未识”,甚至一度处于行将消亡的境地。然而,凭借一个 ...…

查看全部问答>

哪类应届毕业生最受欢迎? 毕业生比拼职业技能

新一轮毕业生招聘季节即将到来,今年就业形势依然严峻。用人单位不仅要求大学生学习成绩好、在校表现好,还要求各方面的综合能力强,因此——     毕业生比拼职业技能     2009年的校园招聘大战已初露端倪,一家知名人才网 ...…

查看全部问答>

那位朋友知道那里能搞到RIL.lib的源代码?

我装了Platform Builder CE 6.0 ,在CellCore文件夹下也找到了RIL层的源程序,但是我却没找到RIL.lib中函数的实现,也就是Ril.def中定义的导出函数。比如: RIL_Initialize               &nbs ...…

查看全部问答>

发个最新构思和大家讨论讨论

本人一直很喜欢下载东西,verycd.com更是天天上,还喜欢上xunlei.com找软件 而且经常成夜成夜的挂着电脑,挂着迅雷, 电费不用说, 因为用P2P硬盘都坏掉几个, 数据吞吐量大概每天2G到10G, 看电影只看DVD高清晰版的, 装软件只下完整版的, 由于做软 ...…

查看全部问答>

AT+CMGS很慢,为什么?

我用MC39i发送PDU短信,在AT+CMGS这一步的时候很慢,要3、4秒才能出现\">\",为什么呢?有什么方法加快速度吗? 我看过别人也是用MC39i,但是一般1秒之内就可以发送出去了,怎么会差这么远呢?…

查看全部问答>

100分相送,如何在dopod818 PPC上注册蓝牙串口通讯???

如题:如何在dopod818 PPC上注册蓝牙串口通讯??? 主要的目的是想让GPS通过蓝牙控制dopod818手机发送/读取短信,和读取电话本信息,现在有的手机像dopod818没有蓝牙串口服务,要自己实现注册串口服务,然后通过打开串口进行通讯和发送AT命令来实 ...…

查看全部问答>

STR912怎么清串口中断标志?keiluv3和uv4居然不一样?

UART_ClearITPendingBit函数 uv3中是 void UART_ClearITPendingBit(UART_TypeDef* UARTx, u16 UART_IT) {   /* Clear the specified interrupt */   UARTx->ICR &= UART_IT; } uv4中是 void UART_ClearI ...…

查看全部问答>