分享一个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;//清看门狗溢出标志,并且喂狗
}
}
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++)
变量都不赋值直接使用 ayb_ice 发表于 2021-8-25 14:35
void Tm1668_ClearDisplay(void)
{
UCHARCNT_ClearDisplay_i;
函数域内的局部变量,进函数生成后,默认值是0,函数执行完,系统就回收了。再说keil C51编译没报错 rankey 发表于 2021-8-25 18:53
函数域内的局部变量,进函数生成后,默认值是0,函数执行完,系统就回收了。再说keil C51编译没报错 ...
哪个老师教你的,这么自信 ayb_ice 发表于 2021-8-26 08:24
哪个老师教你的,这么自信
感谢老铁的善意提醒 {:handshake:}{:handshake:}{:handshake:}小弟以后多加注意
页:
[1]