rankey 发表于 2021-8-24 20:21

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

首先是数码屏的真值表



再是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);
voidTM1668_STB_High(void);
voidTM1668_STB_Low(void);
void Tm1668_ClearDisplay(void);//清屏
void TM1668_Write_Dat (UCHAR dat);
void TM1668_Write_Command(UCHAR CMD);
void TM1668_Write_Addr (UINT16dat);//固定写显示高8位是地址+低8位是显示数据
void TM1668_GrayScale(UCHAR dat);      //亮度调节
//在STB下降沿后由DIO输入的第1个字节作为一条指令 B7 B6的组合区别不同的指令
//   B7      B6      指令
//   0       0       显示模式设置命令
//   0       1       数据读写设置命令
//   1       0       显示控制命令
//   1       1       地址设置命令
#define    MODE_COMMAND0X00    //显示模式设置指令
#define    DATA_COMMAND0X40    //数据读写设置指令
#define    DISP_COMMAND0x80    //显示控制指令
#define    ADDR_COMMAND0XC0    //地址设置指令
/**** 详细说明******/
#define    MODE_COMMAND0X00    //显示模式设置指令
//       显示模式   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_COMMAND0X40    //数据读写设置指令
//数据   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_COMMAND0x80    //显示控制指令
//显示控制 B3 B2 B1 B0共8级辉度可调
#define DISP_GrayScale_OFF 0x00 //关显示
#define DISP_GrayScale_ON0x08 //开显示
#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
//例:设置开显示 辉度2DISP_COMMAND|DISP_GrayScale_ON|DISP_GrayScale2
#define    ADDR_COMMAND0XC0    //地址设置指令
/*对TM1668,地址 B3 B2 B1 B0 。有效的显示地址最多为14个(c0H-cDH),如果地址设为cEH或更高,数据被忽
略,直到有效地址被设定。上电时,地址默认设为c0H。*/
#define ADDR_SFR_00H0Xc0
#define ADDR_SFR_01H0Xc1
#define ADDR_SFR_02H0Xc2
#define ADDR_SFR_03H0Xc3
#define ADDR_SFR_04H0Xc4
#define ADDR_SFR_05H0Xc5
#define ADDR_SFR_06H0Xc6
#define ADDR_SFR_07H0Xc7
#define ADDR_SFR_08H0Xc8
#define ADDR_SFR_09H0Xc9
#define ADDR_SFR_0AH0XcA
#define ADDR_SFR_0BH0XcB
#define ADDR_SFR_0CH0XcC
#define ADDR_SFR_0DH0XcD
//例:设置地址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 codeGRID1[]={0xc000,0xc006,0xc039};   //数组的数据是16位,高8位是TM1668的地址,低8位是显示数据         
   UINT16 codeGRID2[]={0xc2BF,0xc286,0xc2DB,0xc2CF,0xc2E6,0xc2ED,0xc2FD,0xc287,0xc2FF,0xc2EF,0xc280};
   UINT16 codeGRID3[]={0xc4BF,0xc486,0xc4DB,0xc4CF,0xc4E6,0xc4ED,0xc4FD,0xc487,0xc4FF,0xc4EF,0xc480};
   UINT16 codeGRID4[]={0xc63F,0xc606,0xc65B,0xc64F,0xc666,0xc66D,0xc67D,0xc607,0xc67F,0xc66F};                     
   UINT16 codeTubiao[]={0xccf0,0xca03,0xca04,0xca0c,0xca30,0xcc07,0xc83f};                              

/*****************************************************
函数功能:TM1668_STB拉低
***************************************************/
voidTM1668_STB_Low(void)
{
INSCON |= 0x40;//选中bank1 中颖单片机要这样操作
TM1668_STB =Low;   //拉低
INSCON &= 0xBF; //1011 1111 切换至BANK0
}
/*****************************************************
函数功能:TM1668_STB拉高
***************************************************/
voidTM1668_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)
{
UCHARCNT_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)
{
UCHARCNT_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(UINT16dat)
{
UCHARtemp;
temp=dat&0xFF; //取低8位的显示数据
temp=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); //写地址
   TM1668_Write_Dat (temp);//写数据
   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|GRID1);//点亮B1 C1所对应的1 ;   A1,E1,F1,D1所对应的框
      TM1668_Write_Addr(Tubiao);                //点亮C6,D6所对应的框

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

}






ayb_ice 发表于 2021-8-25 14:35

void Tm1668_ClearDisplay(void)
{
UCHARCNT_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)
{
UCHARCNT_ClearDisplay_i;


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

ayb_ice 发表于 2021-8-26 08:24

rankey 发表于 2021-8-25 18:53
函数域内的局部变量,进函数生成后,默认值是0,函数执行完,系统就回收了。再说keil C51编译没报错 ...

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

rankey 发表于 2021-8-29 10:48

ayb_ice 发表于 2021-8-26 08:24
哪个老师教你的,这么自信

感谢老铁的善意提醒 {:handshake:}{:handshake:}{:handshake:}小弟以后多加注意
页: [1]
查看完整版本: 分享一个TM1668驱动代码,可静态点亮数码管