100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > TM1638模块驱动(stm32 可以显示led灯 数码管 按键操作)(包含全部功能)

TM1638模块驱动(stm32 可以显示led灯 数码管 按键操作)(包含全部功能)

时间:2022-03-27 15:04:31

相关推荐

TM1638模块驱动(stm32 可以显示led灯 数码管 按键操作)(包含全部功能)

#include "TM1638.h"//************************************************************#define DISP_CMD0 0x00 //4位13段#define DISP_CMD1 0x01 //5位12段#define DISP_CMD2 0x02 //6位11段#define DISP_CMD3 0x03 //7位10段 //执行DISP_CMDx会把显示亮度关掉,但显示内容不变//************************************************************//************************************************************#define cmdwr1 0x40 //地址自动加一#define cmdwr2 0x44 //固定地址#define cmdwr3 0x40 //mcu写给TM1638#define cmdwr4 0x42 //mcu读按键值(TM1638)至少延时1us //************************************************************#defineDISP_OFF 0X80 //关#defineDISP_LV0 0X88 //最暗0x88--0x8F#defineDISP_COMMAND0x80 //小数点#defineADDR_COMMAND0XC0 //地址从0x00开始//*************************************************************//共阴数码管显示代码u8 code_tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};void TM1638_Write(unsigned char DATA){//写数据函数(没有STB—ENABLE)u8 ji;for(ji=0;ji<8;ji++){CLK=0;if(DATA&0X01) DIO=1;elseDIO=0;DATA=DATA>>1;CLK=1;}}/*u8 TM1638_Read(void){//读单个数据DIO要设为输入u8 ir,Datar=0x00;DIN=1;for(ir=0;ir<8;ir++){Datar>>=1;CLK=0;if(DIN)Datar|=0x80;CLK=1;}return Datar;}*/void Write_COM(unsigned char cmd){//发送命令字STB=0;TM1638_Write(cmd);STB=1;}/*u8 TM1638_ReadKey(void)//读按键值DIO要设为输入{u8 ki; u8 keybuff[4]; u8 keyvalue=0;STB=0;TM1638_Write(0x42); //读数据命令delay_us(5);///不同mcu不同的延时?????****for(ki=0;ki<4;ki++){keybuff[ki]=TM1638_Read();}STB=1;// 8键 col:K3 row:KS1~KS8if((keybuff[0]&0x01)==0x01) keyvalue=1;if((keybuff[0]&0x10)==0x10) keyvalue=2;if((keybuff[1]&0x01)==0x01) keyvalue=3;if((keybuff[1]&0x10)==0x10) keyvalue=4;if((keybuff[2]&0x01)==0x01) keyvalue=5;if((keybuff[2]&0x10)==0x10) keyvalue=6;if((keybuff[3]&0x01)==0x01) keyvalue=7;if((keybuff[3]&0x10)==0x10) keyvalue=8;return keyvalue;}*/void Write_DATA(u8 add,u8 DATA){//指定地址写入数据Write_COM(0x44);//固定地址STB=0;TM1638_Write(0xc0|add);TM1638_Write(DATA);STB=1;}void init_TM1638(void){ //三个输出端口初始化u8 i;GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟GPIO_InitStructure.GPIO_Pin = TM1638_DIO | TM1638_CLK| TM1638_STB;//定义IO接口; //选择端口号(0~15或all) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);GPIO_SetBits(TM1638_GPIOPORT,TM1638_DIO);//三个输出置高输出高GPIO_SetBits(TM1638_GPIOPORT,TM1638_CLK);GPIO_SetBits(TM1638_GPIOPORT,TM1638_STB);Write_COM(0X40);Write_COM(0x8f); //亮度 (0x88-0x8f)8级亮度可调STB=0; //TM1638_Write(0xc0); //设置起始地址for(i=0;i<16;i++) //传送16个字节的数据TM1638_Write(0x00);STB=1;}void init_TM1638Read(void){GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟GPIO_InitStructure.GPIO_Pin = TM1638_CLK| TM1638_STB;选择端口号(0~15或all) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);}/*void initTM1638DIN(void){GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟GPIO_InitStructure.GPIO_Pin = TM1638_DIN;选择端口号(0~15或all)GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //选择IO接口工作方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);GPIO_SetBits(TM1638_GPIOPORT,TM1638_DIO);//三个输出置高输出高GPIO_SetBits(TM1638_GPIOPORT,TM1638_CLK);GPIO_SetBits(TM1638_GPIOPORT,TM1638_STB);}*/void TM1638_display_Fix(unsigned char add,unsigned char DATA){//固定地址传送const u8 buff[22]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x00};//数字0~9及0~9加点显示段码表//---------------0 1 2 3 4 5 6 7 8 9 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 无 Write_COM(0X44);STB=0;TM1638_Write(0xC0+2*add);delay_us(1);TM1638_Write(buff[DATA]);STB=1;}//***********************************************void TM1638_OneLED(u8 num,u8 flag)//单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮{Write_COM(0x44);if(!flag)Write_DATA(2*num+1,1);elseWrite_DATA(2*num+1,0);} void TM1638_AllLED(u8 LED_flag)//控制全部LED函数,LED_flag表示各个LED状态{u8 i;Write_COM(0x44);for(i=0;i<8;i++){if(LED_flag&(1<<i))Write_DATA(2*i+1,1);elseWrite_DATA(2*i+1,0);}}/*选择IO接口工作方式:GPIO_Mode_AIN 模拟输入GPIO_Mode_IN_FLOATING 浮空输入GPIO_Mode_IPD 下拉输入GPIO_Mode_IPU 上拉输入GPIO_Mode_Out_PP 推挽输出GPIO_Mode_Out_OD 开漏输出GPIO_Mode_AF_PP 复用推挽输出GPIO_Mode_AF_OD 复用开漏输出*/

