STM8S TM1650芯片控制程序

发布者:EtherealGaze最新更新时间:2019-11-08 来源: 51hei关键字:STM8S  TM1650芯片  控制程序 手机看文章 扫描二维码
随时随地手机看文章

以下为.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芯片启动可能需要一点时间,故发送开显示前应延时一小段时间,否则会收不到。

关键字:STM8S  TM1650芯片  控制程序 引用地址:STM8S TM1650芯片控制程序

上一篇:STM8S103K3 I2C
下一篇:STM8S MAX7219点阵模块驱动芯片程序

推荐阅读最新更新时间:2024-11-22 14:31

STM8S单片机入门2(关机模式开关机按钮)
开关机功能是使用电池供电系统的最基本功能。如果使用机械式开关(2段拨动开关,自锁开关等)等直接接通和切断电源,不说机械部件的可靠性,至少自动关机(一般在长时间不操作、电池电量低时需要自动关机)功能就比较难实现。所以电池供电系统一般采用按钮开关,用一个按钮配合软件实现按一次开机、再按一次关机的功能及自动关机的功能。 这部分内容就讲述如何在STM8S上实现一键式的开关机功能。开关机功能要使用单片机的一个引脚(PD4)作为输入端,连接到按钮,接收按纽按下产生的电信号,然后再使用另一个引脚(PD3)作为输出端去驱动由三极管8550构成的一个电子开关实现对系统电源的控制。而STM8S单片机本身就直接接在电池上,利用单片机的停机模
[单片机]
<font color='red'>STM8S</font>单片机入门2(关机模式开关机按钮)
stm8s 低功耗模式
因为用干电池供电,又需要超长待机了,成本又限制不能使用stm8l,所以开启低功耗之旅 1.元器件选型 挑选低功耗的元器件,一定要关注工作电流 led 一定要高电平导通,不然的话,默认状态拉高很费电 元器件尽量选择共阴解法,更省电 2.主时钟频率 频率和功耗是成正比的,选择试用的最低晶振 能不开的功能尽量不开 下面是对应的功耗表 ADC最费电 3.合理使用低功耗模式 主要有一下几种 等待模式 活跃停机模式 停机模式 下面是对比 等待模式 使用asm(“WFI”)进入 会被各种中断激活 活跃停机模式 AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间
[单片机]
<font color='red'>stm8s</font> 低功耗模式
基于单片机的电梯控制程序
#include reg52.h //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit SCL=P2^0; sbit SDA=P2^1; sbit led=P2^2; sbit led1=P1^5; sbit tz=P2^3; //停止按钮 sbit lc1=P2^4; //一层楼按钮 sbit lc2=P2^5; //二层楼按钮 sbit lc3=P2^6; //三层楼按钮 sbit lc4=P2^7; //四层楼按钮 sbit mb=P0^0; //门保险
[单片机]
labview控制程序流程——labview事件结构
1 事件结构及它的图形化表示法 事件被用来通知用户有异步活动发生。图形化语言的事件响应包括:用户界面事件、外部I/O事件和程序其它部分的事件。 对事件的处理程序也被称为:事件驱动程序。事件驱动程序可以分为若干个分支,每个分支处理不同的事件响应。所以对事件的响应结果也可以控制程序的流程。 事件驱动机制来自于可视化的操系统,可视化操作系统对用户事件提供了简洁、有效的响应方式,最常见的事件来自于鼠标和键盘。 虚拟仪器借助于操作系统的事件处理机制实现了图形化语言的事件响应能力。在没有引入事件结构之前,LabVIEW是借助于轮询的方式来查询用户操作,由于轮询的方式会占用一定的CPU资源,甚至可能遗漏事件,所以这种处
[测试测量]
labview<font color='red'>控制程序</font>流程——labview事件结构
STM8S 硬件SPI驱动74HC595
简介:一直对STM8S的硬件SPI感兴趣,但没有真正使用过,以往都是用IO口模拟,这次刚好有个板子上有两个595驱动的8位LED数码管,就在上面试了一把,把过程记录一下。 硬件接线图: 595是数据接收器件,所以MCU只用了3条线与之相连,分别是MOSI接SER,SCK接CLK,NSS接RCK。其实这里RCK可以用其他的IO口的。 相关的代码: LOCAL uint8 DISP_BUF ={0,1,2,3,4,5,6,7}; //显示缓冲区 PUBLIC uint8 DISP_TAB = //显示码表 { 0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x04,0x05,0x06,
[单片机]
<font color='red'>STM8S</font> 硬件SPI驱动74HC595
检测0~20MA电流传感器报警控制程序
功能如下: 1、24VDC供电,输入端可识别4-20mA信号输入,可以根据用户任意设定电流值,进行继电器报警输出,输出形式常开+常闭; 2、用来实现高于某电流值继电器断开,当低于设定电流值继电器闭合,进而导通回路。 //#include reg52.h #include STC12C2052AD.h //库文件 #include intrins.h #define uchar unsigned char //宏定义字符型变量 #define uint unsigned int //宏定义整型变量
[单片机]
检测0~20MA电流传感器报警<font color='red'>控制程序</font>
stm8s开发(二) GPIO的使用:点亮LED
通用输入输出口(GPIO)是我们使用单片机最基本的,主要功能: ● 端口的各个位可以被单独配置 ● 可选择的输入模式:浮动输入和带上拉输入 ● 可选择的输出模式:推挽式输出和开漏输出 ● 外部中断可以单独使能和关闭 用户手册上描述: 每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR) 总是同相关的。控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。 各种不同配置总结如下: 配置模式 DDR CR1 CR2 配置模式 上拉电阻 输入 0 0 0 悬浮输入
[单片机]
STM8S 三种时钟源的配置HSE\HSI\LSI的配置
1. 关于HSE的时钟配置为主时钟 static void CLK_Config(void) { CLK_DeInit(); // 初始化 CLK_HSECmd(ENABLE); //使能HSE CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); //切换HSE 并关闭其他时钟 为自动模式 /*Enable CSS interrupt */ CLK_ITConfig(CLK_IT_CSSD, ENABLE); /* Enab
[单片机]
<font color='red'>STM8S</font> 三种时钟源的配置HSE\HSI\LSI的配置
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved