|
本帖最后由 乙猪 于 2022-4-17 02:26 编辑
以前学习单片机编程,都是一古脑地把所有函数都放在main.c文件里,对H文件零知零解,现在也是一知半解。记得读大学时就学过库函数库文件了(读书时只学过一年的pascal语言),现试着把函数都放在头文件里,看看行不行?
main.c文件就简单了:
/*******************************************************************************
* 程序设计 : 乙猪,2022.04.12
* 程序功能 : 实验输出到TM637模块
*******************************************************************************/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>
#include "TM1637.h" //TM1637相关函数定义
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main() //测试
{
TM1637_Display(21,21,21,21,0); //黑屏
TM1637_DisplayChar(7,2);
TM1637_DisplayChar(6,0);
while(1);
}
然后就是TM1637.h 头文件了:
/*---------------------------------------------------
TM1637.H
TM637模块
----------------------------------------------------*/
#ifndef __TM1637_H__
#define __TM1637_H__
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
sbit TM1637_CLK = P2^7; //定义模拟IIC总线的时钟线
sbit TM1637_DIO = P2^6; //定义模拟IIC总线的数据线
void Delay_us(unsigned int i); // 延迟
void TM1637_Start(void); //IIC开始
void TM1637_Ack(void); //IIC应答
void TM1637_Stop(void); //IIC停止
void TM1637_Write(unsigned char DATA); //写数据函数
unsigned char TM1637_ScanKey(void); /////读按键
void TM1637_Display(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char h); //按顺序显示
void TM1637_DisplayChar(unsigned char ch,unsigned char p); //向指定地址显示一个字节内容
#endif
与TM1637.h 相对应的TM1637.c 文件:
/*---------------------------------------------------
TM1637.C
TM637模块
----------------------------------------------------*/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>
#include "TM1637.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+普通模式
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(0x89);//开显示,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();
}
实验结果:
以后如果用到这个模块,就可以重复利用这个头文件了,不需要重复编写有关它的程序了。
原本是想买这个模块来做收音机频率显示的,发觉少了小数点。郁闷~~ |
评分
-
2
查看全部评分
-
|