#ifndef __TM1638_H#define __TM1638_H #include "sys.h"#include "delay.h"#define TM1638_GPIOPORTGPIOA//定义IO接口#define TM1638_STBGPIO_Pin_5//定义IO接口#define TM1638_DIOGPIO_Pin_12//定义IO接口#define TM1638_CLKGPIO_Pin_11//定义IO接口#define STB PAout(5) //定义输出#define DIO PAout(12) //#define CLK PAout(11) ////*******************************#define DIN PAin(4)#define TM1638_DIN GPIO_Pin_4//定义输入管脚//**************************************************************void TM1638_Write(unsigned char DATA);//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/* void initTM1638DIN(void);u8 TM1638_Read(void);u8 TM1638_ReadKey(void); //读按键值*///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void init_TM1638(void);void Write_DATA(u8 add,u8 DATA);//指定地址写入数据void Write_COM(unsigned char cmd);//写命令void TM1638_display_Fix(unsigned char add,unsigned char DATA);//固定地址传送void TM1638_OneLED(u8 num,u8 flag);//单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮void TM1638_AllLED(u8 LED_flag);//控制全部LED函数,LED_flag表示各个LED状态#endif

#include "stm32f10x.h" //STM32头文件#include "sys.h"#include "delay.h"#include "TM1638.h"//#include "led.h"int main (void){//主程序RCC_Configuration(); //时钟设置init_TM1638();//亮度0x8b,7位10段//固定地址模式while(1){TM1638_display_Fix( 0,1);//固定地址传TM1638_display_Fix( 1,1);TM1638_display_Fix( 2,2);TM1638_display_Fix( 3,3);TM1638_display_Fix( 4,20);TM1638_display_Fix( 5,15);TM1638_display_Fix( 6,16);TM1638_display_Fix( 7,17);// TM1638_OneLED(1,1);//单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮//TM1638_OneLED(2,0);//单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮//TM1638_OneLED(3,1);//TM1638_OneLED(4,0);//TM1638_OneLED(5,1);//单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮//TM1638_OneLED(6,0);//单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮//TM1638_OneLED(7,1);//TM1638_OneLED(8,0);TM1638_AllLED(0xAA);//控制全部LED函数,LED_flag表示各个LED状态}}【变量定义】u32a; //定义32位无符号变量au16a; //定义16位无符号变量au8a; //定义8位无符号变量avu32a; //定义易变的32位无符号变量avu16a; //定义易变的 16位无符号变量avu8a; //定义易变的 8位无符号变量auc32a; //定义只读的32位无符号变量auc16a; //定义只读 的16位无符号变量auc8a; //定义只读 的8位无符号变量a#define ONE 1 //宏定义delay_us(1); //延时1微秒delay_ms(1); //延时1毫秒delay_s(1); //延时1秒*/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。