STM8S驱动TM1640代码

2019-07-18 20:25发布

TM1640驱动8段16位数码管很好用,贴一个已经调试好的代码供大家参考
[mw_shl_code=c,true]/********************  (C) COPYRIGHT****************************
* File Name          : TM1640.c
* Author             :
* Version            : V1.0
* Date               : 2016
* Description        : LED 数码管 驱动函数
****************************************************************/
#include "TM1640.h"
#include "Application.h"

//*************************************************************
//*********START***********************************************
static void TmStart()                  //1640开始
{
        //TMSCLK(0);
        TMDIN(1);
        nop();
        nop();
                nop();
        nop();
        TMSCLK(1);       
        nop();
        nop();
                nop();
        nop();
        TMDIN(0);
        nop();
        nop();
                nop();
        nop();
        TMSCLK(0);
        nop();
        nop();
                nop();
        nop();
}
//**************************************************************
static void TmStop()                         //1640结束
{
        TMSCLK(0);
        nop();
        nop();
                nop();
        nop();
        TMDIN(0);
        TMSCLK(1);
        nop();
        nop();
                nop();
        nop();
        TMDIN(1);
        nop();
        nop();
                nop();
        nop();
        TMSCLK(1);
        nop();
        nop();       
        nop();
                nop();
        nop();
}
//***********************************************************
static void TmWrite(u8 date)                  //1640写字节
{
        u8 i,aa;
        aa=date;
        //TMDIN(0);
        //TMSCLK(0);
        for(i=0;i<8;i++)
        {         
                TMSCLK(0);
                if(aa&0x01)               
                {
                        TMDIN(1);
                        nop();
                        nop();
                                nop();
                        nop();
                }
                else
                {
                        TMDIN(0);
                        nop();
                        nop();
                                nop();
                        nop();
                }
                TMSCLK(1);
                nop();
                        nop();
                nop();
                aa=aa>>1;
        }
        //TMSCLK(0);
        //TMDIN(0);                       
}

/*****************************************************************************************
Description : 向TM1640发送显示数据
*****************************************************************************************/
void SysTmSendAutoAddr(u8 startaddr, u8 endaddr, u8 *dat,u8 light ,bool state)                  
{
        u8 nCount;
        u8 value = 0;
        TmStart();
        //高四位数据类型        低四位是命令
        //设置数据,地址加1模式
        TmWrite(0x40 | 0x00);      
        TmStop();

        TmStart();
        //地址命令设置 高四位数据类型         低四位是显示地址
        TmWrite(0xC0 | startaddr);
        for(nCount=0;nCount <= endaddr - startaddr ;nCount++)
        {
                TmWrite(*dat);
                dat++;
        }      
        TmStop();

        TmStart();
        /*
        显示控制命令:
        MSB                                 LSB
        B7 B6 B5 B4 B3 B2 B1 B0        
        1 0        0 0         1 0 0 0         设置脉冲宽度为 1/16
        1 0 0 0         1 0 0 1         设置脉冲宽度为 2/16
        1 0 0 0         1 0 1 0         设置脉冲宽度为 4/16
        1 0 0 0         1 0 1 1         设置脉冲宽度为 10/16
        1 0 0 0         1 1 0 0         设置脉冲宽度为 11/16
        1 0 0 0         1 1 0 1         设置脉冲宽度为 12/16
        1 0 0 0         1 1 1 0         设置脉冲宽度为 13/16
        1 0 0 0         1 1 1 1         设置脉冲宽度为 14/16
        1 0 0 0         0 X X X                显示开关设置   显示关
        1 0 0 0         1 X X X         显示开关设置   显示开
        */
        //显示控制 高4位命令  低4位B3-B0 B3控制亮灭,B2-B0设置亮度
        LIMIT(0,light,7);
        if(state == TRUE )
        {
                value =0x80 | light | 0x08;
        }
        else
        {
                value =0x80 | light ;
                value = value & (~0x08);//关闭显示
        }
        TmWrite(value);       //控制显示,开显示,脉冲宽度为14/16
        TmStop();
                  
}  

/*****************************************************************************************
Description : 向TM1640发送显示数据设置显示地址
*****************************************************************************************/

void SysTmSendSetAddr(u8 addr, u8 dat, u8 light, bool state)   
{
        //u8 nCount;
        u8 value;
        TmStart();
        //高四位数据类型        低四位是命令
        //设置数据,地址固定
        TmWrite(0x40 | 0x04);      
        TmStop();

        TmStart();
        //地址命令设置 高四位数据类型         低四位是显示地址
        LIMIT(0,addr,11);
        TmWrite(0xC0 | addr);
        TmWrite(dat);     
        TmStop();

        TmStart();
        /*
        显示控制命令:
        MSB                                 LSB
        B7 B6 B5 B4 B3 B2 B1 B0        
        1 0        0 0         1 0 0 0         设置脉冲宽度为 1/16
        1 0 0 0         1 0 0 1         设置脉冲宽度为 2/16
        1 0 0 0         1 0 1 0         设置脉冲宽度为 4/16
        1 0 0 0         1 0 1 1         设置脉冲宽度为 10/16
        1 0 0 0         1 1 0 0         设置脉冲宽度为 11/16
        1 0 0 0         1 1 0 1         设置脉冲宽度为 12/16
        1 0 0 0         1 1 1 0         设置脉冲宽度为 13/16
        1 0 0 0         1 1 1 1         设置脉冲宽度为 14/16
        1 0 0 0         0 X X X                显示开关设置   显示关
        1 0 0 0         1 X X X         显示开关设置   显示开
        */
        //显示控制 高4位命令  低4位B3-B0 B3控制开关,B2-B0设置亮度
        LIMIT(0,light,7);
        if(state == TRUE )
        {
                value =0x80 | light | 0x08;
        }
        else
        {
                value =0x80 | light ;
                value = value & (~0x08);//关闭显示
        }
        TmWrite(value);       //控制显示,开显示,脉冲宽度为14/16
        TmStop();
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。