TM1638测试程序STM8S

2020-01-13来源: eefocus关键字:TM1638  测试程序  STM8S

//适用于STM8S003F3

//main.c 文件

//实验现象:刚开始上电时,所有数码管亮且显示0;按下按键其对应的数码管数字加一,对应的LED灯亮

#include"stm8s.h"

#include"tm1638.h"

unsigned char num[8];        //各个数码管显示的值

int main(void)

{

u8 i;

       init_TM1638();                                   //初始化TM1638

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

       Write_DATA(i<<1,tab[0]);                    //初始化寄存器(所有数码管上电时均显示0)

       while(1)

       {

              i=Read_key();                          //读按键值

              if(i<8)

              {

                     num[i]++;

                     while(Read_key()==i);               //等待按键释放

                     if(num[i]>15)

                     num[i]=0; //显示值从0到F

                     Write_DATA(i*2,tab[num[i]]);

                     Write_allLED(1<

              }

       }

}



#ifdef USE_FULL_ASSERT

void assert_failed(u8* file,u32 line)

{

while(1)

  {

  }

}

#endif


//tm1638.h文件

//PD4引脚连DIO   //数据输出输入

//PD5引脚连CLK  //时钟

//PD6引脚连STB

#ifndef    _TM1638_H

#define   _TM1638_H

#include"stm8s.h"

#define   DATA_COMMAND       0X40

#define   DISP_COMMAND 0x80

#define   ADDR_COMMAND      0XC0 

//共阴数码管显示代码

unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

                        0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};  //1~f

void TM1638_Write(unsigned char DATA)               //写数据函数

{

u8 i;

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

       {

             GPIO_WriteLow(GPIOD,GPIO_PIN_5);//CLK=0

              if(DATA&0X01)

                     GPIO_WriteHigh(GPIOD,GPIO_PIN_4);   //DIO=1

              else

                     GPIO_WriteLow(GPIOD,GPIO_PIN_4);   //DIO=0

              DATA>>=1;

              GPIO_WriteHigh(GPIOD,GPIO_PIN_5);//CLK=1

       }

}


unsigned char TM1638_Read(void)                                 //读数据函数

{

       u8 i;

       u8 temp=0;//存放读取的值

       GPIO_WriteHigh(GPIOD,GPIO_PIN_4);      //设置为输入(DIO=1)

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

       {

              temp>>=1;

              GPIO_WriteLow(GPIOD,GPIO_PIN_5);//CLK=0

              if(GPIO_ReadInputPin(GPIOD,GPIO_PIN_4))//DIO==1?

                     temp|=0x80;

              GPIO_WriteHigh(GPIOD,GPIO_PIN_5);//CLK=1

       }

       return temp;

}


void Write_COM(unsigned char cmd)        //发送命令字

{

/*

在上升或下降沿初始化串行接口,随后等待接收 指令。STB 为低后的第一个字节作为指令,当处

理指令时,当前其它处理被终止。当STB 为高时, CLK 被忽略。

*/


       GPIO_WriteLow(GPIOD,GPIO_PIN_6);//STB=0

       TM1638_Write(cmd);

       GPIO_WriteHigh(GPIOD,GPIO_PIN_6);//STB=1


}


unsigned char Read_key(void)


