一、参考资料
DS通过立创商城可以找到
https://item.szlcsc.com/20288.html?c=4SG
二、流程
这里只说 地址增加模式
1、先发显示模式
2、设置数据命令
3、设置地址
4、连续发12个数据
5、发控制命令(设置亮度)
三、实际操作
我这里一共2个数码管,共阴
连的是GRID1 GRID2 ,也就是位选1 和 位选2 ,地址从00H开始,也就是0XC0
其实只要是用连续模式,最好是从设置的起始地址,往最后0BH全部写完为止
这里可以看出来,如果我们用8段,基本上发送一个数据,后面就跟一个0X00就行
例如6位全部发,就按照下面顺序发
G1数据 00
G2数据 00
G3数据 00
G4数据 00
G5数据 00
G6数据 00
一共12字节
char CODE[10]={0x3F,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴数码管
#define AddrAutoAdd 0x40//写显示,自动累加地址
#define Addr00H 0xC0//地址00H
#define ModeDisTM1620 0x02
static void App_UserKeyInit(void)
{
// stc_gpio_cfg_t stcGpioCfg;
///< 打开GPIO外设时钟门控
//Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
///< 端口方向配置->输入
// stcGpioCfg.enDir = GpioDirIn;
///< 端口驱动能力配置->高驱动能力
// stcGpioCfg.enDrv = GpioDrvL;
///< 端口上下拉配置->无
// stcGpioCfg.enPu = GpioPuDisable;
// stcGpioCfg.enPd = GpioPdDisable;
///< 端口开漏输出配置->开漏输出关闭
// stcGpioCfg.enOD = GpioOdDisable;
///< 端口输入/输出值寄存器总线控制模式配置->AHB
// stcGpioCfg.enCtrlMode = GpioAHB;
///< GPIO IO USER KEY初始化
// Gpio_Init(EVB_KEY1_PORT, EVB_KEY1_PIN, &stcGpioCfg);
}
void TM1620Sendata(char TM1620Data)
{
char i;
for(i =0;i<8;i++)
{
Gpio_ClrIO(GpioPortB, TM1620_CLK_Pin); //CLK低
if(TM1620Data & 0x01)
{
Gpio_SetIO(GpioPortB, TM1620_DIN_Pin); //DIO高
}
else
{
Gpio_ClrIO(GpioPortB, TM1620_DIN_Pin); //DIO低
}
// delay1ms(1);
//delay1ms(1);
//delay1ms(1);
Gpio_SetIO(GpioPortB, TM1620_CLK_Pin); //CLK高
TM1620Data >>=1;
}
Gpio_ClrIO(GpioPortB, TM1620_CLK_Pin); //CLK低
Gpio_ClrIO(GpioPortB, TM1620_DIN_Pin); //DIO低
}
void TM1620Sencmd(char com)
{
Gpio_SetIO(TM1620_Port, TM1620_STB_Pin); //高
//delay1ms(1);
Gpio_ClrIO(TM1620_Port, TM1620_STB_Pin); //
TM1620Sendata(com);
}
void TM1620_Dis(const char *p,const char *p2)
{
uint8_t i;
TM1620Sencmd(0x02); //设置显示模式,6位8段模式
TM1620Sencmd(AddrAutoAdd); //设置数据命令,采用地址自动加1模式 0X40
//TM1620Sencmd(0x14); //固定地址
TM1620Sencmd(Addr00H); //设置地址从00H开始
TM1620Sendata(*p); //从00H开始,偶数地址送显示数据
TM1620Sendata(0x00); //01H
TM1620Sendata(*p2); //02H
TM1620Sendata(0x00); //03H
//其他数据直接给0了 上面发了4个,下面发8个
for(i = 0 ;i < 8;i++)
{
TM1620Sendata(0x00);
}
TM1620Sencmd(0x8F); //设置显示命令,打开显示并设置占空比14/16.
Gpio_SetIO(TM1620_Port, TM1620_STB_Pin); //高
}
void TM1620_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
stcGpioCfg.enDir = GpioDirOut;
stcGpioCfg.enPu = 1;
Gpio_Init(TM1620_Port,TM1620_CLK_Pin,&stcGpioCfg); //TM1620 CLK
Gpio_SetIO(TM1620_Port, TM1620_CLK_Pin); //高
Gpio_Init(TM1620_Port,TM1620_STB_Pin, &stcGpioCfg); //TM1620 STB
Gpio_SetIO(TM1620_Port, TM1620_STB_Pin); //高
Gpio_Init(TM1620_Port,TM1620_DIN_Pin,&stcGpioCfg); //TM1620 DIN
Gpio_SetIO(TM1620_Port, TM1620_DIN_Pin); //高
}
//显示 一个 3位数据到2位数码管,去掉最低位
TM1620_Dis(&CODE[num/100],&CODE[num%100/10]);
}