TM1635. Управление 4х разрядным семисегментным индикатором и семью кнопками по последовательному интерфейсу.

Doozer
Offline
Зарегистрирован: 30.07.2015

Здравствуйте.

Попала в руки плата управления и индикации от чегото. На ней 4-х разрядный семисегментный индикатор и 7 кнопок. Подключено всё это к единственному полупроводниковому элементу на прлате: микросхеме TM1635.  

Есть даташит на китайском. Больше информации не нашёл.

Код из даташита на С:

#include<reg52.h>
#include<intrins.h>
//Определение порта
sbit clk = P1^2;
sbit dio = P1^1;
///=======================================
void Delay_us(unsigned int i) //nus задержка
{
 for(;i>0;i--)
 _nop_();
}
///======================================
void I2CStart(void) //1635 старт
{
 clk = 1;
 dio = 1;
 Delay_us(2);
 dio = 0;
}
//=============================================
void I2Cask(void) //1635 ответ
{
clk = 0;
Delay_us(5);
 clk = 1;
 while(dio);
 clk=0;
}
//======================================== 
 
void I2CStop(void) // 1635 Стоп
{
 clk = 1;
 dio = 0;
 Delay_us(2);
 dio = 1;
}
//=========================================
void I2CWrByte(unsigned char oneByte) //записать байт
{
unsigned char i;
 for(i=0;i<8;i++)
 { clk = 0;
 if(oneByte&0x01) //低位在前
 {
 dio = 1;
 }
 else
 {
 dio = 0;
 }
 Delay_us(3);
 oneByte=oneByte>>1;
 clk=1;
 Delay_us(3);
 }
}
//-------------------------------------------------
unsigned char ScanKey(void) //считываем ключи
{
unsigned char rekey,rkey,i;
 I2CStart();
 I2CWrByte(0x46); //Читаем ключевые команды
 I2Cask();
 dio=1; // Перед чтением линия данных вытащил ключи 

 for(i=0;i<8;i++) //Начните читать от минимумов
 { clk=0;
 rekey=rekey>>1;
 Delay_us(30);
 clk=1;
 if(dio)
 {
 rekey=rekey|0x80;
 }
 else
 {
 rekey=rekey|0x00;
 }
 Delay_us(30);
 }
 I2Cask();
 I2CStop();
 return (rekey);
}
///================================================
void SmgDisplay(void) //отправить в регистр дисплея
{
unsigned char i;
 I2CStart();
 I2CWrByte(0x40); // 40H地址自加 (??адрес)  44H Режим фиксированной адрес
I2Cask();
 I2CStop();
I2CStart();
 I2CWrByte(0xc0); //устанливаем первый адрес
 I2Cask();

 for(i=0;i<4;i++) //Не всегда пишут адрес
 {
 I2CWrByte(0xff); //передавать данные
 I2Cask();
 }
 I2CStop();
 I2CStart();
 I2CWrByte(0x8f); //Открыть дисплей, максимальная яркость+
 I2Cask(); 
 I2CStop();
}
///==============================================
void init() //подпрограмма инициализации
{
 //Инициализация немного
}
///==============================================
void main(void)
{
 unsigned char keydate;
 //init(); //инициализация
 SmgDisplay(); // Написать зарегистрироваться и открыть дисплей
 while(1)
 {
 keydate=Scankey(); //Читайте ключевое значение, значение ключа считывается необработанный.
 }
}
//===========end==================================

Самому никак не разобраться. Нашел библиотеки, но застрял на определении порта sbit, в reg52.h нет таких портов.

Может кого нибудь из гуру заинтересует данная микросхема и он подскажет как написать библиотеку для неё.

​Микросхема стоит на Алиэкспресе 35 центов. За небольшие деньги можно сэкономить порты и получить "универсальный индикатор + кнопки" по двум проводам.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуй либу от 1637

https://github.com/avishorp/TM1637

и 1637 лучше использовать как по мне. более распрастраненная

Doozer
Offline
Зарегистрирован: 30.07.2015

Спасибо большое. Пошёл пробовать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Даташит на английском - http://www.chipdocs.com/pndecoder/datasheets/TITAN/TM1635.html

Doozer
Offline
Зарегистрирован: 30.07.2015

jeka_tm пишет:
попробуй либу от 1637..

 

Подошла другая библиотека.  

Спасибо за помощь.