打印
[共享空间]

基于新唐MINI54LAN的TM1668的驱动设计--缥缈九哥测试笔记

[复制链接]
3037|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
缥缈九哥|  楼主 | 2012-12-19 13:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 缥缈九哥 于 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();
}


--代码完毕。

相关帖子

沙发
缥缈九哥|  楼主 | 2012-12-21 02:32 | 只看该作者
已经没有人愿意顶起了。过时了?

使用特权

评论回复
板凳
YDMCP| | 2012-12-21 07:24 | 只看该作者
顶起

使用特权

评论回复
地板
chenyu988| | 2012-12-21 08:11 | 只看该作者
我顶啊

使用特权

评论回复
5
Cortex-M0| | 2012-12-26 04:30 | 只看该作者
帮顶一下。。。

使用特权

评论回复
6
缥缈九哥|  楼主 | 2013-3-5 15:25 | 只看该作者
顶起。

使用特权

评论回复
7
呆板书生| | 2013-8-24 12:50 | 只看该作者
再顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:童时不懂世事艰,笑谈学成锦衣还。岁月无声已先过,男儿有泪空自弹。    莫待沾霜愁上发,须嬴吐气喜开颜。拼搏半年誓如愿,不到长城心不甘。

67

主题

1868

帖子

271

粉丝