历史上的今天
返回首页

历史上的今天

今天是:2024年11月08日(星期五)

正在发生

2019年11月08日 | STM8S TM1650芯片控制程序

2019-11-08 来源:51hei

以下为.h文件:


 

#ifndef __TM1650_I2C_H

#define __TM1650_I2C_H

#include "stm8s.h"

#include "stm8s_gpio.h"

#include "tim1.h"

#include "usart2.h"

#include

#include

 

 

/**********************************

TM1650芯片控制20路灯函数

PB7为SCL口

PB6为SDA口

**********************************/

 

#define SCL_TM1650              PC_ODR_ODR7

#define SDA_TM1650               PC_ODR_ODR6

#define SDAM_TM1650              PC_IDR_IDR6

#define SET_SCL_OUT_TM1650()    {PC_DDR_DDR7=1; PC_CR1_C17 = 1; PC_CR2_C27 = 0;}

#define SET_SDA_OUT_TM1650()    {PC_DDR_DDR6=1; PC_CR1_C16 = 1; PC_CR2_C26 = 0;}

#define SET_SDA_IN_TM1650()     {PC_DDR_DDR6=0; PC_CR1_C16 = 0; PC_CR2_C26 = 0;}

 

 

void IIC_Init_TM1650(void);

void TDelay_us(u8 z);

void I2C_Start_TM1650(void);

void I2C_Stop_TM1650(void);

void IIC_Ack_TM1650(void);

void IIC_NAck_TM1650(void);

uint8_t IIC_Wait_Ack_TM1650(void);

void IIC_WrByte_TM1650(uint8_t txd);

 

//u8 Scan_Key(void);

void TM1650_Set(u8 add,u8 dat);

void Init_Tm1650(void);

 

#endif

 


以下为.c文件:


#include "TM1650_I2C.h"

 

//--------------------------------------------------------------

// Prototype      : void IIC_Init_TM1650(void)

// Calls          : 

// Description    : 

//--------------------------------------------------------------

void IIC_Init_TM1650(void)

{

   SET_SCL_OUT_TM1650();

   SET_SDA_OUT_TM1650(); 

   SCL_TM1650  = 1;

   SDA_TM1650  = 1;

}

//--------------------------------------------------------------

// Prototype      : void Delay_us(void)

// Description    : 大约延时 z us

//--------------------------------------------------------------

void TDelay_us(u8 z)

{

   //u8 i;                   //fcpu 8MHz 时

   //for (i=50; i>0; i--);

while(z--)

  {

    nop();nop();nop();nop();

  }

}

//--------------------------------------------------------------

// Prototype      : void I2C_Start(void)

// Calls          : Delay_5us()

// Description    : Start Singnal

//--------------------------------------------------------------

void I2C_Start_TM1650(void)

{

    // SDA 1->0 while SCL High

  //SCL高电平期间,SDA出现一个下降沿表示起始信号

  SET_SDA_OUT_TM1650();

    SDA_TM1650 = 1;     //数据线先保持为高,起始信号要该口的下降沿 

TDelay_us(4);

    SCL_TM1650 = 1;        //时钟线保持为高            

    TDelay_us(40);    //有一个大概5us的延时具体以器件而定            

    SDA_TM1650 = 0;        //数据线拉低出现下降沿           

    TDelay_us(4);    //延时 一小会,保证可靠的下降沿            

    SCL_TM1650 = 0;        //拉低时钟线,保证接下来数据线允许改变            

}

 

 

//--------------------------------------------------------------

// Prototype      : void I2C_Stop(void)

// Calls          : Delay_5us()

// Description    : Stop Singnal

//-------------------------------------------------------------- 

void I2C_Stop_TM1650(void)

{

    // SDA 0->1 while SCL High

    //SCL高电平期间,SDA产生一个上升沿 表示停止

  SET_SDA_OUT_TM1650();

SCL_TM1650 = 0;

TDelay_us(2);

SDA_TM1650 = 0; //保证数据线为低电平

TDelay_us(40);

    SCL_TM1650 = 1; //先保证时钟线为高电平

    TDelay_us(10);    //延时 以得到一个可靠的电平信号            

    SDA_TM1650 = 1;        //数据线出现上升沿           

    TDelay_us(40);    //延时 保证一个可靠的高电平           

}

 

 

//应答函数

void IIC_Ack_TM1650(void)

