这段时间因为设计项目需要用到数码管和按钮,因为数码管过多,没有办法使用IO扫描方式,所以就是使用了专用IC驱动芯片,TM1638芯片可以驱动数码可以驱动矩阵键盘。
这是芯片管脚图,具体说明请看该芯片的PDF说明书,我在最后会以附件方式上传,这里主要说说芯片驱动程序,我自己调试通的。
因为正式产品的板子还没有做好,我就利用了一下,前面那个HTCL2032模块板,因为上面正好有单片机,还有SO32的贴片封装,
正好可以焊上TM1638,因为是试验,我不能将24个矩阵按钮全接上,
我只是将第一脚和第五脚通过一个按钮连接了,不多说了,直接上驱动程序。
#define TM1638_STB PORTC_Bit1
#define TM1638_CLK PORTC_Bit2
#define TM1638_DIO_IN DDRC_Bit3=0
#define TM1638_DIO_OUT DDRC_Bit3=1
#define TM1638_DIO PORTC_Bit3
#define TM1638_DIO_DataIN PINC_Bit3
void TM1638_Write(unsigned char DATA) //写数据函数
{
unsigned char i;
TM1638_DIO_OUT;
for(i=0;i<8;i++)
{
TM1638_CLK=0;
delay_us(1);
if(DATA&0X01)
TM1638_DIO=1;
else
TM1638_DIO=0;
DATA>>=1;
TM1638_CLK=1;
delay_us(1);
}
}
unsigned char TM1638_Read(void) //读数据函数
{
unsigned char i;
unsigned char temp=0;
TM1638_DIO_IN;
for(i=0;i<8;i++)
{
temp>>=1;
TM1638_CLK=0;
delay_us(1);
if(TM1638_DIO_DataIN==1)
temp|=0x80;
TM1638_CLK=1;
delay_us(1);
}
return temp;
}
void Write_COM(unsigned char cmd) //发送命令字
{
TM1638_STB=0;
TM1638_Write(cmd);
TM1638_STB=1;
}
unsigned char Read_key(unsigned char *KeyValue)
{
unsigned char c[4],i,key_value=0;
TM1638_STB=0;
TM1638_Write(0x42); //读键扫数据 命令
delay_us(10);
for(i=0;i<4;i++)
KeyValue[i]=TM1638_Read();
TM1638_STB=1; //4个字节数据合成一个字节
return 0;
}
void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据
{
Write_COM(0x44);
TM1638_STB=0;
TM1638_Write(0xc0|add);
TM1638_Write(DATA);
TM1638_STB=1;
}
//TM1638初始化函数
void init_TM1638(void)
{
unsigned char i;
DDRC=0xff;
Write_COM(0x8b); //亮度 (0x88-0x8f)8级亮度可调
Write_COM(0x40); //采用地址自动加1
TM1638_STB=0; //
TM1638_Write(0xc0); //设置起始地址
for(i=0;i<16;i++) //传送16个字节的数据
TM1638_Write(0x00);
TM1638_STB=1;
}
main()
{
init_TM1638();
__enable_interrupt();
//初始化TM1638
while(1)
{
uchar KeyValue[4];
Read_key(KeyValue);
if(KeyValue[0]&0x04)
{
PORTB_Bit0=0;
Uart_Transmit(KeyValue[0]);
}
else
PORTB_Bit0=1;
}
}
程序的效果,就是我按下按钮,
KeyValue[0]&0x04为1,然后点亮LED,弹起,就熄灭LED.在调试过程中因为我这是凑合的电路,所以STB,CLK,DIO三个管脚
没有接上拉电阻,结果读不到数据,所以这里一定要接上上拉电阻在这个三个管脚。下面图片是按钮按下和不按下的效果图。
tm1638芯片数据手册.pdf
阅读(19214) | 评论(0) | 转发(0) |