TM1640驱动8段16位数码管很好用,贴一个已经调试好的代码供大家参考
[mw_shl_code=c,true]/******************** (C) COPYRIGHT****************************
* File Name : TM1640.c
* Author :
* Version : V1.0
* Date : 2016
* Description : LED 数码管 驱动函数
****************************************************************/
#include "TM1640.h"
#include "Application.h"
//*************************************************************
//*********START***********************************************
static void TmStart() //1640开始
{
//TMSCLK(0);
TMDIN(1);
nop();
nop();
nop();
nop();
TMSCLK(1);
nop();
nop();
nop();
nop();
TMDIN(0);
nop();
nop();
nop();
nop();
TMSCLK(0);
nop();
nop();
nop();
nop();
}
//**************************************************************
static void TmStop() //1640结束
{
TMSCLK(0);
nop();
nop();
nop();
nop();
TMDIN(0);
TMSCLK(1);
nop();
nop();
nop();
nop();
TMDIN(1);
nop();
nop();
nop();
nop();
TMSCLK(1);
nop();
nop();
nop();
nop();
nop();
}
//***********************************************************
static void TmWrite(u8 date) //1640写字节
{
u8 i,aa;
aa=date;
//TMDIN(0);
//TMSCLK(0);
for(i=0;i<8;i++)
{
TMSCLK(0);
if(aa&0x01)
{
TMDIN(1);
nop();
nop();
nop();
nop();
}
else
{
TMDIN(0);
nop();
nop();
nop();
nop();
}
TMSCLK(1);
nop();
nop();
nop();
aa=aa>>1;
}
//TMSCLK(0);
//TMDIN(0);
}
/*****************************************************************************************
Description : 向TM1640发送显示数据
*****************************************************************************************/
void SysTmSendAutoAddr(u8 startaddr, u8 endaddr, u8 *dat,u8 light ,bool state)
{
u8 nCount;
u8 value = 0;
TmStart();
//高四位数据类型 低四位是命令
//设置数据,地址加1模式
TmWrite(0x40 | 0x00);
TmStop();
TmStart();
//地址命令设置 高四位数据类型 低四位是显示地址
TmWrite(0xC0 | startaddr);
for(nCount=0;nCount <= endaddr - startaddr ;nCount++)
{
TmWrite(*dat);
dat++;
}
TmStop();
TmStart();
/*
显示控制命令:
MSB LSB
B7 B6 B5 B4 B3 B2 B1 B0
1 0 0 0 1 0 0 0 设置脉冲宽度为 1/16
1 0 0 0 1 0 0 1 设置脉冲宽度为 2/16
1 0 0 0 1 0 1 0 设置脉冲宽度为 4/16
1 0 0 0 1 0 1 1 设置脉冲宽度为 10/16
1 0 0 0 1 1 0 0 设置脉冲宽度为 11/16
1 0 0 0 1 1 0 1 设置脉冲宽度为 12/16
1 0 0 0 1 1 1 0 设置脉冲宽度为 13/16
1 0 0 0 1 1 1 1 设置脉冲宽度为 14/16
1 0 0 0 0 X X X 显示开关设置 显示关
1 0 0 0 1 X X X 显示开关设置 显示开
*/
//显示控制 高4位命令 低4位B3-B0 B3控制亮灭,B2-B0设置亮度
LIMIT(0,light,7);
if(state == TRUE )
{
value =0x80 | light | 0x08;
}
else
{
value =0x80 | light ;
value = value & (~0x08);//关闭显示
}
TmWrite(value); //控制显示,开显示,脉冲宽度为14/16
TmStop();
}
/*****************************************************************************************
Description : 向TM1640发送显示数据设置显示地址
*****************************************************************************************/
void SysTmSendSetAddr(u8 addr, u8 dat, u8 light, bool state)
{
//u8 nCount;
u8 value;
TmStart();
//高四位数据类型 低四位是命令
//设置数据,地址固定
TmWrite(0x40 | 0x04);
TmStop();
TmStart();
//地址命令设置 高四位数据类型 低四位是显示地址
LIMIT(0,addr,11);
TmWrite(0xC0 | addr);
TmWrite(dat);
TmStop();
TmStart();
/*
显示控制命令:
MSB LSB
B7 B6 B5 B4 B3 B2 B1 B0
1 0 0 0 1 0 0 0 设置脉冲宽度为 1/16
1 0 0 0 1 0 0 1 设置脉冲宽度为 2/16
1 0 0 0 1 0 1 0 设置脉冲宽度为 4/16
1 0 0 0 1 0 1 1 设置脉冲宽度为 10/16
1 0 0 0 1 1 0 0 设置脉冲宽度为 11/16
1 0 0 0 1 1 0 1 设置脉冲宽度为 12/16
1 0 0 0 1 1 1 0 设置脉冲宽度为 13/16
1 0 0 0 1 1 1 1 设置脉冲宽度为 14/16
1 0 0 0 0 X X X 显示开关设置 显示关
1 0 0 0 1 X X X 显示开关设置 显示开
*/
//显示控制 高4位命令 低4位B3-B0 B3控制开关,B2-B0设置亮度
LIMIT(0,light,7);
if(state == TRUE )
{
value =0x80 | light | 0x08;
}
else
{
value =0x80 | light ;
value = value & (~0x08);//关闭显示
}
TmWrite(value); //控制显示,开显示,脉冲宽度为14/16
TmStop();
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>