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;
}
總結
以上是生活随笔為你收集整理的ESP8266-SDK编写的TM1668程序驱动数码管的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ESP8266--学习笔记(八)串口源码
- 下一篇: ESP8266-SDK的硬件定时器