首先是数码屏的真值表
再是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; //清看门狗溢出标志,并且喂狗
}
}
|
|