通俗简单且好用的TM1640驱动代码

一.定义管脚

sbit SDA=P3^3;					   //对应SDA
sbit SCL=P3^2;				     //对应SCL

二.编写IIC时序操作


/********************Start函数*************************/
static void I2CStart()
{
  SDA=1;  //数据建立和保持时间最小时间为100ns,而33.1776M晶振执行一条指令赋值操作大约360ns,故无需延时
  SCL=1;  //时钟脉冲宽度为400ns  
	SDA=1; 
	SDA=0;
	SCL=0;
}
/********************Stop函数*************************/
static void I2CStop()
{
	SCL=1;
	SDA=0;
	SDA=1;
	SCL=0;
	SDA=0;
}

/***************发送8bit数据,从低位开始**************/
static void I2CWritebyte(unsigned char Byte)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    SCL=0;
    SDA= (Byte>>i&0x01) ?  1:0;
	  SCL=1;
	}
	SCL=0;
	SDA=0;
}

三.编写应用函数

/*清屏指令,传递参数确定要清除的位数,最大16位*/
static void Clear_screen(unsigned char num){
  while(num--)
  	I2CWritebyte(0x00); 
}

void TM1640_Init(void)
{
 I2CStart();
 I2CWritebyte(BRIGHTNESS_LEVEL_5);	//显示控制:显示开,脉冲宽度设为11/16 亮度
  /*上电清零,防止显示乱码,根据硬件使用的位数确定*/
  Clear_screen(15);
	I2CStop(); 
}

code uchar seg8code[ ]={//显示段码 数码管字跟 
0x3f,	//    0 
0x06,	//    1
0x5b,	//    2
0x4f,	//    3
0x66,	//    4
0x6d,	//    5
0x7d,	//    6
0x07,	//    7
0x7f,	//    8
0x6f,	//    9 0110 0111
0x77,	// A	10  
0x7c,	// b	11
0x39,	// C	12
0x5e,	// d	13
0x79, // E  14
0x71, // F  15
0x67, // g  16
0x76, // H  17	
0x73,	// P	18
0x40,	// -	19
0x00,	//    20 息屏
0xc0, // -. 21  
};

/*
函数名:TM1640_Display
功  能:从第一个地址开始显示数据,显示的数量为disNum,disData的长度和它对应,flag确定相应位是否显示小数点
输  入:
输  出:无
*/
void TM1640_Display(unsigned char* disData,unsigned int flag,unsigned char disNum){
    unsigned char i;
  	I2CStart();
	  I2CWritebyte(CMD_DATA_1);	      //数据命令设置:普通模式,地址自动加一
    I2CWritebyte(START_ADDRESS_1);  //显示设置起始地址
     for(i=0;i>i &0x01) ? I2CWritebyte(seg8code[i[disData]]|0x80):I2CWritebyte(seg8code[i[disData]]);                  
     }
    Clear_screen(disNum-1);
	  I2CStop();
}

四.测试代码

void LED(void){
  unsigned char D[8]={0,1,2,3,4,5,6,7};  
  TM1640_Display(D,0xff,8);
}

   将该函数放在在主函数中执行,8表示你的数码管数量,0xff表示8个数码管的小数点全部点亮

   8个数码管应该显示数字0-7。

五.头文件定义


#include "STC8H.h"

/*显示控制命令,设置亮度打开显示屏,共8级亮度,也就是设置不同的脉冲宽度*/
#define BRIGHTNESS_LEVEL_1  0x88
#define BRIGHTNESS_LEVEL_2  0x89
#define BRIGHTNESS_LEVEL_3  0x8a
#define BRIGHTNESS_LEVEL_4  0x8b
#define BRIGHTNESS_LEVEL_5  0x8c
#define BRIGHTNESS_LEVEL_6  0x8d
#define BRIGHTNESS_LEVEL_7  0x8e
#define BRIGHTNESS_LEVEL_8  0x8f
#define CLOSE_DISPLAY       0x80   ///*关显示屏
/*数据设置命令*/
#define CMD_DATA_1          0X40 //地址自动加1,普通模式
#define CMD_DATA_2          0X44 //地址固定,普通模式

#define CMD_DATA_3          0X48 //地址自动加1,内部测试模式
#define CMD_DATA_4          0X4C //地址固定,内部测试模式
/*地址命令设置 显存地址为0xC0-0xCF,其对应关系参考手册第6页*/
#define START_ADDRESS_1       0XC0 //第一个数码管
#define START_ADDRESS_2       0XC1 
#define START_ADDRESS_3       0XC2 
#define START_ADDRESS_4       0XC3 
#define START_ADDRESS_5       0XC4 
#define START_ADDRESS_6       0XC5 
#define START_ADDRESS_7       0XC6 
#define START_ADDRESS_8       0XC7 
#define START_ADDRESS_9       0XC8 
#define START_ADDRESS_10      0XC9 
#define START_ADDRESS_11      0XCa 
#define START_ADDRESS_12      0XCb 
#define START_ADDRESS_13      0XCc 
#define START_ADDRESS_14      0XCd 
#define START_ADDRESS_15      0XCe 
#define START_ADDRESS_16      0XCf 
void I2CStart();
void I2CStop();
void I2CWritebyte(unsigned char Byte);
void TM1640_Init(void);
void TM1640_Display(unsigned char* disData,unsigned int flag,unsigned char disNum);
void LED(void);

你可能感兴趣的:(c语言,单片机,嵌入式硬件)