{

    //数据线一直保持为低电平,时钟线出现上升沿即为应答

 

SET_SDA_OUT_TM1650();

TDelay_us(10);

    SDA_TM1650 = 0;

    TDelay_us(10);

    SCL_TM1650 = 0;

    TDelay_us(40);

SCL_TM1650 = 1;

TDelay_us(40);

    //应答完成后 将时钟线拉低 允许数据修改

    SCL_TM1650 = 0;

}

//非应答

void IIC_NAck_TM1650(void)

{

    //非应答即相反 与应答区别即为数据线保持高电平即可

SET_SDA_OUT_TM1650();

TDelay_us(10);

    SDA_TM1650 = 1;

    TDelay_us(10);

SCL_TM1650 = 0;

TDelay_us(40);

    SCL_TM1650 = 1;

    TDelay_us(40);

    //最后要将时钟线拉低 允许数据变化

    SCL_TM1650 = 0;

}

//等待应答

uint8_t IIC_Wait_Ack_TM1650(void)//0为有应答,1为无应答

{

    //应答等待计数

    uint8_t ackTime = 0;

    //先将数据线要设置成输入模式本程序未体现,有应答则会出现下降沿

SCL_TM1650 = 0;

SET_SDA_OUT_TM1650();

    TDelay_us(10);

SDA_TM1650 = 1;//

TDelay_us(30);

SET_SDA_IN_TM1650();//切换为输入模式

    //时钟线拉高

    SCL_TM1650 = 1;

    TDelay_us(30);

    //等待数据线拉低应答

    while(SDAM_TM1650){

        //如果在该时间内仍未拉低

        ackTime ++;

        if(ackTime > 250)

        {

            //认为非应答 停止信号

            I2C_Stop_TM1650();

            return 1;

        }

    }

    SCL_TM1650 = 0;

    return 0 ;

}

 

void IIC_WrByte_TM1650(uint8_t txd)

{

    //定义一个计数变量

    uint8_t i;

SET_SDA_OUT_TM1650();

    //将时钟线拉低允许数据改变

//    SCL = 0;

    //按位发送数据

    for(i = 0;i < 8; i ++)

    {

  TDelay_us(2);

        if((txd&0x80)>>7) //0x80  1000 0000

SDA_TM1650=1;

else

SDA_TM1650=0;

        txd<<=1;  

TDelay_us(20);   

SCL_TM1650=1;

TDelay_us(20);  

SCL_TM1650=0;

TDelay_us(20); 

    }

}

 

/***************************

u8 Scan_Key(void)  //按键扫描

{

u8 i;

u8 rekey;

I2C_Start_TM1650();

IIC_WrByte_TM1650(0x49);//读按键命令

IIC_Ack_TM1650();

//DIO_H;

SET_SDA_IN_TM1650();//切换为输入模式

for(i=0;i<8;i++)

{

  SCL_TM1650=1;

  rekey = rekey<<1;

  

  if(SDAM_TM1650)

  {

  rekey++;

  } 

  TDelay_us(5);

  SCL_TM1650=0;

}

IIC_Ack_TM1650();

I2C_Stop_TM1650();

return(rekey);

}

****************************/

 

void TM1650_Set(u8 add,u8 dat) //数码管显示

{

//写显存必须从高地址开始写

I2C_Start_TM1650();

IIC_WrByte_TM1650(add); //第一个显存地址

IIC_Ack_TM1650();

IIC_WrByte_TM1650(dat);

IIC_Ack_TM1650();

I2C_Stop_TM1650();

}

void Init_Tm1650(void)

{

IIC_Init_TM1650();

delay_ms(50); //需要延时一小段时间,否则开显示会无响应

TM1650_Set(0x48,0x31);//初始化为5级灰度,开显示

}


注意:TM1650芯片启动可能需要一点时间,故发送开显示前应延时一小段时间,否则会收不到。

推荐阅读

史海拾趣

Goodwork Semiconductor ( GW )公司的发展小趣事
根据负载的电压和功率要求选择合适的稳压器。
FOSLINK公司的发展小趣事

为了进一步扩大市场份额,FOSLINK公司积极实施全球化战略。公司先后在多个国家和地区设立了研发中心、生产基地和销售网络,形成了覆盖全球的业务布局。通过全球化的资源配置和市场拓展,FOSLINK成功打入了多个国际知名企业的供应链体系,为其提供了优质的产品和服务。这一系列的全球化举措,不仅提升了FOSLINK的品牌影响力,还为其未来的发展奠定了坚实的基础。

BTCPower公司的发展小趣事

随着技术的不断成熟和产品的广泛应用,BTCPower开始寻求更广阔的市场空间。公司积极与国际知名电子品牌进行合作,将其产品推向全球市场。通过与这些品牌的合作,BTCPower不仅提升了自身的品牌知名度,还获得了更多的商业机会和市场份额。

