在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → TM1640驱动程序

TM1640驱动程序

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:9.28KB
  • 下载次数:19
  • 浏览次数:219
  • 发布时间:2021-07-26
  • 实例类别:嵌入式开发
  • 发 布 人:zjyzfn
  • 文件格式:.h
  • 所需积分:5
 相关标签: TM1640驱动程序

实例介绍

【实例简介】

TM1640驱动程序

【实例截图】


【核心代码】

/**
 TM1640驱动程序
**/
#include <INTRINS.H>
//#include "_sys.h"

/**=====================================================================
 宏、类型、常量、变量定义
=====================================================================**/

/*TM1640的SRAM写数据格式-----------
 B7 B6 0 0 - - - -
  0  1 0 0 - - - -  寻址模式(1 Byte)
  1  1 0 0 - - - -  显存地址(1 Byte)
  data 1~N          数据传输(最多16 Byte) 固定地址时为一地址一数据
  1  0 0 0 - - - -  显示控制(1 Byte)
 指令类型:
            B7 B6 - - - - - -
 寻址模式:  0  1  
 显示控制:  1  0  
 显存地址:  1  1  
---------------------------------*/
#define DATA_MODE_AUTO   0x40  //地址自动加1/普通模式
#define DATA_MODE_FIXED  0x44  //固定地址
//#define DATA_MODE_TEST   0x48  //测试模式
/*寻址模式-------------------------
 自动地址 1: 01000000            0x40
 固定地址  : 01000100            0x44
 普通模式  : 01000000            0x40
 测试模式  : 01001000 (内部使用) 0x48
---------------------------------*/

#define DIS_EN     0x8A  //显示开
//#define DIS_DIS    0x80  //显示关
/*显示控制-------------------------
           B7 B6 - - B3 B2 B1 B0 (脉冲宽度)
 显示开关: 1  0  0 0 0  -  -  -  显示关  0x80
           1  0  0 0 1  -  -  -  显示开  0x88
 消光数量: 1  0  0 0 1  0  0  0    1/16  0x88
 (即亮度)  1  0  0 0 1  0  0  1    2/16  0x89
           1  0  0 0 1  0  1  0    4/16  0x8A
           1  0  0 0 1  0  1  1   10/16  0x8B
           1  0  0 0 1  1  0  0   11/16  0x8C
           1  0  0 0 1  1  0  1   12/16  0x8D
           1  0  0 0 1  1  1  0   13/16  0x8E
           1  0  0 0 1  1  1  1   14/16  0x8F
---------------------------------*/

/*显存地址-------------------------
           B7 B6 - - B3 B2 B1 B0 (显示单元)
     0xC0  1  1  0 0 0  0  0  0  GRID1
     0xC1  1  1  0 0 0  0  0  1  GRID2
     0xC2  1  1  0 0 0  0  1  0  GRID3
     0xC3  1  1  0 0 0  0  1  1  GRID4
     0xC4  1  1  0 0 0  1  0  0  GRID5
     0xC5  1  1  0 0 0  1  0  1  GRID6
     0xC6  1  1  0 0 0  1  1  0  GRID7
     0xC7  1  1  0 0 0  1  1  1  GRID8
     0xC8  1  1  0 0 1  0  0  0  GRID9
     0xC9  1  1  0 0 1  0  0  1  GRID10
     0xCA  1  1  0 0 1  0  1  0  GRID11
     0xCB  1  1  0 0 1  0  1  1  GRID12
     0xCC  1  1  0 0 1  1  0  0  GRID13
     0xCD  1  1  0 0 1  1  0  1  GRID14
     0xCE  1  1  0 0 1  1  1  0  GRID15
     0xCF  1  1  0 0 1  1  1  1  GRID16
---------------------------------*/

#define FIRST_ADDR  0xC0  //起始地址

/*======================================================================
 函数/功能主题描述/端口及常量、变量定义
======================================================================*/
// 端口定义
sbit DisDIN  = P3^0;     //显示端口-数据端
sbit DisCLK  = P3^1;     //显示端口-时钟端
/*---------------------------------
 DIN : 显示端口-数据端
 DisCLK: 显示端口-时钟端
---------------------------------*/

