TM1637数码管显示STC51单片机驱动程序

发布者:SereneNature最新更新时间:2020-04-11 来源: eefocus关键字:TM1637  数码管显示  STC51单片机  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

/*

Coder : Farman

Date  : 2018-01-02

参考了厂家的TM1637数据手册,在此表示感谢。

*/

 

#include <STC89C5XRC.h>  //包含52单片机头文件

#include "Delay.h"

 

////////////////////////////////////////////////////////////////////////////

 

 

sbit I2C_SCL = P2^1;   //定义模拟IIC总线的时钟线

sbit I2C_SDA = P2^0;   //定义模拟IIC总线的数据线

 

 

#define TM1637_BRIGHTNESS 7 // 0 - 7

 

 

////////////////////////////////////////////////////////////////////////////

 

 

void I2C_delay()

{

    nop_();

}

 

 

void I2C_start()

{   

    I2C_SCL = 1; 

    I2C_SDA = 1;

 

 

    I2C_delay();

 

 

    I2C_SDA = 0; // 时钟线设置为常态,低电平

}

 

 

/*

I2C 总线写1个字节

不包含应答位的检测

*/

void I2C_write_byte(char byte_to_write)

{

    unsigned char i;

 

 

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

    {

        I2C_SCL = 0;

 

        I2C_SDA = byte_to_write & 0x01;

        I2C_delay();

 

        I2C_SCL = 1;

        I2C_delay();

 

 

        I2C_SCL = 0;

        I2C_delay();

 

 

        byte_to_write >>= 1;

    }

 

    return; 

}

 

 

void I2C_check_ack()

{

    // I2C 检查应答位,实际未检查,只发送了应答位时钟,认为TM1637工作正常

 

 

    I2C_SCL = 0;

    I2C_delay();//在第八个时钟下降沿之后延时5us,开始判断ACK 信号

 

    while(I2C_SDA)

    {

        ;

    }

 

 

    I2C_SCL = 1;

    I2C_delay();

 

 

    I2C_SCL=0;

}

 

 

void I2C_send_ack()

{

    I2C_SDA = 0;

    I2C_delay();

 

 

    I2C_SCL = 1;

    I2C_delay();

 

 

    I2C_SCL = 0;

    I2C_delay();

 

 

    I2C_SDA = 1;

    I2C_delay();

}

 

 

void I2C_stop()

{

    I2C_SCL = 0;

    I2C_delay();

 

 

    I2C_SDA = 0;

    I2C_delay(); 

 

 

    I2C_SCL = 1;

    I2C_delay();

 

 

    I2C_SDA = 1;

}

 

 

///////////////////////////////////////////////////////////////////////////

//

// TM1637模块操作函数

//

//////////////////////////////////////////////////////////////////////////

 

 

void TM1637_write_command_byte(unsigned char command)

{

    I2C_start();

    I2C_write_byte(command);

    I2C_check_ack();

    I2C_stop();

}

 

 

 

 

// bright : 0 - 7

void TM1637_display_switch_and_bright(bit enable_display, unsigned char bright)

{

    TM1637_write_command_byte(0x80 + (enable_display ? 0x08 : 0x00) + bright);

}

 

 

 

 

void TM1637_write_display_bytes(unsigned char first_addr, 

                                unsigned char bytes_to_write[],

                                unsigned char num_of_bytes)

