本帖最后由 缥缈九哥 于 2012-12-19 13:04 编辑
某个朋友的项目,用到TM1668做LED显示和键盘驱动,我给他写了一个例子,现在公开给大家参考,希望有用。
/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <MINI51.H>
#include "Driver\DrvSYS.h"
#include "Driver\DrvSPI.h"
#include "Driver\DrvGPIO.h"
/*
//make by yuanxihua@21cn.com
____________________________________________
| MINI51LAN TM1668 |
| |
| P04 SS ----> LSTB |
| P05 MOSI ----> LDIO |
| P06 MISO ----> LDIO |
| P07 SCLK <---> LCLK |
|___________________________________________|
*/
#define TM1668_STB E_GPC, 7 /* PC.7 */
#define TM1668_CLK E_GPC, 6 /* PC.6 */
#define TM1668_DIO E_GPA, 13 /* PA.13 */
#define DISP_DELAY 2
//0 1 2 3 4 5 6 7 8 9 A B C D E F
const unsigned char TM1668_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0X7F, 0x39, 0x3F, 0x79, 0x71};
const unsigned short TM1668_LINE[10]={0x200,0x300,0x380,0x3C0,0x3E0,0x3F0,0x3F8,0x3FC,0x3FE,0x3FF};
void TM1668_init(void);
void TM1668_Write_ADDR_INC(uint8_t *WrData);
void TM1668_Write_Byte(uint8_t WrData);
void TM1668_Read_KEY(uint8_t *RdData);
void TM1668_Test(void)
{
unsigned char wrbuff[14];
unsigned char rdbuff[5];
unsigned char key[7];
unsigned char led[7];
TM1668_init();
while(1)
{
// TM1668_Write_Byte(0x55);
TM1668_Read_KEY(rdbuff);
key[1] = (rdbuff[0]&0x01)?1:0;
key[2] = (rdbuff[0]&0x08)?1:0;
key[3] = (rdbuff[1]&0x01)?1:0;
key[4] = (rdbuff[1]&0x08)?1:0;
key[5] = (rdbuff[0]&0x02)?1:0;
key[6] = (rdbuff[0]&0x10)?1:0;
led[1] = key[1]?1:0;
led[2] = key[2]?1:0;
led[3] = key[3]?1:0;
led[4] = key[4]?1:0;
led[5] = key[5]?1:0;
led[6] = key[6]?1:0;
wrbuff[0] = (led[6]<<5)|(led[5]<<4)|(led[4]<<3)|(led[3]<<2)|(led[2]<<1)|(led[1]<<0);
printf("*** 9G-MINI51 V1.00 %02x...\n\r",wrbuff[0]);
TM1668_Write_ADDR_INC(wrbuff);
}
}
void TM1668_init(void)
{
/* 设置SPI I/O */
DrvGPIO_InitFunction(FUNC_SPI);
/* 设置SPI为主模式, 32-bit 传输 */
DrvSPI_Open(eDRVSPI_MASTER, eDRVSPI_TYPE1, 32);
/* 配置传输时的比特优先次序为LSB优先 */
DrvSPI_SetEndian(eDRVSPI_LSB_FIRST);
/* 关闭自动片选功能 */
DrvSPI_DisableAutoSS();
/* 设置片选信号启动电平为片选信号低电平或者下降沿启动 */
DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_ACTIVE_LOW_FALLING);
/* 设置SPI时钟速度为 12MHz */
DrvSPI_SetClockFreq(12000000, 0);
}
void TM1668_Write_Byte(uint8_t WrData)
{
uint32_t SPI_Data = WrData;
/* 设置SPI长度为8个位元 */
DrvSPI_SetBitLength(8);
/* 片选脚设为启动状态 */
DrvSPI_SetSS();
/* 传送WrData */
SPI_Data = 0x03;//Command1: 显示模式设置命令
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
/* 片选脚设为非启动状态 */
DrvSPI_ClrSS();
}
void TM1668_Write_ADDR_INC(uint8_t *WrData)
{
uint32_t i,SPI_Data;
/* 设置SPI长度为8个位元 */
DrvSPI_SetBitLength(8);
/* 片选脚设为启动状态 */
DrvSPI_SetSS();
/* 传送WrData */
SPI_Data = 0x03;//Command1: 显示模式设置命令
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
/* 片选脚设为非启动状态 */
DrvSPI_ClrSS();
/* 片选脚设为启动状态 */
DrvSPI_SetSS();
/* 传送WrData */
SPI_Data = 0x40;//Command2: 数据读写设置命令
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
/* 片选脚设为非启动状态 */
DrvSPI_ClrSS();
/* 片选脚设为启动状态 */
DrvSPI_SetSS();
/* 传送WrData */
SPI_Data = 0xC0;//Command3: 显示地址设置命令
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
for(i=0;i<14;i++)//Data1~n: 显示数据,以Command3指定的地址为起始地址(最多14 bytes)
{
/* 传送WrData */
SPI_Data = WrData;
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
}
/* 片选脚设为启动状态 */
DrvSPI_SetSS();
/* 传送WrData */
SPI_Data = 0x88;//Command4: 显示控制命令
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
/* 片选脚设为非启动状态 */
DrvSPI_ClrSS();
}
void TM1668_Read_KEY(uint8_t *RdData)
{
uint32_t i,SPI_Data;
/* 设置SPI长度为8个位元 */
DrvSPI_SetBitLength(8);
/* 片选脚设为启动状态 */
DrvSPI_SetSS();
/* 传送WrData */
SPI_Data = 0x42;//Command4: 显示控制命令
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
for (i = 0; i < 5; i++)
{
/* 读取资料 */
SPI_Data = 0xffffffff;
DrvSPI_SingleWrite(&SPI_Data);
/* 等待传送退出 */
while (DrvSPI_IsBusy());
/* 从Rx寄存器内读取资料 */
DrvSPI_DumpRxRegister(&SPI_Data, 1);
RdData = (uint8_t) SPI_Data;
}
/* 片选脚设为非启动状态 */
DrvSPI_ClrSS();
}
--代码完毕。
|