打印
[51单片机]

分享一个TM1668驱动代码,可静态点亮数码管

[复制链接]
6498|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rankey|  楼主 | 2021-8-24 20:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
首先是数码屏的真值表



再是TM1668与数码屏的管脚连接



上代码:
#ifndef __TM1668_H__  
#define __TM1668_H__
#include "SH79F326.h"
#include "user.h"
/***TM1668控制引脚定义   ***/
#define   TM1668_DIO     P0_1
#define   TM1668_CLK     P0_2
#define   TM1668_STB     P5_0

void TM1668_Init (void);
void  TM1668_STB_High(void);
void  TM1668_STB_Low(void);
void Tm1668_ClearDisplay(void);  //清屏
void TM1668_Write_Dat (UCHAR dat);
void TM1668_Write_Command(UCHAR CMD);
void TM1668_Write_Addr (UINT16  dat);  //固定写显示  高8位是地址+低8位是显示数据
void TM1668_GrayScale(UCHAR dat);      //亮度调节
//在STB下降沿后由DIO输入的第1个字节作为一条指令 B7 B6的组合区别不同的指令
//   B7      B6      指令
//   0       0       显示模式设置命令
//   0       1       数据读写设置命令
//   1       0       显示控制命令
//   1       1       地址设置命令
#define    MODE_COMMAND  0X00    //显示模式设置指令
#define    DATA_COMMAND  0X40    //数据读写设置指令
#define    DISP_COMMAND  0x80    //显示控制指令
#define    ADDR_COMMAND  0XC0    //地址设置指令
/**** 详细说明******/
#define    MODE_COMMAND  0X00    //显示模式设置指令
//       显示模式     B1 B0
#define MODE_4W13D    0x00    //4位13段
#define MODE_5W12D    0x01    //5位12段
#define MODE_6W11D    0x02    //6位11段
#define MODE_7W10D    0x03    //7位10段   【Shabbat用到的模式】
//真正调用某指令 如7位10段  MODE_COMMAND|MODE_7W10D 即可
#define    DATA_COMMAND  0X40    //数据读写设置指令
//数据   B3 B2 B1 B0
#define DATA_WRITEMODE      0X00      //写数据到显示寄存器
#define DATA_READMODE       0X02      //读按键扫描数据
#define DATA_AUTOADDADDRESS 0X00      //地址自动加1模式
#define DATA_FIXADDRESS     0X04     //固定地址模式
//例:设置写数据 固定地址 DATA_COMMAND|DATA_WRITEMODE|DATA_FIXADDRESS
#define    DISP_COMMAND  0x80    //显示控制指令
//显示控制 B3 B2 B1 B0  共8级辉度可调
#define DISP_GrayScale_OFF 0x00 //关显示
#define DISP_GrayScale_ON  0x08 //开显示
#define DISP_GrayScale1    0x00 //灰度等级1
#define DISP_GrayScale2    0x01 //灰度等级2
#define DISP_GrayScale3    0x02 //灰度等级3
#define DISP_GrayScale4    0x03 //灰度等级4
#define DISP_GrayScale5    0x04 //灰度等级5
#define DISP_GrayScale6    0x05 //灰度等级6
#define DISP_GrayScale7    0x06 //灰度等级7
#define DISP_GrayScale8    0x07 //灰度等级8
//例:设置开显示 辉度2  DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale2
#define    ADDR_COMMAND  0XC0    //地址设置指令
/*对TM1668,地址 B3 B2 B1 B0 。有效的显示地址最多为14个(c0H-cDH),如果地址设为cEH或更高,数据被忽
略,直到有效地址被设定。上电时,地址默认设为c0H。*/
#define ADDR_SFR_00H  0Xc0
#define ADDR_SFR_01H  0Xc1
#define ADDR_SFR_02H  0Xc2
#define ADDR_SFR_03H  0Xc3
#define ADDR_SFR_04H  0Xc4
#define ADDR_SFR_05H  0Xc5
#define ADDR_SFR_06H  0Xc6
#define ADDR_SFR_07H  0Xc7
#define ADDR_SFR_08H  0Xc8
#define ADDR_SFR_09H  0Xc9
#define ADDR_SFR_0AH  0XcA
#define ADDR_SFR_0BH  0XcB
#define ADDR_SFR_0CH  0XcC
#define ADDR_SFR_0DH  0XcD
//例:设置地址0x01有效  ADDR_COMMAND|ADDR_SFR_01H
#define GRID1_ADDR     ADDR_COMMAND|ADDR_SFR_00H
#define GRID2_ADDR     ADDR_COMMAND|ADDR_SFR_02H
#define GRID3_ADDR     ADDR_COMMAND|ADDR_SFR_04H
#define GRID4_ADDR     ADDR_COMMAND|ADDR_SFR_06H
#define GRID5_ADDR     ADDR_COMMAND|ADDR_SFR_08H
#define GRID6_ADDR     ADDR_COMMAND|ADDR_SFR_0AH
#define GRID7_ADDR     ADDR_COMMAND|ADDR_SFR_0CH
#endif