Fairchild公司的发展小趣事

近年来,Fairchild公司在全球范围内与众多知名企业建立了合作关系。其中,与华为的合作尤为引人注目。华为作为全球领先的通信设备制造商,对供应商的要求极为严格。然而,Fairchild公司凭借其出色的产品质量、客户支持和公司间的成功合作,从众多供应商中脱颖而出,成为华为的核心合作伙伴之一。华为对Fairchild公司的认可不仅体现在订单量的增加上,还体现在对其产品和服务的高度评价上。

创世(CS)公司的发展小趣事

创世公司(CS)的创立源于对未来技术趋势的敏锐洞察。在5G、人工智能、物联网等行业还未广泛崛起的初期,创世公司就预见到这些技术将引领未来电子行业的发展。基于这种战略眼光,创世公司决定专注于SD NAND存储产品的研发和生产。这一决策不仅为公司的后续发展奠定了坚实的基础,也展示了创始团队对未来技术趋势的坚定信心。

千志电子(CCO)公司的发展小趣事

千志电子一直注重技术研发和创新,不断推动产业升级。公司拥有一支专业的研发团队和先进的研发设备,致力于电阻技术的研发和创新。通过与高校和科研机构的合作,千志电子不断引进新技术、新工艺和新材料,提高产品的技术含量和附加值。同时,千志电子还注重知识产权的保护和管理,积极申请专利和注册商标,维护了自身的合法权益。

问答坊 | AI 解惑

求简易数控直流电源

本帖最后由 paulhyde 于 2014-9-15 09:43 编辑 求简易数控直流电源论文  …

查看全部问答>

第三代研发管理模式:中国企业的必然选择

中国是人口最多,经济成长最快速的发展中国家。许多经济学家预测,中国大陆的GDP可能在20年内赶上美国,中国品牌的产品将普遍出现在全球市场上。虽然外界对于中国未来的预测是令国人兴奋的,不过现实上中国企业的生产力与国际竞争力正陷入持续成长 ...…

查看全部问答>

Verilog HDL UART

如题 很多给出的代码 没有过采样 本UART 测试过 稍作修改 就可以 用作它用! 时钟 源代码 [qq] 381312581 [/qq]…

查看全部问答>

关于主从通信

最近兄弟我在研究主机与从机的通信问题。碰到点问题想请教下各位大侠:   1、初步估计主从机之间通信机制不会涉及很复杂的协议,正常情况下,主从相连后,会有正常的菜单显示   2、主从机有三个触点相连,在从机上电时会在四 ...…

查看全部问答>

求助:第一个自写驱动 编译出错

我按着周立功的书做的,例如: 1.在C:\\WINCE500\\PLATFORM\\SMDK2410\\SRC\\DRIVERS\\目录下创建SimpleDriver目录; 2.C:\\WINCE500\\PLATFORM\\SMDK2410\\SRC\\DRIVERS\\GPIO目录下复制makefile文件到SimpleDriver目录;(我没有找到GPIO目录, ...…

查看全部问答>

PROTEL 99SE不能正常使用!

大家好!我安好了PROTEL 99SE并升级了SP6,但为什么新建时打不开呢?弹出一个对话框:root has been delete!各位大虾,这是个么子情况呢?求教,谢谢啦! …

查看全部问答>

【问TI】请问1138不起振问题

请问我画完PCB后,确认没有连线没有问题,然后焊板子,出来后发现有时候不起振,也就是不上电,请问这是什么原因呢?是改变布局有影响的原因吗?…

查看全部问答>

如何把数据写入EPCS中

我想把图片数据写入epcs的flash中 然后用fpga读取 VGA显示   但是我如何把图片的数据写入EPCS中 求指导!!…

查看全部问答>

谈谈嵌入式系统的可靠性(四)

降低模块间耦合,提高应用程序可靠性     另一个会严重降低应用程序可靠性的地方,就是模块间互相耦合,搅在一起。搅在一起的代码,就像一盘意大利面条,又杂又乱,如果代码写成这样的话,可靠性要高,上帝都会笑。    那么, ...…

查看全部问答>

新手第一次提问,真心调试了几天,有bug解决不了,求助!

硬件为MSP430G2553,小弟大一,还没有数电和模电基础,硬学试试。 麻烦先看看要求: 1.AD 模块的使用 使用内部ADC 模块持续测量一个外部电压(0—2.5V ) 2.定时器模块的使用 用 1  中测量的电压值决定两个 LED  中一 ...…

查看全部问答>