ESP8266-SDK编写的TM1668程序驱动数码管

一、配置GPIO及宏定义

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);

#define Set_TM1668_SCLK_1() GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1)
#define Set_TM1668_SLCK_0() GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0)
定义
TM1668的时钟输入 CLK  在时钟的上升沿输入数据


#define Set_TM1668_STB_1()  GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1)
#define Set_TM1668_STB_0()  GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0)

定义stb片选 stb为低后的第一个字节作为指令  stb为高时 clk被忽略 这句很重呀 我就是在这里被坑了


#define Set_TM1668_DIO_1()  GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 1)
#define Set_TM1668_DIO_0()  GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 0)

定义TM1668的数据输入DIO 在时钟的上升沿输入数据,从低位开始

二、编写一个写数据的函数

void ICACHE_FLASH_ATTR TM1668_Write_Data(uint8_t data)
{
uint8_t i = 0;
Set_TM1668_STB_0();//开始设置stb为低
for(i = 0;i < 8;i++)
{
Set_TM1668_SLCK_0();
os_delay_us(20);
if(data & 0x01)//低位先开始
{
Set_TM1668_DIO_1();
}
else
{
Set_TM1668_DIO_0();
}
os_delay_us(20);
Set_TM1668_SCLK_1();//时钟的上升沿输入数据
os_delay_us(20);
data = data >> 1;
os_delay_us(20);
}
Set_TM1668_DIO_1();
}

三、显示数据的函数


void ICACHE_FLASH_ATTR TM1668_Display1(uint8_t address,uint8_t *data,uint8_t num)
{
uint8_t i = 0;
//Write_74HC595_Data(Write_HC595_Data | Set_SCLK_EN_1);
TM1668_Write_Data(dissetmode);//传显示模式设置命令,设置为7个“GRID”方式
Set_TM1668_STB_1();
TM1668_Write_Data(writedatamode_g);//传数据设置命令,设置采用地址固定
Set_TM1668_STB_1();


for(i = 0;i < num;i++)
{
TM1668_Write_Data(address+2*i);//设置显示地址

//地址后面不要把stb设置为1 因为stb为低后的第一个字节为指令  第二个就是数据了 所以地址后面的stb不要设置为高
TM1668_Write_Data(ch[data[i]]);//设置显示的数据
Set_TM1668_STB_1();
}
TM1668_Write_Data(disconmode);//设置显示控制开
Set_TM1668_STB_1();
//Write_74HC595_Data(Write_HC595_Data & Set_SCLK_EN_0);
}

注意........................上面的红色字体一定要注意 ,否则容易被坑,我就坑在这里一下午

四、显示程序

void ICACHE_FLASH_ATTR callback(void)
{
static uint16_t flag=1234;
uint8_t ch[8] = {1,2,3,4,5,6,7,8};
flag++;
ch[0] = flag / 1000;
ch[2] = flag / 100 %10;
ch[3] = flag /10%10;
ch[3] = flag %10;
TM1668_Display1(0xc0,ch,4);
os_timer_arm(&timer,1000,0);
}


这里用了一个软定时器的回调函数来显示数据




读按键

/****************************************************************
 * 函数名:TM1668_Write_Data
 * 函数功能:写数据
 * 形参:data -- 要写入的数据
 * 返回值:无
 */
void ICACHE_FLASH_ATTR TM1668_Write_Data(uint8_t data)
{
uint8_t i = 0;
//ETS_INTR_LOCK();
Set_TM1668_STB_0();
for(i = 0;i < 8;i++)
{
Set_TM1668_SLCK_0();
os_delay_us(1);
if(data & 0x01)//低位在前
{
Set_TM1668_DIO_1();
}
else
{
Set_TM1668_DIO_0();
}
os_delay_us(1);
Set_TM1668_SCLK_1();//上升沿采集数据
os_delay_us(1);
data = data >> 1;
os_delay_us(1);
}
Set_TM1668_DIO_1();
//ETS_INTR_UNLOCK();
}


uint8_t ICACHE_FLASH_ATTR TM1668_Read_data(void)
{
uint8_t temp = 0;
uint8_t i = 0;




for(i = 0;i < 8;i++)
{
temp = temp >> 1;
Set_TM1668_SLCK_0();
if(Read_TM1668_DIO())
{
temp = temp | 0x80;
}
Set_TM1668_SCLK_1();
}
return temp;
}


uint8_t ICACHE_FLASH_ATTR  Read_Tm1668_key(void)
{
uint8_t temp;
uint8_t i = 0;
uint8_t key = 0;
Set_TM1668_STB_0();
TM1668_Write_Data(readkeymode);


//Set_TM1668_DIO_InPut();
for(i = 0;i < 4;i++)
{
temp = TM1668_Read_data();
switch(i)
{
case 0:
if(temp == 0x01)
{
key = 0x01;
}
else if(temp == 0x10)
{
key = 0x10;
}
break;
case 1:
if(temp == 0x01)
{
key = 0x02;
}
else if(temp == 0x10)
{
key = 0x20;
}
break;
case 2:
if(temp == 0x01)
{
key = 0x04;
}
else if(temp == 0x10)
{
key = 0x40;
}
break;
case 3:
if(temp == 0x01)
{
key = 0x08;
}
else if(temp == 0x10)
{
key = 0x80;
}
break;
default:
os_printf("按键出错.........\r\n");
break;
}
}


Set_TM1668_STB_1();
return key;
}

你可能感兴趣的:(SEP8266)