历史上的今天
返回首页

历史上的今天

今天是:2025年01月13日(星期一)

正在发生

2020年01月13日 | TM1638测试程序STM8S

2020-01-13 来源:eefocus

//适用于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

推荐阅读

史海拾趣

协顺电子(Finecables)公司的发展小趣事

在品质和创新的支撑下,协顺电子开始积极拓展市场。公司通过参加各类展会、举办技术交流会等方式加强与客户的沟通和交流,同时也不断完善自己的销售网络和售后服务体系。此外,协顺电子还注重品牌建设,通过广告宣传、公关活动等方式提升品牌知名度和美誉度。这些努力使得公司的市场份额不断扩大,品牌影响力也逐渐增强。

First Silicon Co., Ltd公司的发展小趣事

在电子行业快速发展的同时,环保问题也日益受到关注。First Silicon公司积极响应国家环保政策,将环保理念融入企业发展战略之中。公司投入巨资研发环保型半导体材料和生产工艺,努力减少生产过程中的污染排放和资源浪费。同时,公司还积极推广绿色电子产品,引导消费者树立环保意识。通过这一系列的环保举措,First Silicon不仅赢得了社会各界的广泛赞誉,还为其可持续发展奠定了坚实基础。

Gardner Denver公司的发展小趣事

面对日益激烈的市场竞争,First Silicon公司深知供应链管理的重要性。公司投入大量资源,对供应链进行了全面整合和优化。通过建立长期稳定的供应商关系、引入先进的供应链管理软件和提高库存周转率等措施,First Silicon有效降低了原材料成本和库存风险。同时,公司还加强了与下游客户的沟通和合作,确保产品能够及时、准确地送达客户手中。这一系列举措不仅提升了公司的运营效率,还增强了其市场竞争力。

Beck IPC GmbH公司的发展小趣事

Beck IPC始终坚持以研发和创新为核心驱动力。公司每年投入大量资金用于研发新技术和产品,并建立了完善的研发团队和体系。通过不断的技术创新和产品升级,Beck IPC始终保持着在嵌入式通讯和工业物联网领域的领先地位。同时,公司还积极参与国际标准制定和行业交流活动,为推动行业发展贡献自己的力量。

Fukushima Futaba Electric Co Ltd公司的发展小趣事

随着技术的不断成熟和产品质量的提升,Futaba Electric开始将目光投向国际市场。20世纪70年代末至80年代初,公司成功进入欧美市场,与多家国际知名企业建立了合作关系。通过参加国际展会、设立海外分支机构等方式,Futaba Electric的产品逐渐在全球范围内得到推广和应用。这一时期,公司的国际化战略取得了显著成效,为公司的长远发展奠定了更加坚实的基础。

台湾远翔(Feeling Technology)公司的发展小趣事

乔光电子在技术创新方面始终走在行业前列。面对压敏电阻产品技术方面的挑战,如产品失效引发的起火问题,公司在苏州设立了专门的实验室,由7名成员组成研发团队,专注于材料研发。经过不懈努力,乔光电子成功解决了这一难题,并在全球范围内率先大批量使用刷铜技术,进一步提升了产品的性能和质量。此外,公司还不断引入新技术、新设备,提高产品的生产效率和品质,确保在全球市场中保持领先地位。

问答坊 | AI 解惑

ISP下载线+原理图

ISP下载线+原理图  学单片机的朋友能用的上!…

查看全部问答>

界面美化问题

请问大家是如何美化自己开发的基于windows mobile的应用程序的界面的呢?包括使用c++和c#?希望大家指点,谢谢大家!…

查看全部问答>

关于wince下IIC驱动中的中断线程问题?

请问各位高手: 这段在IIC驱动中的中断线程的作用是什么啊? 能否详细解释一下里面的重要代码?? 谢谢各位啦! DWORD I2C_IntrThread(PVOID pArg) {         DWORD ret;         // ???¨I2C????? ...…

查看全部问答>

[请教]keil中如何更合理处理多中断,不容易出现异常?

譬如说: 我用个循环队列存储和发送消息,队列使用固定长度的数组,其中数组的长度肯定长于每条消息,队列中有8个数组(均存在XRAM中); 一个串口中断(每个字节触发一次) 另一个中断(固定T触发一次) 串口中断优先级高 波特率400Kbps; 串口是接收 ...…

查看全部问答>

常用MCU存储器IC

常用存储器IC 型号(规格) 厂商 器件简介 24C01 ATMEL/ST/MICROCHIP 串行EEPROM(1K,128×8) 24C02 ATMEL/ST/MICROCHIP 串行EEPROM(2K,256×8) 24C04 ATMEL/ST/MICROCHIP 串行EEPROM(4K,512×8)&n ...…

查看全部问答>

自产自用的无线遥控灯系统

之前有做过无线温度检测器\\无线温度信息采集终端等东西,后来也零零碎碎做了无线遥控器,这个可在我的前期的博文中看到,后来也为家人买过无线遥控开关,就是采用PT2262/2272编解码芯片做的那种,之前也有留意过采用这种芯片的产品很容易被破解及复制, ...…

查看全部问答>

关于F330调试问题

我用的是C8051F330单片机,下面是一小段程序,但在调试的时候发现有个问题,请给位帮忙解决一下,小弟在此谢过 。。。。。。。。。。。。 sbit dq=P1^2; .......初始化P1^2引脚为推挽输出 dq=0; delay(); dq=1; delay(); if(dq==0) { flag ...…

查看全部问答>

MSP430BSL下载困惑

关于MSP430单片机的下载方式,开始很困惑,下载方式有很多人都说用到了仿真器,什么UIF,PIF的,上网查了一下,仿真器还真不便宜。买了一个开发板,七八十吧,功能不多,但是用的是usb下载程序,其实就是使用了MSP430的BSL下载方式,其所用芯片为PL ...…

查看全部问答>

给还在用CCSV3.3的朋友......正版最新CCSV3.3.....无需破解

replyreload += \',\' + 1285328;  CCSV3.3最新版:   Timson,如果您要查看本帖隐藏内容请回复   CCSV3.3的code generation tools: Timson,如果您要查看本帖隐藏内容请回复     CCSV3.3的升级包(其实下载最新 ...…

查看全部问答>

看 任哲 《嵌入式实时操作系统Uc/os-ii原理及应用》学习笔记

学习任哲《嵌入式实时操作系统UCOS-II原理及应用》有一周了,看了两章的内容。把自己的一些收获及遇到的问题和解决方法总结一下,希望对大家有用…

查看全部问答>