TM1668.c
#include "TM1668.h"
#include <intrins.h> /* 声明void _nop_(void); */
static void Delay(unsigned char n)
{
unsigned char i = 0;
for (i = 0; i < n; i++)
{
_nop_();
}
}
/*
开始传输数据
*/
void TM1668_Start(void)
{
GPIO_CLK = 1;
GPIO_DIO = 1;
GPIO_STB = 0;
Delay(1);
}
/*
结束传输数据
*/
void TM1668_End(void)
{
GPIO_CLK = 1;
GPIO_DIO = 1;
GPIO_STB = 1;
Delay(1);
}
/*
向1688写入一个数据。(写一个bit时需要在时钟的上升沿操作)
*/
void TM1668_WriteByte(unsigned char byte)
{
unsigned char i = 0;
for(i=0; i<8; i++)
{
GPIO_CLK = 0;
Delay(1);
GPIO_DIO = (byte&0x01);
Delay(1);
GPIO_CLK = 1;
Delay(1);
byte>>=1;
Delay(1);
}
}
/*
地址增加模式写入n个字节数据,从SRAM起始地址开始写
p:写的数据首地址 nBytes:写入数据个数(<=14) brightness:显示亮度
*/
void TM1668_WriteBytesAddrIncrease(unsigned char *p, unsigned char nBytes, unsigned char brightness)
{
unsigned char i = 0;
TM1668_Start();
TM1668_WriteByte(GRID7_SEG10); /* 设置显示模式:7位10段 */
TM1668_End();
TM1668_Start();
TM1668_WriteByte(CMD_DataWriteIncrease); /* 设置数据命令:地址自增 */
TM1668_End();
TM1668_Start();
TM1668_WriteByte(ADD_00H); /* 设置显示地址:起始地址 */
for (i = 0; i < nBytes; i++)
{
TM1668_WriteByte(p[i]);
}
TM1668_End();
TM1668_Start();
TM1668_WriteByte(brightness); /* 显示控制命令:亮度调节 */
TM1668_End();
}
/*
地址固定模式写入n个字节数据,从SRAM起始地址开始写
p:写的数据首地址 nBytes:写入数据个数(<=14) brightness:显示亮度
*/
void TM1668_WriteBytesAddrFixed(unsigned char *p, unsigned char nBytes, unsigned char brightness)
{
unsigned char i = 0;
TM1668_Start();
TM1668_WriteByte(GRID7_SEG10); /* 设置显示模式:7位10段 */
TM1668_End();
TM1668_Start();
TM1668_WriteByte(CMD_DataWriteFixed); /* 设置数据命令:地址固定 */
TM1668_End();
for (i = 0; i < nBytes; i++)
{
TM1668_Start();
TM1668_WriteByte(ADD_00H + i); /* 设置显示地址:起始地址 */
TM1668_WriteByte(p[i]);
TM1668_End();
}
TM1668_Start();
TM1668_WriteByte(brightness); /* 显示控制命令:亮度调节 */
TM1668_End();
}
/*
初始化,1668内部显示寄存器清零,防止出现乱码,并关闭显示
*/
void TM1668_Init(void)
{
unsigned char i = 0;
TM1668_Start();
TM1668_WriteByte(GRID7_SEG10); /* 设置显示模式:7位10段 */
TM1668_End();
TM1668_Start();
TM1668_WriteByte(CMD_DataWriteIncrease); /* 设置数据命令:地址自增 */
TM1668_End();
TM1668_Start();
TM1668_WriteByte(ADD_00H); /* 设置显示地址:起始地址 */
for (i = 0; i < 14; i++)
{
TM1668_WriteByte(0);
}
TM1668_End();
TM1668_Start();
TM1668_WriteByte(DSP_OFF); /* 显示控制命令:亮度调节 */
TM1668_End();
}
TM1668.h
#ifndef _TM1668_H
#define _TM1668_H
/*******************************************************************************
用户配置区
*******************************************************************************/
#include "SC92F846xB_C.h" /* 根据MCU平台配置 */
#define GPIO_DIO P51 /* 数据输入输出 */
#define GPIO_CLK P50 /* 时钟输入 */
#define GPIO_STB P00 /* 片选输入 */
/*******************************************************************************
显示模式命令设置
*******************************************************************************/
#define GRID4_SEG13 0x00 /* 4位13段 */
#define GRID5_SEG12 0x01 /* 5位12段 */
#define GRID6_SEG11 0x02 /* 6位11段 */
#define GRID7_SEG10 0x03 /* 7位10段 */
/*******************************************************************************
数据命令设置
*******************************************************************************/
#define CMD_DataWriteIncrease 0x40 /* 地址自增写数据 */
#define CMD_DataWriteFixed 0x44 /* 固定地址写数据 */
/*******************************************************************************
显示控制命令设置
*******************************************************************************/
#define DSP_01_16 0x88 /* 设置脉冲宽度为1/16 */
#define DSP_02_16 0x89 /* 设置脉冲宽度为2/16 */
#define DSP_04_16 0x8A /* 设置脉冲宽度为4/16 */
#define DSP_10_16 0x8B /* 设置脉冲宽度为10/16 */
#define DSP_11_16 0x8C /* 设置脉冲宽度为11/16 */
#define DSP_12_16 0x8D /* 设置脉冲宽度为12/16 */
#define DSP_13_16 0x8E /* 设置脉冲宽度为13/16 */
#define DSP_14_16 0x8F /* 设置脉冲宽度为14/16 */
#define DSP_OFF 0x80 /* 显示关 */
/*******************************************************************************
地址命令设置
*******************************************************************************/
#define ADD_00H 0xC0 /* 显示地址: GRID1 */
#define ADD_01H 0xC1 /* 显示地址: GRID1 */
#define ADD_02H 0xC2 /* 显示地址: GRID2 */
#define ADD_03H 0xC3 /* 显示地址: GRID2 */
#define ADD_04H 0xC4 /* 显示地址: GRID3 */
#define ADD_05H 0xC5 /* 显示地址: GRID3 */
#define ADD_06H 0xC6 /* 显示地址: GRID4 */
#define ADD_07H 0xC7 /* 显示地址: GRID4 */
#define ADD_08H 0xC8 /* 显示地址: GRID5 */
#define ADD_09H 0xC9 /* 显示地址: GRID5 */
#define ADD_0AH 0xCA /* 显示地址: GRID6 */
#define ADD_0BH 0xCB /* 显示地址: GRID6 */
#define ADD_0CH 0xCC /* 显示地址: GRID7 */
#define ADD_0DH 0xCD /* 显示地址: GRID7 */
void TM1668_WriteBytesAddrIncrease(unsigned char *p, unsigned char nBytes, unsigned char brightness);
void TM1668_WriteBytesAddrFixed(unsigned char *p, unsigned char nBytes, unsigned char brightness);
void TM1668_Init(void);
#endif