c51 tm1638例程
时间: 2023-09-14 07:11:28 浏览: 46
以下是基于C51单片机和TM1638芯片的例程:
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY_1 = P3^2;
sbit KEY_2 = P3^3;
sbit KEY_3 = P3^4;
sbit KEY_4 = P3^5;
sbit KEY_5 = P3^6;
sbit KEY_6 = P3^7;
sbit STB = P2^0;
sbit CLK = P2^1;
sbit DIO = P2^2;
uchar code digit[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};
uchar num[8] = {0,0,0,0,0,0,0,0};
uchar key_value = 0;
uchar scan_key = 0;
void delay(uint ms)
{
uint i, j;
for(i=0; i<ms; i++)
{
for(j=0; j<114; j++);
}
}
void delay_us(uint us)
{
while(us--);
}
void tm1638_write(uchar command)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIO = command & 0x01;
command = command >> 1;
CLK = 1;
CLK = 0;
}
}
void tm1638_display(uchar *p)
{
uchar i;
tm1638_write(0x40);
STB = 1;
STB = 0;
tm1638_write(0xC0);
for(i=0; i<8; i++)
{
tm1638_write(*(p+i));
}
STB = 1;
}
uchar tm1638_read()
{
uchar i, dat = 0;
for(i=0; i<8; i++)
{
CLK = 0;
dat = dat >> 1;
if(DIO)
{
dat |= 0x80;
}
CLK = 1;
}
return dat;
}
void tm1638_init()
{
tm1638_write(0x8F);
}
void key_scan()
{
KEY_1 = 0;
if(KEY_1 == 0)
{
while(KEY_1 == 0);
key_value = 1;
scan_key = 1;
}
KEY_2 = 0;
if(KEY_2 == 0)
{
while(KEY_2 == 0);
key_value = 2;
scan_key = 1;
}
KEY_3 = 0;
if(KEY_3 == 0)
{
while(KEY_3 == 0);
key_value = 3;
scan_key = 1;
}
KEY_4 = 0;
if(KEY_4 == 0)
{
while(KEY_4 == 0);
key_value = 4;
scan_key = 1;
}
KEY_5 = 0;
if(KEY_5 == 0)
{
while(KEY_5 == 0);
key_value = 5;
scan_key = 1;
}
KEY_6 = 0;
if(KEY_6 == 0)
{
while(KEY_6 == 0);
key_value = 6;
scan_key = 1;
}
}
void main()
{
uchar i;
tm1638_init();
while(1)
{
if(scan_key == 1)
{
switch(key_value)
{
case 1:
num[0]++;
if(num[0] > 9) num[0] = 0;
break;
case 2:
num[1]++;
if(num[1] > 9) num[1] = 0;
break;
case 3:
num[2]++;
if(num[2] > 9) num[2] = 0;
break;
case 4:
num[3]++;
if(num[3] > 9) num[3] = 0;
break;
case 5:
num[4]++;
if(num[4] > 9) num[4] = 0;
break;
case 6:
num[5]++;
if(num[5] > 9) num[5] = 0;
break;
}
scan_key = 0;
}
for(i=0; i<8; i++)
{
tm1638_display(&digit[num[i]]);
delay(5);
}
key_scan();
}
}
```
该例程实现了一个计数器,通过TM1638芯片控制8个7段数码管的显示,同时可以通过6个按键来控制数字的增加。在程序中,使用了一个num数组来存储8个数字,每次按下按键后,根据按键编号来对应修改数组中的元素值,最后将数组中的8个数字依次显示在数码管上。
在程序中,还实现了一个key_scan函数来检测按键是否被按下,并根据按键编号来设置key_value变量的值。同时,为了防止按键抖动,使用了一个scan_key变量来记录是否已经检测到按键被按下,以便在下一次循环中进行处理。
需要注意的是,在使用TM1638芯片时,需要通过SPI接口来与其进行通信,具体的通信方式和协议可以参考TM1638的数据手册。在该程序中,使用了tm1638_write、tm1638_read和tm1638_display函数来实现与TM1638芯片的通信。其中,tm1638_write函数用于向TM1638芯片发送命令,tm1638_read函数用于从TM1638芯片读取数据,tm1638_display函数用于将8个数字依次显示在数码管上。