基于新唐MINI54LAN的TM1668的驱动设计  

 

某个朋友的项目,用到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();
}
--代码完毕。