{

    unsigned char i;

 

 

    I2C_start();

    I2C_write_byte(0x40);

    I2C_check_ack();

    I2C_stop();

 

 

    I2C_start();

    I2C_write_byte(0xC0 + first_addr);

    I2C_check_ack();

 

 

    for(i=0; i    {

        I2C_write_byte(bytes_to_write[i]);

        I2C_check_ack();

    } 

 

 

    I2C_stop();

}

 

 

 

 

// addr: 0 - 5

void TM1637_write_display_byte(unsigned char addr, unsigned char segments)

{

    I2C_start();

    I2C_write_byte(0x40 + addr);

    I2C_check_ack();

    I2C_stop();

 

 

    I2C_start();

    I2C_write_byte(0xC0 + addr);

    I2C_check_ack();

 

 

    I2C_write_byte(segments);

    I2C_check_ack();

 

 

    I2C_stop();

}

 

 

 

 

code unsigned char TM1637_SEG_TAB[] = 

{

     0x3F // 00111111 0

    ,0x06 // 00000110 1

    ,0x5B // 01011011 2

    ,0x4F // 01001111 3

    ,0x66 // 01100110 4

    ,0x6d // 01101101 5

    ,0x7d // 01111101 6

    ,0x07 // 00000111 7

    ,0x7F // 01111111 8

    ,0x6F // 01101111 9

    ,0x77 // 01110111 A

    ,0x7C // 01111100 b

    ,0x39 // 00111001 C

    ,0x5E // 01011110 d

    ,0x79 // 01111001 E 

    ,0x71 // 01110001 F 

};

 

 

void TM1637_show_digit(unsigned char pos, unsigned char digit, bit with_dot)

{

    TM1637_write_display_byte(pos, TM1637_SEG_TAB[digit] | (with_dot ? 0x20 : 0x00));

}

 

 

 

 

void TM1637_init()

{

    unsigned char i;

 

 

    TM1637_display_switch_and_bright(1, TM1637_BRIGHTNESS);

 

 

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

    {

        TM1637_write_display_byte(i, 0xFF);

    }

 

 

    Delay200ms();

 

 

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

    {

        TM1637_write_display_byte(i, 0x00);

    }

 

 

    Delay200ms();

 

 

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

    {

        TM1637_write_display_byte(i, 0xFF);

    }

 

 

    Delay200ms();

 

 

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

    {

        TM1637_write_display_byte(i, 0x00);

    }

 

 

    Delay200ms(); 

}

 

 

void TM1637()

{

    unsigned char seg;

    unsigned char i, j;

 

 

    TM1637_init();

 

 

    while(1)

    {

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

        {

            for(j=0; j<6; j++)

            {

                TM1637_show_digit(j, i, 0);

            }

 

 

            Delay1s();

        }

    }

 

}

关键字:TM1637  数码管显示  STC51单片机  驱动程序 引用地址:TM1637数码管显示STC51单片机驱动程序

上一篇:linux系统与51单片机实现串口数据交互
下一篇:89C51单片机数码管显示

推荐阅读最新更新时间:2024-11-12 12:57

IDE接口驱动程序移植
从上图可知:中断引脚为EINT6,上升沿有效;使用nWAIT信号;数据位宽为16。 如前所述,移植驱动,只需要把上面的地址、中断号告诉内核就可以了。 只需要修改两个文件,drivers/ide/arm/ide_arm.c、drivers/ide/Kconfig。 在drivers/ide/arm/ide_arm.c文件中增加ide_s3c24xx_init函数,修改后文件如下(使用编译开关CONFIG_ARCH_S3C2410包含起来的代码是新加的): 配置、编译内核: 在内核根目录下执行“make menuconfig”,配置成下面这样: 接下来需要安装一些工具: 1.安
[单片机]
IDE接口<font color='red'>驱动程序</font>移植
基于proteus的51单片机仿真实例六十、8位数码管显示实例
1、本例实现在8位数码管上同时显示多个不同字符。 2、本例使用了8只集成式7段共阳数码管(pruteus中元件标识为7seg-mpx8-ca-blu,共阳为ca,共阴为cc),所有8个数码管的段码引脚a,b,c,d,e,f,g,dp都是分别并联在一起,任何时候发送的段码均会传送到所有数码管上,所有的数码管的共阳极是独立的,本例中个数码管的共阳极分别与8只NPN三极管射极相连,程序运行时,任意时刻仅允许一只数码管的共阳极连接+5V,当向连接段码的端口发送段码值时,相应数字只会显示在某一只数码管上。 3、为了使不同数码管显示不同字符,本例使用的是集成式多位数码管常用的动态扫描显示技术,他利用了人的视觉暂留特征,选通第一只数码管
[单片机]
基于proteus的51单片机仿真实例六十、8位<font color='red'>数码管</font><font color='red'>显示</font>实例
数码管动态静态显示原理
8段发光二极管连接有两种结构:共阴极和共阳极。 8位数码管字段码为8位,从高位到低位的顺序依次是dp、g、f、e、d、c、b、a。 例如共阴数码管数字0的字段码为00111111B(3FH) 共阴极:八段发光二极管的阴极端连接在一起,阳极端分开控制,使用时候公共端接地,要使哪个发光二极管亮,则对应的阳极端接高电平; 共阳极:八段发光二极管的阳极端连接在一起,阴极端分开控制,使用时候公共端接电源,要使哪个发光二极管亮,则对应的阴极端接低地。 静态显示方式: led静态显示时,其公共端接地(共阴极)或接电源(共阳极),各段选线分别与I/O口接线相连。要显示字符,直接在I/O线发送相应的字段码。 优点:静态显示结
[单片机]
[STM8L]TAB段式LCD液晶驱动程序
STM8L152XX系列带有片上段式LCD驱动程序,这为低成本应用和高密度系统设计提供了保证,利用片上LCD驱动模块,可以有效的控制系统整体功耗,简化系统结构,从整体来说可靠性得到提高。 此处不介绍LCD驱动模块的原理以及驱动时序,请参考STM8原版英文说明文档,已描述的很详细,以下介绍其寄存器的配置方法以及编程方法。 时钟,系统时钟同样用来产生LCD驱动时钟,通过时钟模块配置: CLK_PCKENR2|=S3; //LCD 使能LCD模块时钟 CLK_CRTCR=S7|S6|S5|S1; //RTC&LCD- FCLK/128 注意RTC和LCD是共同一路时钟 以上配置根据实际时钟进行调整,我
[单片机]
嵌入式Linux下的LCD驱动程序设计与实现
随着嵌入式Linux的迅速发展,由于其没有昂贵的版权费,完全开放源代码,可裁减性与可移植性,因此是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部分,运行在Linux内核底层,在内核源代码中占较大比例,驱动程序开发逐渐成为嵌入式软件开发中一项重要工作。应项目设计的需要完成了嵌入式Linux下的LCD驱动程序设计。 1 Linux下设备驱动程序 驱动程序从字面上可以理解为一类程序,这类程序的目的一般是驱动硬件正常工作,所以通常所说的驱动程序都是针对特定的硬件来编写的。Linux设备驱动程序是为特定的硬件提供给用户程序的一组标准化接口,它隐藏了设备工作的细节。Linux系统下驱动程序是运行在内核态的,是和内
[单片机]
嵌入式Linux下的LCD<font color='red'>驱动程序</font>设计与实现
51单片机程序——按键控制单个数码管显示
#include reg52.h unsigned char code table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};// 显示数值表0-9 void main (void) { while(1) //主循环 { P1 = 0x01; //打开数码管的位选 P3 = 0xff; switch(P3) //P3口作为独立按键输入端,检测端口电平并做如下判断
[单片机]
ARM嵌入式之lcd驱动程序显示图片
内核版本:linux-3.4.2 lcd:4.3 上代码之前我得讲解一些基本的知识点,LCD驱动我们只需要写硬件这一块的代码就可以了,下面有三个函数内核已经帮我们写好了,我们只需要调用就可以了,这几个函数实现了内核层和应用成数据的传递,有兴趣的朋友去分析一下源码,我里驱动写好了我们可以选择动态加载驱动或者直接静态编译进内核,这个的区别在前文中我讲解的非常清楚了,希望朋友一定要去看一下,Linux驱动静态编译和动态编译方法详解 这个代码相对有点复杂,朋友们一定要仔细分析。驱动程序如下: lcd.c文件如下: #include #include #include #include #include #inc
[单片机]
用单片机计数脉冲的个数-数码管显示汇编程序
位数码管用2个573接到p0口,位选p2 段选P0口:点这里 采用定时器来记录脉冲 并用数码管输出 以下是源代码: ;******** 用数码管来计数脉冲的个数 ********************************** ORG 0000H JMP MAIN ORG 000BH JMP TT0 ORG 001BH JMP TT1 MOV 23H,#00H MOV 22H,#00H MOV 21H,#00H MOV 24H,#10 CALL IIP CALL IIP CALL IIP
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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