optical/NxFuncs/keyled/tm1637.c

255 lines
4.8 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#include "tm1637.h"
#if (LEDKEY_TM1637 != 0)
#include "delay.h"
#include "inout.h"
//------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>I2C
#define SetTM1637CLKLow SetI2cSCLOn
#define SetTM1637CLKHigh SetI2cSCLOff
#define SetTM1637DIOLow SetI2cSDAOn
#define SetTM1637DIOHigh SetI2cSDAOff
#define SetTM1637DIOIn SetI2cSDAIn
#define SetTM1637DIOOut SetI2cSDAOut
#define GetTM1637DIOStatus GetI2cSDAInputStatus
#ifndef TM1637Delay
#define TM1637Delay(dl) DelayUs(dl)
#endif
//---------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ
// CLK Ϊ<>ߵ<EFBFBD>ƽʱ<C6BD><CAB1>DIO<49>ɸ߱<C9B8><DFB1><EFBFBD>
void SetI2CStart(void)
{
SetTM1637DIOOut();
SetTM1637CLKHigh();
SetTM1637DIOHigh();
TM1637Delay(2);
SetTM1637DIOLow();
TM1637Delay(2);
}
// <20><><EFBFBD><EFBFBD>ֹͣλ
// CLK Ϊ<>ߵ<EFBFBD>ƽʱ<C6BD><CAB1>DIO<49>ɵͱ<C9B5><CDB1><EFBFBD>
void SetI2CStop(void)
{
SetTM1637DIOOut();
SetTM1637CLKLow();
TM1637Delay(2);
SetTM1637DIOLow();
TM1637Delay(2);
SetTM1637CLKHigh();
TM1637Delay(2);
SetTM1637DIOHigh();
TM1637Delay(2);
}
// <20>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6>λ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷʱ, <20>ڵڰ˸<DAB0>ʱ<EFBFBD><CAB1><EFBFBD>½<EFBFBD><C2BD><EFBFBD>, оƬ<D0BE>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ACK<43>ź<EFBFBD>, <20><>DIO<49>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>, <20>ڵھŸ<DABE>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ͷ<EFBFBD>DIO<49><4F><EFBFBD>ߡ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ɹ<EFBFBD>
// -1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ʧ<EFBFBD><CAA7>
int WaitI2CAck(void)
{
int timout;
SetTM1637CLKLow(); // <20>ھŸ<DABE><C5B8>½<EFBFBD><C2BD><EFBFBD>
SetTM1637DIOIn(); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
TM1637Delay(5); // <20>ڵڰ˸<DAB0>ʱ<EFBFBD><CAB1><EFBFBD>½<EFBFBD><C2BD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʱ 5us, <20><>ʼ<EFBFBD>ж<EFBFBD> ACK <20>ź<EFBFBD>
// <20>ȴ<EFBFBD> ACK
timout = 100;
do
{
if (GetTM1637DIOStatus() == 0) // ACK <20>͵<EFBFBD>ƽ
{
break;
}
timout--;
TM1637Delay(1);
}while (timout > 0);
#if (1) // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
if (timout <= 0)
{
SetI2CStop();
printf("I2C No reply\r\n");
return -1;
}
#endif
SetTM1637CLKHigh(); // <20><><EFBFBD>õ<EFBFBD>9<EFBFBD><39>CLKΪ<4B>ߵ<EFBFBD>ƽ, <20><><EFBFBD><EFBFBD>ACK״̬
TM1637Delay(2);
SetTM1637CLKLow(); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ,
return 0;
}
// дһ<D0B4><D2BB><EFBFBD>ֽ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CLK<4C>ĵ͵<C4B5>ƽʱ<C6BD><CAB1><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>CLK<4C>ĸߵ<C4B8>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4A3A8><EFBFBD>ܱ仯<DCB1><E4BBAF>
// ÿ<><C3BF><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>, оƬ<D0BE>ڲ<EFBFBD><DAB2>ڵڰ˸<DAB0>ʱ<EFBFBD><CAB1><EFBFBD>½<EFBFBD><C2BD>ز<EFBFBD><D8B2><EFBFBD>һ<EFBFBD><D2BB>ACK
void WriteI2CByte(u8 dat)
{
int i;
SetTM1637DIOOut();
for (i = 0; i < 8; i++)
{
SetTM1637CLKLow(); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ, ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((dat & 0x01) != 0) // TM1637 <20><>λ<EFBFBD><CEBB>ǰ, <20>ͱ<EFBFBD>׼I2C<32><43><EFBFBD><EFBFBD>ͬ
{
SetTM1637DIOHigh();
}
else
{
SetTM1637DIOLow();
}
TM1637Delay(3);
dat >>= 1;
SetTM1637CLKHigh(); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TM1637Delay(3);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
u8 ReadI2CByte(void)
{
int i;
u8 dat = 0;
SetTM1637DIOIn(); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬
for (i = 0; i < 8; i++)
{
SetTM1637CLKLow(); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ, ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dat >>= 1;
TM1637Delay(3); // 4
SetTM1637CLKHigh(); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ, <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if ((GetTM1637DIOStatus()) != 0) // TM1637 <20><>λ<EFBFBD><CEBB>ǰ, <20>ͱ<EFBFBD>׼I2C<32><43><EFBFBD><EFBFBD>ͬ
{
dat |= 0x80;
}
TM1637Delay(3); // 4
}
return dat;
}
//---------------------------------------------------------
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>ӦС<D3A6><D0A1> 250K<30><4B><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// S0<53><30>S1<53><31>S2<53><32>K1<4B><31>K2 Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
u8 TM1637ReadKey(void)
{
u8 keyval;
// command
SetI2CStart(); // <20><>ʼλ
WriteI2CByte(DATA_CMD_BITS|READ_KEY_VAL); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WaitI2CAck(); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ
keyval = ReadI2CByte(); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WaitI2CAck(); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
SetI2CStop(); // <20><><EFBFBD><EFBFBD>
switch (keyval)
{
case KEY_K1SG1:
case KEY_K1SG2:
case KEY_K1SG3:
case KEY_K1SG4:
case KEY_K1SG5:
case KEY_K1SG6:
case KEY_K1SG7:
case KEY_K1SG8:
case KEY_K2SG1:
case KEY_K2SG2:
case KEY_K2SG3:
case KEY_K2SG4:
case KEY_K2SG5:
case KEY_K2SG6:
case KEY_K2SG7:
case KEY_K2SG8:
break;
default:
keyval = KEY_NONE;
}
return keyval;
}
// д<><D0B4>ʾ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>(<28><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>)
void TM1637WriteLedData(u8 baddr, u8 * pBuff, u8 disp)
{
if (baddr < LED_REG1_ADDR || baddr > LED_REG6_ADDR || pBuff == NULL)
{
return;
}
// printf("TM1637WriteLedData begin\r\n");
// command1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// printf("command1\r\n");
SetI2CStart(); // <20><>ʼλ
WriteI2CByte(DATA_CMD_BITS|WRITE_LED_REG|ADDR_AUTO_INC); // д<><D0B4><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʾ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>, <20><>ַ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
WaitI2CAck(); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
SetI2CStop(); // <20><><EFBFBD><EFBFBD>
// command2 <20><><EFBFBD>õ<EFBFBD>ַ
// printf("command2\r\n");
SetI2CStart(); // <20><>ʼλ
WriteI2CByte(ADDR_CMD_BITS|LED_REG_BEG_ADDR); // дΪ<D0B4><CEAA>ʼ<EFBFBD><CABC>ַ
WaitI2CAck(); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
// Data1~N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
//printf("send data\r\n");
while (baddr <= LED_REG6_ADDR)
{
//printf("data=0x%x\r\n", *pBuff);
WriteI2CByte(*pBuff); // д<><D0B4>LED<45><44><EFBFBD><EFBFBD>
WaitI2CAck(); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
pBuff++;
baddr++;
}
SetI2CStop(); // <20><><EFBFBD><EFBFBD>
// printf("command3\r\n");
// command3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
SetI2CStart(); // <20><>ʼλ
WriteI2CByte(DISP_CTRL_BITS|(disp & 0x0f)); // д<><D0B4>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WaitI2CAck(); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
SetI2CStop(); // <20><><EFBFBD><EFBFBD>
// printf("TM1637WriteLedData end\r\n");
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾģʽ
// <20><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
void TM1637SetLedDisp(u8 disp)
{
SetI2CStart(); // <20><>ʼλ
WriteI2CByte(DISP_CTRL_BITS|(disp & 0x0f)); // д<><D0B4>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WaitI2CAck(); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
SetI2CStop(); // <20><><EFBFBD><EFBFBD>
}
#endif