/*---------------------------------------------------------------------
                    定义功能函数
  作者:rankey     创建日期:2021.8.21    最后修改日期:2021.8.21
   TM1668相关的函数定义
  版本:1.0
-----------------------------------------------------------------------*/
#include "TM1668.h"
#include "user.h"
     UINT16 code  GRID1[]={0xc000,0xc006,0xc039};   //数组的数据是16位,高8位是TM1668的地址,低8位是显示数据         
     UINT16 code  GRID2[]={0xc2BF,0xc286,0xc2DB,0xc2CF,0xc2E6,0xc2ED,0xc2FD,0xc287,0xc2FF,0xc2EF,0xc280};  
     UINT16 code  GRID3[]={0xc4BF,0xc486,0xc4DB,0xc4CF,0xc4E6,0xc4ED,0xc4FD,0xc487,0xc4FF,0xc4EF,0xc480};
     UINT16 code  GRID4[]={0xc63F,0xc606,0xc65B,0xc64F,0xc666,0xc66D,0xc67D,0xc607,0xc67F,0xc66F};                     
     UINT16 code  Tubiao[]={0xccf0,0xca03,0xca04,0xca0c,0xca30,0xcc07,0xc83f};                              

/*****************************************************
函数功能:TM1668_STB拉低
***************************************************/
void  TM1668_STB_Low(void)
{
INSCON |= 0x40;  //选中bank1 中颖单片机要这样操作
TM1668_STB =  Low;   //拉低
INSCON &= 0xBF; //1011 1111 切换至BANK0
}
/*****************************************************
函数功能:TM1668_STB拉高
***************************************************/
void  TM1668_STB_High(void)
{
INSCON |= 0x40;  //选中bank1  中颖单片机要这样操作
TM1668_STB =  High;   //拉高
INSCON &= 0xBF; //1011 1111 切换至BANK0  中颖单片机要这样操作
}
/*****************************************************
函数1功能:TM1668初始化 ,全亮或全灭
***************************************************/
void TM1668_Init ( )
{
    Tm1668_ClearDisplay();  //清屏,
   TM1668_GrayScale(2); //亮度2级
}
/*****************************************************
函数2功能:写命令     函数形参:命令参数
***************************************************/
void TM1668_Write_Command(UCHAR CMD)
{
  TM1668_STB_Low();
  delay7uS();      //延时7uS
  TM1668_Write_Dat (CMD);  //写入CMD这个数据
  TM1668_STB_High(); //拉高
  delay7uS();       //延时7uS
}
/*****************************************************
函数3功能:清屏   //发送0x00,全熄灭,发送0xff,全点亮
***************************************************/
void Tm1668_ClearDisplay(void)
{
  UCHAR  CNT_ClearDisplay_i;
  TM1668_Write_Command(MODE_COMMAND|MODE_7W10D);//发送显示模式设置指令,设置7位10段模式
  TM1668_Write_Command(DATA_COMMAND|DATA_WRITEMODE);//发送数据读写指令:写数据到显示寄存器  
  TM1668_STB_Low();    //拉低
  delay7uS();        //延时7uS
  TM1668_Write_Dat (ADDR_COMMAND|DATA_AUTOADDADDRESS);//发送地址设置命令,地址自动加1模式
   for(CNT_ClearDisplay_i;CNT_ClearDisplay_i<14;CNT_ClearDisplay_i++)
  {
   TM1668_Write_Dat(0x00);   //发送显示数据
  }  
   TM1668_STB_High();//拉高
   delay7uS();       //延时7uS  
}
/*****************************************************
函数4功能: 写数据    函数形参:命令参数
***************************************************/
void TM1668_Write_Dat (UCHAR dat)
{
UCHAR  CNT_Write_Dat_i;
for(CNT_Write_Dat_i=0;CNT_Write_Dat_i<8;CNT_Write_Dat_i++)
  {
  TM1668_CLK = Low ;//先拉低CLK,为发送1Bit数据做准备
  delay7uS();  
  TM1668_DIO = (dat&0x01);  
  delay7uS();        //延时7uS
  TM1668_CLK = High ; //拉高CLK,发送1Bit数据
  delay7uS();        //延时7uS
  dat>>=1;           //数据右移1位再赋值自己   
  delay7uS();        //延时7uS
}
}
/*****************************************************
函数5功能: 地址固定模式写显示    函数形参:地址+data
***************************************************/
void TM1668_Write_Addr(UINT16  dat)
{
  UCHAR  temp[2];
  temp[0]=dat&0xFF; //取低8位的显示数据
  temp[1]=dat>>8;    //取高8位的地址  
  TM1668_Write_Command(MODE_COMMAND|MODE_7W10D);//发送显示模式设置指令,设置7位10段模式
  TM1668_Write_Command(DATA_COMMAND|DATA_FIXADDRESS);  //数据读写设置命令,固定地址模式
  TM1668_STB_Low();    //拉低
   delay7uS();        //延时7uS
   TM1668_Write_Dat (temp[1]); //写地址
   TM1668_Write_Dat (temp[0]);  //写数据
   TM1668_STB_High(); //拉高
   delay7uS();        //延时7uS
  TM1668_GrayScale(2); //亮度2级
}
/*****************************************************
函数6功能: 用于亮度调节 0 - 9    函数形参:亮度 0 - 8
***************************************************/
void TM1668_GrayScale(UCHAR dat)      //亮度调节
{
switch(dat)
  {                      //DISP_COMMAND     0x80    显示控制指令
                          //DISP_GrayScale1    0x00    灰度等级1
   case(0): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_OFF);break;     //关闭
   case(1): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale1);  break;
   case(2): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale2);  break;
   case(3): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale3);  break;        
   case(4): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale4);  break;
   case(5): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale5);  break;
   case(6): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale6);  break;
   case(7): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale7);  break;
   case(8): TM1668_Write_Command(DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale8);  break;
  }  
}