u8  DisBuf[13];     //显示缓存
/*---------------------------------
 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 │No.│ E │ r │ - │ 8 │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │
 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
 DisBuf[12] -LED-S
 DisBuf[11] -No. , 开关编号
 DisBuf[10] -'-' , 分隔符/错误符'E'
 DisBuf[09] -sta , 开关状态(H/L/r)-高电平/低电平/错误符'r'
 DisBuf[08] -'-' , 分隔符, 每秒闪一次(作MCU运行状态指示)
 DisBuf[7~0]-cnt , 开关计数器
 
 实际电路:
  缓存地址  显存地址  引脚   功能
 DisBuf[12]   0xCC     18    -S6 -sta , 开关状态(H/L/r)-高电平/低电平/错误符'r'
 DisBuf[11]   0xCB     19    -S1 -'-' , 分隔符, 每秒闪一次(作MCU运行状态指示)
 DisBuf[10]   0xCA     20    -S2 -cnt , 计数器-千万
 DisBuf[ 9]   0xC9     21    -S4 -No. , 开关编号(1,2)
 DisBuf[ 8]   0xC8     22    -S10-cnt , 计数器-十万
 DisBuf[ 7]   0xC7     23    -S5 -'-' , 分隔符/错误符'E'
 DisBuf[ 6]   0xC6     24    -LED-S
 DisBuf[ 5]   0xC5     25    -S11-cnt , 计数器-万
 DisBuf[ 4]   0xC4     26    -S12-cnt , 计数器-千
 DisBuf[ 3]   0xC3     27    -S7 -cnt , 计数器-百
 DisBuf[ 2]   0xC2     28    -S8 -cnt , 计数器-十
 DisBuf[ 1]   0xC1     01    -S3 -cnt , 计数器-百万
 DisBuf[ 0]   0xC0     02    -S9 -cnt , 计数器-个
 
 显示位置:
   S4  S5  S6  S1  S2  S3
 ┌───┬───┬───┬───┬───┬───┐
 │No.│ E │ r │ - │ 8 │ 7 │
 └───┴───┴───┴───┴───┴───┘
 ┌───┬───┬───┬───┬───┬───┐
 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │
 └───┴───┴───┴───┴───┴───┘
  S10 S11 S12  S7  S8  S9
---------------------------------*/

u8 code SegCode[]={
    //0x3F, 0x06, 0x5B, 0x4F, 0x66,  //  0~ 4: 0 1 2 3 4
    //0x6D, 0x7D, 0x07, 0x7F, 0x6F,  //  5~ 9: 5 6 7 8 9
    //0x77, 0x7C, 0x39, 0x5E, 0x79,  // 10~14: A b C d E
    //0x71, 0x76, 0x38, 0x50, 0x54,  // 15~19: F H L r n
    //0x1C, 0x73, 0x5C, 0x40, 0x00   // 20~24: u P o - null(熄灭)
    
    /*实际顺序及编码---------------
      7 6  5 4 3 2 1 0
      d dp b a f c g e  <- dp g f e d c b a  0=1011 1101=0xBD
    -----------------------------*/
    0xBD, 0x24, 0xB3, 0xB6, 0x2E,    //  0~ 4: 0 1 2 3 4
    0x9E, 0x9F, 0x34, 0xBF, 0xBE,    //  5~ 9: 5 6 7 8 9
    0x3F, 0x8F, 0x99, 0xA7, 0x9B,    // 10~14: A b C d E
    0x1B, 0x2F, 0x89, 0x03, 0x07,    // 15~19: F H L r n
    0x85, 0x3B, 0x8B, 0x02, 0x00     // 20~24: u P t - null(熄灭)
};

