• 基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值应用


    基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值应用

    STC12C5A60S2系列1T 8051单片机管脚图

    在这里插入图片描述在这里插入图片描述

    STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

    在这里插入图片描述

    STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

    在这里插入图片描述在这里插入图片描述

    TM1638键盘数码管模块概述

    TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集
    成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于冰箱、
    空调 、家庭影院等产品的高段位显示屏驱动。

    TM1638键盘数码管模块特性说明

    • 采用功率CMOS 工艺
    • 显示模式 10 段×8 位
    • 键扫描(8×3bit)
    • 辉度调节电路(占空比8 级可调)
    • 串行接口(CLK,STB,DIO)
    • 振荡方式:RC 振荡(450KHz+5%)
    • 内置上电复位电路
    • 采用SOP28封装

    TM1638键盘数码管模块管脚定义

    在这里插入图片描述

    TM1638键盘数码管模块管脚功能说明

    在这里插入图片描述

    TM1638键盘数码管模块按键读取原理

    在这里插入图片描述在这里插入图片描述

    TM1638键盘数码管模块按键读取时序

    在这里插入图片描述

    TM1638键盘数码管模块显示地址寄存器

    在这里插入图片描述

    TM1638键盘数码管模块键扫数据寄存器

    在这里插入图片描述在这里插入图片描述

    TM1638键盘数码管模块数据寄存器

    在这里插入图片描述

    TM1638键盘数码管模块数据命令寄存器

    在这里插入图片描述

    TM1638键盘数码管模块地址命令寄存器

    在这里插入图片描述

    TM1638键盘数码管模块显示控制命令寄存器

    在这里插入图片描述

    TM1638键盘数码管模块数码管串行数据传输

    数据接收(写数据)

    在这里插入图片描述

    数据读取(读数据)

    在这里插入图片描述

    TM1638键盘数码管模块串行数据地址传输模式时序图

    地址自动加1模式时序图

    在这里插入图片描述

    固定地址模式时序图

    在这里插入图片描述

    TM1637键盘数码管模块程序设计流程图

    地址自动加1模式的程序设计流程图

    在这里插入图片描述

    固定地址模式的程序设计流程图

    在这里插入图片描述

    TM1638键盘数码管模块应用电路

    TM1638键盘数码管模块驱动共阴数码管硬件电路

    在这里插入图片描述

    TM1638键盘数码管模块驱动共阳数码管硬件电路

    在这里插入图片描述

    TM1638键盘数码管模块应用原理图电路

    在这里插入图片描述

    TM1638键盘数码管模块电气参数

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值编程

    main.c

    #include <stc12c5a60s2.h>
    #include "Timer0.h"
    #include "Key.h"
    #include "Digitron.h"
    #include "TM1638OfI2C.h"
    //#include"intrins.h"
    #define uchar unsigned char//自定义无符号字符型为uchar
    #define uint unsigned int//自定义无符号整数型为uint
    
     void PortModeSet()//端口模式设置函数
    {
       
      P0M1 = 0x00;
      P0M0 = 0x00;
      P1M1 = 0x00;
      P1M0 = 0x00;
      P2M1 = 0x00;
      P2M0 = 0x00;
      P3M1 = 0x00;
      P3M0 = 0x00;
      P4M1 = 0x00;
      P4M0 = 0x00;
     }
     void main()//主函数
    {
       
      PortModeSet();//端口模式设置函数
    //  Uart1Init();//串行口1工作模式1的8位串行口波特率可变初始化函数 波特率为9600bps 晶振为12MHz
      Timer0Init();//定时器0的16位定时模式1用12分频定时2ms初始化函数 晶振为12MHz
      DigitronBootDisplay();//数码管开机显示函数
      TM1638OfI2CInit();//TM1638键盘数码管模块初始化函数 
    //  TM1637AutomaticDisplay();//TM1637键盘数码管模块自动显示函数
      while(1)//主循环
     {
        
       KeyScanResult();//按键扫描结果函数
      }
     }
    

    TM1638OfI2C.c

    #include "TM1638OfI2C.h"
    //#include "Key.h"
    //#include "Digitron.h"
    #include"intrins.h"
    #define uchar unsigned char//自定义无符号字符型为uchar
    #define uint unsigned int//自定义无符号整数型为uint
    
     void TM1638OfI2CWriteByte(uchar Data)//TM1638键盘数码管模块写字节函数
    {
       
      uchar i;//声明字节位个数变量
      for (i = 0; i < 8; i++)//循环字节位个数
     {
       
       TM1638CLK = 0;//拉低TM1638键盘数码管模块时钟线端口 让TM1638键盘数码管模块进行输出字节某位操作
       TM1638DIO =  Data & 0x01;//取出该数据的字节最低位 如何取出该数据的字节最低位?为什么是&0x01?而不是|0x01?以两个数据的字节来说明 如:0000 0010 和 0000 0011 它们的最低位分别为0和1 &0x01后是0和1 也是它们的最低位0和1 如果|0x01后都是1 就再也不是它们原来的最低位0和1 
       Data >>= 1;//取出该数据的字节最低位后 剩余字节往右移一位 形成新的数据的字节
       TM1638CLK = 1;//拉高TM1638键盘数码管模块时钟线端口 结束TM1638键盘数码管模块输出字节某位操作
      }
     }
     
     void TM1638OfI2CWriteCommand(uchar Command)//TM1638键盘数码管模块写命令函数
    {
       
      TM1638STB = 0;//拉低TM1638键盘数码管模块片选线端口 让TM1638键盘数码管模块进行写操作
      TM1638OfI2CWriteByte(Command);//通过TM1638键盘数码管模块写字节函数来写命令
      TM1638STB = 1;//拉高TM1638键盘数码管模块片选线端口 结束TM1638键盘数码管模块写操作
     }
    
     void TM1638OfI2CWriteData(uchar Address,uint Data)//TM1638键盘数码管模块写数据函数 在指定的显示地址写入数据
    {
       
      TM1638STB = 0;//拉低TM1638键盘数码管模块片选线端口 让TM1638键盘数码管模块进行写操作
      TM1638OfI2CWriteByte(0x00 | Address);//通过TM1638键盘数码管模块写字节函数来写显示地址
      TM1638OfI2CWriteByte(Data);//通过TM1638键盘数码管模块写字节函数来写数据
      TM1638STB = 1;//拉高TM1638键盘数码管模块片选线端口 结束TM1638键盘数码管模块写操作
     }
    
     uchar TM1638OfI2CReadByte()//TM1638键盘数码管模块读字节函数
    {
       
      uchar i;//声明字节位个数变量
      uchar ByteData = 0;//声明字节数据变量
      TM1638DIO = 1;//拉高TM1638键盘数码管模块数据线端口 读入数据
      for(i = 0; i < 8; i++)//循环字节位个数
     {
       
       ByteData >>= 1;//字节数据往右移一位 形成新的数据的字节 如:1010 1010 右移一位 变为0101 0101
       TM1638CLK = 0;//拉低TM1638键盘数码管模块时钟线端口 让TM1638键盘数码管模块进行读取字节某位操作
       if(TM1638DIO)//判断TM1638键盘数码管模块数据线端口是否为高电平
       ByteData |= 0x80;//置该数据的字节最高位为1 其余位不变 如何置该数据的字节最高位为1?为什么是|=0x80?而不是&=0x80?以两个数据的字节来说明 如:0100 0000 和 1000 0000 它们的最高位分别为0和1 |=0x80后都是1 也是它们的最高位都置为1 如果&=0x80后最高位分别是0和1 就再也不是它们原来的最高位都置为1 
       TM1638CLK = 1;//拉高TM1638键盘数码管模块时钟线端口 结束TM1638键盘数码管模块读取字节某位操作
      }
      return ByteData;//返回字节数据
     }
    
     uchar TM1638OfI2CReadKey()//TM1638键盘数码管模块读按键函数
    {
       
      uchar KeyByteArrary[4];//声明按键字节值数组变量
      uchar i;//声明按键字节值数组个数变量 
      uchar KeyValue = 0;//声明按键数值变量
      TM1638STB=0;//拉低TM1638键盘数码管模块片选线端口 让TM1638键盘数码管模块进行读操作
      TM1638OfI2CWriteByte(0x42); //设置TM1638键盘数码管模块的数据命令寄存器 写键扫数据命令 注意:这里要先写完4个字节键值才能将TM1638STB置1 否则写键值无效
      for (i = 0; i < 4; i++)//循环按键字节值数组中字节值个数 共有4个按键字节值
      KeyByteArrary[i] = TM1638OfI2CReadByte();//发送TM1638ReadByte(0x42)读键扫数据命令后 开始读取按键数据BYTE1—BYTE4共4个字节 从低位开始读取数据 TM1638键盘数码管模块上的K和KS引脚对应的按键按下时 相对应的按键字节值内的字节位为1
      TM1638STB=1;//拉高TM1638键盘数码管模块片选线端口 结束TM1638键盘
  • 相关阅读:
    文件上传漏洞实验
    如何搭建代理镜像仓库
    java抽象类和接口(Comparator和Conparable的使用)
    vertx hello gradle 打包jar
    【PC】2023年11月商店更新
    从25到45岁,软件测试工程师如何发展自己的职业?
    【无标题】
    工程化vite+vue2打包配置文件配置表
    Jackson框架处理多态类
    以脚本形式运行python库
  • 原文地址:https://blog.csdn.net/CWQLTYH/article/details/139226189