上主函数:
#include "SH79F326.h"
#include "intrins.h"
#include "user.h"
#include "time.h"
#include "fun_define.c"      //功能函数的定义C文件
#include "TM1668_Fun_define.c"   //TM1668功能函数的定义C文件
/***********Main Program*************/
void main()
{  
    sysclk_int( );
    _nop_();
    delay7uS(); //延迟7uS
    Port_Initial( );
    delay7uS(); //延迟7uS  
    init_timer3( );
    _nop_();
    delay(1);   //延迟8uS
    Timer3_On( );
   _nop_();
   TM1668_Init ( );     
/***********main loop*************/
   while(1)
  {   
      TM1668_Write_Addr(GRID1[1]|GRID1[2]);  //点亮B1 C1所对应的1 ;   A1,E1,F1,D1所对应的框
      TM1668_Write_Addr(Tubiao[3]);                //点亮C6,D6所对应的框

    RSTSTAT=0x03;  //清看门狗溢出标志,并且喂狗     
  }

}






使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2021-8-25 14:35 | 只看该作者
void Tm1668_ClearDisplay(void)
{
  UCHAR  CNT_ClearDisplay_i;
  TM1668_Write_Command(MODE_COMMAND|MODE_7W10D);//发送显示模式设置指令,设置7位10段模式
  TM1668_Write_Command(DATA_COMMAND|DATA_WRITEMODE);//发送数据读写指令:写数据到显示寄存器  
  TM1668_STB_Low();    //拉低
  delay7uS();        //延时7uS
  TM1668_Write_Dat (ADDR_COMMAND|DATA_AUTOADDADDRESS);//发送地址设置命令,地址自动加1模式
   for(CNT_ClearDisplay_i;CNT_ClearDisplay_i<14;CNT_ClearDisplay_i++)
  {
   TM1668_Write_Dat(0x00);   //发送显示数据
  }  
   TM1668_STB_High();//拉高
   delay7uS();       //延时7uS  
}

for(CNT_ClearDisplay_i;CNT_ClearDisplay_i<14;CNT_ClearDisplay_i++)
变量都不赋值直接使用

使用特权

评论回复
板凳
rankey|  楼主 | 2021-8-25 18:53 | 只看该作者
ayb_ice 发表于 2021-8-25 14:35
void Tm1668_ClearDisplay(void)
{
  UCHAR  CNT_ClearDisplay_i;

函数域内的局部变量,进函数生成后,默认值是0,函数执行完,系统就回收了。再说keil C51编译没报错

使用特权

评论回复
地板
ayb_ice| | 2021-8-26 08:24 | 只看该作者
rankey 发表于 2021-8-25 18:53
函数域内的局部变量,进函数生成后,默认值是0,函数执行完,系统就回收了。再说keil C51编译没报错 ...

哪个老师教你的,这么自信

使用特权

评论回复
5
rankey|  楼主 | 2021-8-29 10:48 | 只看该作者
ayb_ice 发表于 2021-8-26 08:24
哪个老师教你的,这么自信

感谢老铁的善意提醒 小弟以后多加注意

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

181

帖子

4

粉丝