/**=====================================================================
 驱动功能函数
 SCLK: ──┐                   SCLK:  ┌──
         └─                        ─┘
  DIN: ─┐    //开始           DIN:   ┌─  //结束
        └──                        ──┘
          7   6   5   4   3   2   1   0
 传输:   ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─
       ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘
        ┌───┐───┌───┐───┌───┐───┌───┐───┐ ┌
       ─┘───└───┘───└───┘───└───┘───└───┘─┘  
          7   6   5   4   3   2   1   0
=====================================================================**/
//开始-----------------------------
void start(void){  //首次开始前(初始化期间)先触发1次结束, 以使SCLK=1, DIN=1
  DisDIN = 0;      //DIN由H→L, 开始
  DisCLK = 0;      //置SCLK为L, 为发送DIN位作准备
}
//发送数据-------------------------
void Send_DisDat(u8 dx){
  u8 i;
  for(i=0; i<8; i ){          //开始时已置SCLK=0
    DisDIN = (bit)(dx & 0x01); //发送位, 低位先传
    DisCLK = 1;                //位发送结束-DIN信号保持
    dx   >>= 1;
    DisCLK = 0;                //置SCLK=0, 为发送下一位/结束准备
  }
  //DisDIN = 0;
}
//结束-----------------------------
void stop(void){
  DisDIN = 0;
  DisCLK = 1;                  //置SCLK为H-结束准备
  DisDIN = 1;                  //DIN由L→H, 结束, 为下一次开始准备
}

/**=====================================================================
 函数名称: Update_DisDat
 输    入: addrn-显存地址编号
 功能描述: 更新dx指定的地址的数据
 说    明: 
=====================================================================**/
void Update_DisDat(u8 addrn){
  start(); Send_DisDat(DATA_MODE_FIXED); stop(); //固定地址
  start();
    Send_DisDat(addrn 0xC0);                   //指定地址
    Send_DisDat(DisBuf[addrn]);                  //数据传输-1字符
  stop();
  //start(); Send_DisDat(DIS_EN);         stop(); //显示开
}

/**=====================================================================
 函数名称: UpdateAllDisDat
 输    入: 无
 功能描述: 更新所有显示数据
 说    明: 
=====================================================================**/
/*void UpdateAllDisDat(void){
  u8 i;
  //start(); Send_DisDat(DIS_DIS);        stop(); //显示关
  start(); Send_DisDat(DATA_MODE_AUTO); stop(); //自动地址
  start(); Send_DisDat(FIRST_ADDR);             //起始地址
  for(i=0; i<13; i ){                          //数据传输开始-13字符
    Send_DisDat(DisBuf[i]);
  }
  stop();                                       //数据传输结束
  start(); Send_DisDat(DIS_EN);         stop(); //显示开
}*/

/**=====================================================================
 函数名称: DisStdCh
 输    入: pn-闪烁位置
 功能描述: 字符闪烁状态切换
 说    明: 
=====================================================================**/
void DisStdCh(u8 pn){
  static u8 preScn;
  static bit std = 0;           //状态
  if(std){                      //显示
    if(DisBuf[pn]==SegCode[24]){DisBuf[pn] = preScn;}
  }else{
    preScn     = DisBuf[pn];
    DisBuf[pn] = SegCode[24];   //熄灭
  }
  std = ~std;                   //切换状态
}

/**=====================================================================
 函数名称: Dis_Init()
 输    入: rn-开关编号, dat[]-计数器
 功能描述: 错误时对应的编号闪烁
 说    明: 
=====================================================================**/
void DisBufInit(void){
  stop();                               //触发1次结束, 以使SCLK=1, DIN=1
  start(); Send_DisDat(DATA_MODE_AUTO); stop(); //自动地址
  start();
    Send_DisDat(0xCD);                  //起始地址
    Send_DisDat(SegCode[24]);           //0xCD~0xCF熄灭
    Send_DisDat(SegCode[24]);
    Send_DisDat(SegCode[24]);
  stop();
  start(); Send_DisDat(DIS_EN);         stop(); //显示开
}


标签: TM1640驱动程序

实例下载地址

TM1640驱动程序

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警