TM1638按键数码管显示模块
实物图

原理图

tm1638.c文件

#include "tm1638.h"
#include "delay.h"
//   //
//共阴数码管显示代码
unsigned char tab[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};// **************************************** TM1638 ************************
//发送一个字节
void TM1638_Write(u8    DATA)           //写字节
{unsigned char i;SDA_OUT(); delay_us(2); for(i=0;i<8;i++){TM1638_CLK=0;delay_us(2); if(DATA&0X01)OUT_SDA=1;elseOUT_SDA=0;delay_us(2); DATA>>=1;TM1638_CLK=1;delay_us(2); }
}u8 TM1638_Read(void)                   //读字节
{unsigned char i;unsigned char temp=0;SDA_IN();//SDA设置为输入delay_us(2); for(i=0;i<8;i++){temp>>=1;TM1638_CLK=0;delay_us(2); if(READ_SDA)temp|=0x80;TM1638_CLK=1;delay_us(2); }return temp;
}void Write_COM(unsigned char cmd)      //发送命令字
{TM1638_STB=0;TM1638_Write(cmd);TM1638_STB=1;
}void Write_DATA(unsigned char add,unsigned char DATA)      //指定地址写入数据
{TM1638_STB=0;TM1638_Write(0xc0|add); //1100 0000 TM1638_Write(DATA);TM1638_STB=1;
}u8 Read_key(void)  //读按键
{unsigned char c[4],i,key_value=0;TM1638_STB=0;delay_us(2);TM1638_Write(0x42);          //读键扫数据 命令for(i=0;i<4;i++)      c[i]=TM1638_Read();TM1638_STB=1;                             //4个字节数据合成一个字节for(i=0;i<4;i++)key_value|=c[i]<<i;for(i=0;i<8;i++)if((0x01<<i)==key_value)break;return i;  //返回键值  无键值按下返回0x08// 8键  col:K3  row:KS1~KS8
//  if(c[0]==0x01)  key_value=1;
//  if(c[0]==0x10)  key_value=5;
//  if(c[1]==0x01)  key_value=2;
//  if(c[1]==0x10)  key_value=6;
//  if(c[2]==0x01)  key_value=3;
//  if(c[2]==0x10)  key_value=7;
//  if(c[3]==0x01)  key_value=4;
//  if(c[3]==0x10)  key_value=8;
//  return (key_value);         // 返回键值
}//单独控制一个LED函数
//num为需要控制的led序号,flag为0时熄灭,不为0时点亮
void Write_oneLED(unsigned char num,unsigned char flag) //控制一个LED
{if(flag)Write_DATA(2*num+1,1);elseWrite_DATA(2*num+1,0);
}   //控制全部LED函数
//LED_flag表示各个LED状态
void Write_allLED(unsigned char LED_flag)    //控制全部LED
{unsigned char i;for(i=0;i<8;i++){if(LED_flag&(1<<i))//Write_DATA(2*i+1,3);Write_DATA(2*i+1,1);elseWrite_DATA(2*i+1,0);}
}void TM1638_Clear(void)  //清除显示
{   u8 i;Write_COM(0x8f);       //亮度 (0x88-0x8f)8级亮度可调Write_COM(0x40);       //自动地址TM1638_STB=0;         TM1638_Write(0xc0);    //设置起始地址for(i=0;i<16;i++)       //传送16个字节的数据TM1638_Write(0x00);TM1638_STB=1;
}void NixieShow(void) //数码管显示01234567
{u8 i;Write_COM(0x8d);  //亮度 (0x88-0x8f)8级亮度可调Write_COM(0x44);  //地址固定for(i=0;i<8;i++)Write_DATA(i<<1,tab[i]);   //依次显示01234567
}//num数码管序号    data显示的数字
void NixieShowOne(u8 num,u8 data) //单个数码管显示
{Write_COM(0x8d);  //亮度 (0x88-0x8f)8级亮度可调Write_COM(0x44);  //地址固定Write_DATA(num<<1,tab[data]);     //依次显示01234567
}void NixieShowNum(u32 data) //数码管显示数字
{NixieShowOne(0,data/10000000%10); //单个数码管显示NixieShowOne(1,data/1000000%10); //单个数码管显示NixieShowOne(2,data/100000%10); //单个数码管显示NixieShowOne(3,data/10000%10); //单个数码管显示NixieShowOne(4,data/1000%10); //单个数码管显示NixieShowOne(5,data/100%10); //单个数码管显示NixieShowOne(6,data/10%10); //单个数码管显示NixieShowOne(7,data%10); //单个数码管显示
}//初始化LED
void LED_init(void)
{           GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟//GPIOB8,B9初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
}//初始化
void TM1638_init(void)
{           GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟//GPIOB8,B9初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化TM1638_CLK=1;OUT_SDA=1;
}

tm1638.h文件

#ifndef __TM1638_H
#define __TM1638_H
#include "sys.h" //   //共阴数码管显示代码
extern  unsigned char tab[16];//DIO输入输出设置
#define SDA_IN()  {GPIOE->MODER&=~(3<<(9*2));GPIOE->MODER|=0<<9*2;} //PE9输入模式
#define SDA_OUT() {GPIOE->MODER&=~(3<<(9*2));GPIOE->MODER|=1<<9*2;} //PE9输出模式//IO操作函数
#define TM1638_CLK    PEout(8) //CLK
#define OUT_SDA       PEout(9) //DIO
#define READ_SDA      PEin(9)  //输入DIO
#define TM1638_STB    PEout(10)//片选信号STB#define LED    PCout(4) //LED//TM1638
void TM1638_Write(unsigned char DATA);          //写数据函数
unsigned char TM1638_Read(void);                    //读数据函数
void Write_COM(unsigned char cmd);//发送命令字
unsigned char Read_key(void);
void Write_DATA(unsigned char add,unsigned char DATA);      //指定地址写入数据
void Write_oneLED(unsigned char num,unsigned char flag);    //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
void Write_allLED(unsigned char LED_flag);                  //控制全部LED函数,LED_flag表示各个LED状态void TM1638_Clear(void);  //清除显示
void NixieShow(void); //数码管显示
void NixieShowOne(u8 num,u8 data); //单个数码管显示
void NixieShowNum(u32 data); //数码管显示数字void TM1638_init(void);void LED_init(void);
#endif

第一种:显示数字

main.c主函数

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "tm1638.h"unsigned char num[8];      //各个数码管显示的值int main(void)
{ unsigned char i;delay_init(168);LED_init();LED=1;TM1638_init();  //初始化TM1638NixieShow(); //数码管显示01234567   初始化必须加上   TM1638_Clear();  //清除显示 while(1){   NixieShow(); //数码管显示01234567delay_ms(10);       }
}

实际显示

逻辑分析仪查看时序
0X44固定地址模式
跟着8个按键(地址+数据)
0X8F显示亮度

第二种:扫描键盘

按下按键,对应位置数码管显示数字并计数,对应位置LED点亮

main.c主函数

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "tm1638.h"unsigned char num[8];      //各个数码管显示的值int main(void)
{ unsigned char i;delay_init(168);LED_init();LED=1;TM1638_init();  //初始化TM1638NixieShow(); //数码管显示01234567   初始化必须加上   TM1638_Clear();  //清除显示 while(1){   i=Read_key();     //读按键值if(i<8){num[i]++;while(Read_key()==i);      //等待按键释放if(num[i]>15)num[i]=0;Write_DATA(i*2,tab[num[i]]); //数码管显示+1Write_allLED(1<<i);  //按键对应LED灯点亮}//     NixieShow(); //数码管显示01234567delay_ms(10);       }
}

无按键按下时的时序
0X42扫描键盘指令
后面四个字节表示返回键值


单片机源码已上传到我的资源
https://download.csdn.net/download/sgjiajia/13122172点击进入

STM32F407控制TM1638按键数码管显示模块相关推荐

  1. STM32硬件SPI控制TM1638 按键数码管LED显示模块

    STM32硬件SPI控制TM1638按键数码管LED显示模块   从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...

  2. 【雕爷学编程】Arduino动手做(102)---TM1638按键数码管

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  3. void函数调用时显示不允许使用不完整的_4位数码管显示模块驱动

    TM1637四位数码管模块是一个带时钟点的4位共阳数码管(0.36英寸)的显示模块,驱动芯片为TM1637,驱动方式为IIC,因此只需2根信号线即可使单片机控制4位8段数码管(数码管8级亮度可调). ...

  4. STM32F103单片机驱动TM1637数码管显示模块

    最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考. 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637 ...

  5. 8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8。

    8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8. 程序: #include<reg51.h> #include<absacc.h> #def ...

  6. 两个74HC595D驱动芯片控制三位数码管显示

    两个74HC595D驱动芯片控制三位数码管显示 概述 一.数码管引脚及使用概述 1.1位数码管显示方式 2.3位数码管 3.3位数码管电路图 二.74HC595D引脚及使用概述 1. 74HC595引 ...

  7. 普中51单片机按键-数码管显示

    基于普中单片机按键-数码管显示 简介 1.硬件部分 普中单片机开发板 数码管 独立按键 2.软件部分 keil软件 硬件部分 普中单片机开发板 数码管 独立按键 (这些都是开发板的最基本的配置) 软件 ...

  8. 4位数码管显示模块TM1637芯片C语言驱动程序

    一.概述 TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数 字接口.数据锁存器.LED 高压驱动.键盘扫描等电路.芯片手册已上传到资源,需要的可以下 ...

  9. c语言键盘控制数码管显示,3*4矩阵键盘控制4位数码管显示的C程序

    这个很简单 ;******************************************************************************** ;*  标题:  伟纳电 ...

最新文章

  1. 关于注册登陆时候进行的归档解档--严焕培
  2. 计算机组装维修中级试题,计算机维修工中级理论知识试卷.doc
  3. 4-什么是Image和container
  4. How-to: Build VPP FD.IO development environment with Mellanox DPDK PMD.
  5. 《计算机组成原理》BCD码 8421编码原理剖析
  6. Java -- AWT 画图,图像处理
  7. java gui构建机制_java-从构造函数构建GUI. [设计决策]
  8. AMR音频文件格式分析
  9. linux备份目录命令tar,Linux中使用tar命令备份与还原数据
  10. 用dnspod进行DNS解析出错的解决方案
  11. vue 屏幕自适应及全屏放大缩小
  12. 机器学习方法:回归(一):线性回归Linear regression
  13. 浏览器必备的管理工具,蓝色书签让你更方便
  14. 微信小程序 扫描微信二维码 传递参数授权
  15. 【终端显示】nodemon : 无法加载文件 C:\Users\AppData\Roaming\npm\nodemon.ps1,因为在此系统上禁止运 行脚本。有关详细信息,请参阅 https:/go.
  16. jQuery中ajax的使用(最详细)
  17. AgularJS 笔记
  18. Python 科学计算和绘图
  19. fft函数图像横坐标是什么_Matlab 对于fft作图 横坐标问题
  20. 拉卡拉收款宝拆解图示分析

热门文章

  1. 【考】数据库原理与技术 数据查询
  2. 上溯造型和下溯造性(解耦合)
  3. 【kali-漏洞利用】(3.4)免杀Payload 生成工具(上):Veil安装、启动、Can‘t find the WINE profile问题
  4. SQL查询表中重复数据
  5. redis入门教程详解
  6. 算法练习(21):Frog Jump
  7. 打击羊毛党团队,腾讯云动真格的了!
  8. 【点云处理之论文狂读经典版9】—— Pointwise Convolutional Neural Networks
  9. linux 启动openfire
  10. 判断手势_科目一题库里的4道难题,拿不到满分也正常,交警手势不好判断