{

       u8 c[4],i,key_value=0;

       GPIO_WriteLow(GPIOD,GPIO_PIN_6);//STB=0

       TM1638_Write(0x42);                      //读键扫数据 命令

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

              c[i]=TM1638_Read(); //需要连续读4个字节,不能跳读

       GPIO_WriteHigh(GPIOD,GPIO_PIN_6);                                  //4个字节数据合成一个字节

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

              key_value|=c[i]<

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

              if((0x01<

                     break;

       return i;//返回读取到的键序号

}


void Write_DATA(unsigned char add,unsignedchar DATA)           //指定地址写入数据

{

       Write_COM(0x44);

       GPIO_WriteLow(GPIOD,GPIO_PIN_6);//STB=0

       TM1638_Write(0xc0|add);//STB为低的第一个字节作为指令

       TM1638_Write(DATA);//第二个字节及之后作为数据

       GPIO_WriteHigh(GPIOD,GPIO_PIN_6);//STB=1

}


/*

void Write_oneLED(unsigned char num,unsigned char flag)   //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮

{

       if(flag)

              Write_DATA(2*num+1,1);

       else

              Write_DATA(2*num+1,0);

}     */

void Write_allLED(unsigned char LED_flag)                                   //控制全部LED函数,LED_flag表示各个LED状态

{

       u8 i;

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

              {

                    if(LED_flag&(1<

                            //Write_DATA(2*i+1,3);

                            Write_DATA(2*i+1,1);

                     else

                            Write_DATA(2*i+1,0);

              }

}

 

//TM1638初始化函数

void init_TM1638(void)

{

  u8 i;

GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_SLOW);//初始化相关的GPIO口

GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_SLOW);

GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_SLOW);

       Write_COM(0x8b);       //亮度 (0x88-0x8f)8级亮度可调

       Write_COM(0x40);       //采用地址自动加1

       GPIO_WriteLow(GPIOD,GPIO_PIN_6);         //STB=0         

       TM1638_Write(0xc0);    //设置起始地址

       for(i=0;i<16;i++)       //传送16个字节的数据

              TM1638_Write(0x00);

       GPIO_WriteHigh(GPIOD,GPIO_PIN_6);  //STB=1

}

#endif

关键字:TM1638  测试程序  STM8S 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485480.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8S003F3使用总结——定时器
下一篇:STM8S003外部中断识别机械式编码器正反转

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

LED 驱动控制专用电路 TM1628 AVR 测试程序源代码
#include <avr/io.h>#include <util/delay.h>#define TM1628_DIO_PORTNAME     B#define TM1628_DIO_BIT          5#define TM1628_CLK_PORTNAME     B#define TM1628_CLK_BIT          7#define TM1628_STB_PORTNAME     B#define TM1628_STB_BI
发表于 2019-12-04
STM32 TM1640芯片驱动程序
以下为.h文件:#ifndef __TM1640_H__#define __TM1640_H__#include "stm32f10x.h"   #define   ADDR_START1640        0XC0    #define     DSP1640_DIS     0  #define     DSP1640_ENB     1    /* 控制显示 0x88
发表于 2019-11-09
STM32 TM1640芯片驱动程序
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 <iostm8s103f3.h>#include <intrinsics.h>  /**********************************TM1650芯片控制20路灯函数PB7为SCL口PB6为SDA口
发表于 2019-11-08
STM8S TM1650芯片控制程序
TM1640与PIC12F629单片机的结合
TM1640是驱动数码管的专用集成电路,可以直接驱动16位共阴数码管,手册请下载附件。/********************************本程序直接驱动16位共阴数码管,各数码管分别驱动0、1、2、……E、F。*/#include <pic.h>  //PIC12F629__CONFIG(0x3F84); #define clk GPIO0  //时钟信号#define dio GPIO1   //数据/地址数据#define uchar unsigned char#define uint unsigned int       
发表于 2019-11-08
TM1650模块单片机源程序(子函数)
单片机源程序如下:#include<STC12C5A.h>#include"tm1650.h"void Delay_us(uint i) //us延时{        for(;i>0;i--)        {        _nop_();//        _nop_();//        _nop_();        }}void
发表于 2019-11-06
MFRC522电路原理图与单片机测试程序
MFRC522电路原理图: 天线部分: 单片机+MFRC522测试源程序如下:/**********************RC522实验开发板例程*************************  CPU:STC89C52RC*  晶振:11.0592MHZ******************************************************************///实验目的:/*-----------------------------------------------  名称:MF RC522  内容:通过标准程序静态显示字符 
发表于 2019-12-11
MFRC522电路原理图与单片机测试程序
小广播
何立民专栏 单片机及嵌入式宝典

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

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