N76E003芯片驱动TM1620芯片显示数码管数字。 代码借鉴了CSDN博主「胡电子」的文章:原文链接https://blog.csdn.net/chuangwu2009/article/details/20994541
#include "N76E003.h"
#include "Common.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define STB_TM1620_CLR P11 =0
#define STB_TM1620_SET P11 =1
#define CLK_TM1620_CLR P13=0
#define CLK_TM1620_SET P13=1
#define DIO_TM1620_CLR P14=0
#define DIO_TM1620_SET P14=1
/*
TM1620是一款数码管驱动集成IC,8段6位,以下是个人编程完成的驱动,供大家参考
*/
#define ModeDisTM1620 0x02
//设置显示模式,6位8段--上电默认是7段8段
#define AddrAutoAdd 0x40//写显示,自动累加地址
//#define AddrFixed 0x44//写显示,固定地址
#define Addr00H 0xC0//地址00H
#define Addr01H 0xC1//地址01H
#define Addr02H 0xC2//地址02H
#define Addr03H 0xC3//地址03H
#define Addr04H 0xC4//地址04H
#define Addr05H 0xC5//地址05H
#define Addr06H 0xC6//地址06H
#define Addr07H 0xC7//地址07H
#define Addr08H 0xC8//地址08H
#define Addr09H 0xC9//地址09H
#define Addr0AH 0xCA//地址0AH
#define Addr0BH 0xCB//地址0BH
#define OpenDisTM1620 0x88//开显示
//#define CloseDisTM1620 0x80//关显示
#define Set1_16TM1620 0X00//设置脉冲宽度为 1/16
#define Set2_16TM1620 0X01//设置脉冲宽度为 2/16
#define Set4_16TM1620 0X02//设置脉冲宽度为 4/16
#define Set10_16TM1620 0X03//设置脉冲宽度为 10/16
#define Set11_16TM1620 0X04//设置脉冲宽度为 11/16
#define Set12_16TM1620 0X05//设置脉冲宽度为 12/16
#define Set13_16TM1620 0X06//设置脉冲宽度为 13/16
#define Set14_16TM1620 0X07//设置脉冲宽度为 14/16
//*************************************
// 函数名称:Tm1620SentData
// 函数功能:向TM1620发数据 8位数据-1个字节的数据
// 入口参数:要操作的数据
// 出口参数:无
// 技术简要:上升沿操作一位 从低位开始操作数据
//***************************************/
void Tm1620SentData(u8 TM1620Data)
{
u8 i;
for(i=0;i<8;i++)
{
CLK_TM1620_CLR;
if(TM1620Data & (1 << i))
{DIO_TM1620_SET;}
else
{DIO_TM1620_CLR;}
CLK_TM1620_SET; //上升沿操作
}
}
u8 LCDBuf[6]={0x3f,0x06,0x5b,0x4f,0x66,0x00};
//*************************************
// 函数名称:Tm1620Dis
// 函数功能:驱动显示数据
// 入口参数:要操作的数据
// 出口参数:无
// 技术简要:20MS操作一次
//***************************************/
void Tm1620Dis(void)
{
STB_TM1620_CLR;
Tm1620SentData(ModeDisTM1620);
//设置显示模式,6位8段--上电默认是7段8段
STB_TM1620_SET;
_nop_();_nop_();
STB_TM1620_CLR;
Tm1620SentData(AddrAutoAdd);
//写显示,自动累加地址
STB_TM1620_SET;
_nop_();_nop_();
STB_TM1620_CLR;
Tm1620SentData(Addr00H);
//指向地址0
Tm1620SentData(LCDBuf[0]);
//向地址0 先数据LCDBuf[0]
Tm1620SentData(0x00);
///让地址递增1
Tm1620SentData(LCDBuf[1]);
//向地址2 先数据LCDBuf[1]
Tm1620SentData(0x00);
Tm1620SentData(LCDBuf[2]);
//向地址4 先数据LCDBuf[2]
Tm1620SentData(0x00);
Tm1620SentData(LCDBuf[3]);
//向地址6 先数据LCDBuf[3]
Tm1620SentData(0x00);
Tm1620SentData(LCDBuf[4]);
//向地址8 先数据LCDBuf[4]
Tm1620SentData(0x00);
Tm1620SentData(LCDBuf[5]);
//向地址A 先数据LCDBuf[5]
STB_TM1620_SET;
_nop_();_nop_();
STB_TM1620_CLR;
Tm1620SentData(OpenDisTM1620|Set1_16TM1620);
//开显示 脉宽 14/16
STB_TM1620_SET;
}
void main(void)
{
Set_All_GPIO_Quasi_Mode;//所有IO设置为双向模式
P11_PushPull_Mode;
P13_PushPull_Mode;
P14_PushPull_Mode;
Tm1620Dis();
while(1)
{
;
}
}