#include "iic.h"
#include <intrins.h>
code unsigned char tab[] =
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x77,/*10 A*/
0x7C,/*11 b*/
0x58,/*12 c*/
0x5E,/*13 d*/
0x79,/*14 E*/
0x71,/*15 F*/
0x76,/*16 H*/
0x38,/*17 L*/
0x54,/*18 n*/
0x73,/*19 P*/
0x3E,/*20 U*/
0x00,/*21 黑屏*/
}; //共陰的數據表(實際是共陽)
void Delay_us(unsigned int i)
{
for(;i>0;i--)
_nop_();;
}
//IIC開始
void TM1637_Start(void)
{
TM1637_CLK=1;
TM1637_DIO=1;
Delay_us(2);
TM1637_DIO=0;
}
//IIC應答
void TM1637_Ack(void)
{
unsigned char i;
TM1637_CLK=0;
Delay_us(5);
//DIO=1;
while(TM1637_DIO==1&&(i<250))
i++;
TM1637_CLK=1;
Delay_us(2);
TM1637_CLK=0;
}
//IIC停止
void TM1637_Stop(void)
{
TM1637_CLK=0;
Delay_us(2);
TM1637_DIO=0;
Delay_us(2);
TM1637_CLK=1;
Delay_us(2);
TM1637_DIO=1;
Delay_us(2);
}
//寫數據函數 先寫低位
void TM1637_Write(unsigned char DATA)
{
unsigned char i;
for(i=0;i<8;i++)
{
TM1637_CLK=0;
if(DATA & 0x01)
TM1637_DIO=1;
else TM1637_DIO=0;
Delay_us(3);
DATA=DATA>>1;
TM1637_CLK=1;
Delay_us(3);
}
//TM1637_ack();
}
/////讀按鍵
unsigned char TM1637_ScanKey(void)
{
unsigned char rekey,i;
TM1637_Start();
TM1637_Write(0x42); //讀按鍵命令
TM1637_Ack();
TM1637_DIO=1; // 在讀按鍵前拉高數據線
for(i=0;i<8;i++) //從低位開始讀
{
TM1637_CLK=0;
rekey=rekey>>1;
Delay_us(30);
TM1637_CLK=1;
if(TM1637_DIO)
{
rekey=rekey|0x80;
}
else
{
rekey=rekey|0x00;
}
Delay_us(30);
}
TM1637_Ack();
TM1637_Stop();
return (rekey);
}
//按順序顯示
void TM1637_Display(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char h)
{
TM1637_Start();
TM1637_Write(0x40); //寫數據+自動地址加1+普通模式 0100 0000
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_Write(0xc0);//設置顯示首地址即第一個LED
TM1637_Ack();
TM1637_Write(tab[a]);
TM1637_Ack();
TM1637_Write(tab[ b ]|h<<7); //h為1時顯示時鐘中間的兩點
TM1637_Ack();
TM1637_Write(tab[c]);
TM1637_Ack();
TM1637_Write(tab[d]);
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_Write(0x8a);//開顯示,2/16亮度
TM1637_Ack();
TM1637_Stop();
}
//向指定地址顯示一個字節內容
void TM1637_DisplayChar(unsigned char ch,unsigned char p)
{
if(ch>21) ch=21;//防止數組越界
TM1637_Start();
TM1637_Write(0x44);//0x44固定模式有利于控制顯示位,0x40則采用顯示地址自加模式這里不使用
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_Write(0xC0+p);//0X00地址開始顯示
TM1637_Ack();
TM1637_Write(tab[ch]);//顯示
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_Write(0x89);//開顯示,2/16亮度
TM1637_Ack();
TM1637_Stop();
}
|