/***********
TM1680 参考程序:
1、A1\A0 采用MCU进行控制,实际使用时,可以将A1\A0任意接高低电平,TM1680 ID改为相应指令即可;
2、该程序采用STC15W 芯片模拟IIC协议,IO口为双向IO口(无需设置输入与输出),如果MCU的IO口需要设置输入和输出,则在ACK时需要设置为输入
3、该芯片支持标准IIC协议
************/
#include
#include "intrins.h"
#include
/****命令宏定义****/
#define TM1680ID 0xe7
#define SYSDIS 0x80
#define SYSEN 0x81
#define LEDOFF 0x82
#define LEDON 0x83
#define BLINKOFF 0x88
#define BLINK2HZ 0x89
#define BLINK1HZ 0x8A
#define BLINK0_5HZ 0x8B
#define SLAVEMODE 0x90
#define RCMODE0 0x98
#define RCMODE1 0x9A
#define EXTCLK0 0x9C
#define EXTCLK1 0x9E
#define COM8NMOS 0xA0
#define COM16NMOS 0xA4
#define COM8PMOS 0xA8
#define COM16PMOS 0xAC
#define PWM01 0xB0
#define PWM02 0xB1
#define PWM03 0xB2
#define PWM04 0xB3
#define PWM05 0xB4
#define PWM06 0xB5
#define PWM07 0xB6
#define PWM08 0xB7
#define PWM09 0xB8
#define PWM10 0xB9
#define PWM11 0xBA
#define PWM12 0xBB
#define PWM13 0xBC
#define PWM14 0xBD
#define PWM15 0xBE
#define PWM16 0xBF
/******命令宏定义******/
/***端口定义***/
sbit SDA=P1^4; //TM1680通讯端口设置
sbit SCL=P1^5;
sbit MA1=P1^6;
sbit MA0=P1^7;
/***按键功能设置***/
sbit KEY0=P3^2;
sbit KEY1=P3^3;
sbit KEY2=P3^6;
/***LED指示灯定义***/
sbit RED=P3^4;
sbit GREEN=P3^5;
sbit WHITE=P3^7;
/***显示数据***/
unsigned char TM1680perseg[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x8};
unsigned char DispA[8]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10};
/***
函数功能:延时函数
***/
void delayms(unsigned int n)
{
unsigned int i;
while(n--)
{
for(i=0;i<550;i++);
}
}
void delayus(unsigned char n) //256
{
while (--n)
{
_nop_();
}
}
/**************************底层函数*****************************/
void TM1680start(void)
{
SDA=1; SCL=1;
SDA=1; delayus(4);
delayus(10);
SDA=0;
delayus(10); //起始信号,必须大于4.7us
SCL=0;
}
void Ack(void)
{
SCL = 0;
delayus(8);
SCL = 1;
delayus(8);
while(SDA);
SCL=0;
delayus(15);
}
void TM1680SetAck(bit ack)
{
SCL=0; delayus(5);
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
delayus(5); //延时
SCL = 0; //拉低时钟线
delayus(5); //延时
}
void TM1680stop(void)
{
SDA=0; SCL=1;
delayus(10);
SDA=1; //停止信号,大于5us
delayus(10);
SCL=1; SDA=1;
}
void TM1680SendByte(unsigned char sbyte)
{
unsigned char i=0;
for(i=0; i<8; i++)
{
SCL=0;delayus(2);
if(sbyte&0x80;)
{
SDA=1; //高位先发
}else{
SDA=0;
}
delayus(3);
SCL=1;
delayus(5); //高电平的时间大于4us
sbyte<<=1;
delayus(2);
}
SCL=0; delayus(3);
SDA=0; delayus(3);
}
unsigned char TM1680RecvByte(void)
{
unsigned char i=0, sbyte;
SDA=1;delayus(6);
for(i=0; i<8; i++)
{
SCL=0;delayus(6);
if(SDA)
{
sbyte |= 0x01 ; //置1
}else{
sbyte &= 0xfe; //置0
}
delayus(3);
SCL=1;
delayus(5); //高电平的时间大于4us
sbyte<<=1;
}
SCL=0;
return sbyte;
}
/******************************底层函数结束**************************/
/******************************功能函数**************************/
/***单字节写操作函数***/
/***写命令函数:开始--ID-ACK--命令-ACK--结束***/
void TM1680WriteCmd(unsigned char scmd)
{
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(scmd);
Ack();
TM1680stop();
}
/***写一个字节数据:
开始--ID-ACK-内部地址-ACK--数据-ACK-结束
***/
void TM1680WriteOneByte(unsigned char faddr, unsigned char sdate)
{
TM1680start();
TM1680SendByte(TM1680ID); //写TM1680器件地址
Ack();
TM1680SendByte(faddr); //eeprom 地址
Ack();
TM1680SendByte(sdate); //写数据
Ack();
TM1680stop();
}
/***
函数功能:页操作
***/
void TM1680PageWrite(unsigned char faddr, unsigned char *pdate,unsigned char cnt)
{
unsigned char i=0;
TM1680start();
TM1680SendByte(TM1680ID); //写TM1680器件地址
Ack();
TM1680SendByte(faddr); //eeprom 地址
Ack();
for(i=0; iTM1680SendByte(*pdate); //写数据
Ack();
pdate++;
}
TM1680stop();
}
void TM1680PageAllWrite(unsigned char faddr, unsigned char sdate,unsigned char cnt)
{
unsigned char i=0;
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(faddr); //eeprom 地址
Ack();
for(i=0; iTM1680SendByte(sdate); //写数据
Ack();
}
TM1680stop();
}
/***
函数功能: 写命令+写数据
***/
void TM1680WriteCmdDate(unsigned char faddr, unsigned char sdate, unsigned char cnt)
{
unsigned char i=0;
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(SYSDIS);
Ack();
TM1680SendByte(COM8NMOS);
Ack();
TM1680SendByte(RCMODE1);
Ack();
TM1680SendByte(SYSEN);
Ack();
TM1680SendByte(LEDON);
Ack();
TM1680SendByte(PWM16);
Ack();
TM1680SendByte(BLINKOFF);
Ack();
TM1680SendByte(faddr);
Ack();
for(i=0; iTM1680SendByte(sdate);
Ack();
}
TM1680stop();
}
/******************************************函数功能结束****************************************/
/***
函数功能: TM1680 初始化
***/
void TM1680Init(void)
{
TM1680start();
TM1680SendByte(TM1680ID);
Ack();
TM1680SendByte(SYSDIS);
Ack();
TM1680SendByte(COM8NMOS); //根据需求进行选择
Ack();
TM1680SendByte(RCMODE1);
Ack();
TM1680SendByte(SYSEN);
Ack();
TM1680SendByte(LEDON);
Ack();
// TM1680SendByte(LEDOFF);
// Ack();
TM1680SendByte(PWM16);
Ack();
TM1680SendByte(BLINKOFF);
Ack();
TM1680stop();
}
/***PWM调节测试***/
void PWMTest(unsigned char sTime)
{
unsigned char i=0;
for(i=0;i<16;i++)
{
TM1680WriteCmd(PWM01 | i);
delayms(sTime);
delayms(sTime);
}
}
/***TM1680ID判断***/
void TM1680IDChange(void)
{
switch(TM1680ID)
{
case 0xe4: MA1=0; MA0=0; break;
case 0xe5: MA1=0; MA0=1; break;
case 0xe6: MA1=1; MA0=0; break;
case 0xe7: MA1=1; MA0=1; break;
default:break;
}
}
/****
函数功能:逐渐点亮每一段
****/
void TM1680PerDisp(void)
{
unsigned char i=0,j=0;
unsigned char faddr=0x00, fdate=TM1680perseg[0];
for(i=0;i<32; i++)
{
for(j=0;j<8;j++)
{
fdate=fdate|TM1680perseg[j];
TM1680WriteOneByte(faddr,fdate);
delayms(20);
}
faddr+=2;
fdate=TM1680perseg[0];
}
}
void main(void)
{
unsigned char i=0,j=0,fdate=0x10;
TM1680IDChange();
TM1680Init();
TM1680PageAllWrite(0x00, 0x00, 32); //上电清零
delayms(100);
TM1680PageAllWrite(0x00, 0xff, 32); //上电全部显示
TM1680PerDisp(); //每一段显示
while(1)
{
;
}
}
2019-12-21 21:47:04
7KB
tm1680
1