用C语言编写一个TM1616的驱动程序
时间: 2023-05-29 14:02:51 浏览: 102
1. 头文件包含
```c
#include <reg52.h> // 寄存器定义头文件
#include <intrins.h> // 包含delay函数的头文件
```
2. 宏定义
```c
#define CLK P1_0 // 时钟引脚
#define DIO P1_1 // 数据引脚
```
3. 函数声明
```c
void TM1616_WriteByte(unsigned char data);
void TM1616_Display(unsigned char value, unsigned char position);
void TM1616_Init();
```
4. 函数定义
- TM1616_WriteByte:向TM1616写入1字节数据。
```c
void TM1616_WriteByte(unsigned char data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
CLK = 0;
_nop_();
if((data & 0x80) == 0x80)
{
DIO = 1;
}
else
{
DIO = 0;
}
_nop_();
CLK = 1;
_nop_();
data <<= 1;
}
}
```
- TM1616_Display:在指定位置上显示指定的数值,同时判断是否需要补0。
```c
void TM1616_Display(unsigned char value, unsigned char position)
{
if(position > 0x0f)
position = 0x00;
TM1616_WriteByte(0xc0 + position); // 设置显示位置
if(value < 10)
{
TM1616_WriteByte(value);
TM1616_WriteByte(0x00); // 补0
}
else
{
TM1616_WriteByte(value / 10);
TM1616_WriteByte(value % 10);
}
}
```
- TM1616_Init:初始化TM1616。
```c
void TM1616_Init()
{
CLK = 1;
DIO = 1;
TM1616_Display(0x88, 0x0f); // 打开显示(亮度值默认)
}
```
5. 主函数
```c
void main()
{
unsigned char i;
TM1616_Init();
while(1)
{
for(i = 0; i < 100; i++) // 循环0-99的数字
{
TM1616_Display(i, 0x00);
DelayMs(200);
}
}
}
```
完整代码(含延时函数):
```c
#include <reg52.h> // 寄存器定义头文件
#include <intrins.h> // 包含delay函数的头文件
#define CLK P1_0 // 时钟引脚
#define DIO P1_1 // 数据引脚
void DelayMs(int x) // 延时函数
{
unsigned char i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void TM1616_WriteByte(unsigned char data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
CLK = 0;
_nop_();
if((data & 0x80) == 0x80)
{
DIO = 1;
}
else
{
DIO = 0;
}
_nop_();
CLK = 1;
_nop_();
data <<= 1;
}
}
void TM1616_Display(unsigned char value, unsigned char position)
{
if(position > 0x0f)
position = 0x00;
TM1616_WriteByte(0xc0 + position); // 设置显示位置
if(value < 10)
{
TM1616_WriteByte(value);
TM1616_WriteByte(0x00); // 补0
}
else
{
TM1616_WriteByte(value / 10);
TM1616_WriteByte(value % 10);
}
}
void TM1616_Init()
{
CLK = 1;
DIO = 1;
TM1616_Display(0x88, 0x0f); // 打开显示(亮度值默认)
}
void main()
{
unsigned char i;
TM1616_Init();
while(1)
{
for(i = 0; i < 100; i++) // 循环0-99的数字
{
TM1616_Display(i, 0x00);
DelayMs(200);
}
}
}
```