找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 840|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:945807 发表于 2023-1-4 21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "iic.h"
#include  <intrins.h>

code unsigned char tab[] =
{
        0x3F,/*0*/
        0x06,/*1*/
        0x5B,/*2*/
        0x4F,/*3*/
        0x66,/*4*/
        0x6D,/*5*/
        0x7D,/*6*/
        0x07,/*7*/
        0x7F,/*8*/
        0x6F,/*9*/
        0x77,/*10 A*/
        0x7C,/*11 b*/
        0x58,/*12 c*/
        0x5E,/*13 d*/
        0x79,/*14 E*/
        0x71,/*15 F*/
        0x76,/*16 H*/
        0x38,/*17 L*/
        0x54,/*18 n*/
        0x73,/*19 P*/
        0x3E,/*20 U*/
        0x00,/*21 黑屏*/
};        //共阴的数据表(实际是共阳)

void Delay_us(unsigned  int i)
{
    for(;i>0;i--)
        _nop_();;
}

//IIC开始
void TM1637_Start(void)
{
     TM1637_CLK=1;
     TM1637_DIO=1;
     Delay_us(2);
     TM1637_DIO=0;
}


//IIC应答
void TM1637_Ack(void)
{
    unsigned char i;
    TM1637_CLK=0;
    Delay_us(5);
     //DIO=1;   
    while(TM1637_DIO==1&&(i<250))
        i++;
    TM1637_CLK=1;
    Delay_us(2);
    TM1637_CLK=0;
}

//IIC停止
void TM1637_Stop(void)
{
     TM1637_CLK=0;
     Delay_us(2);
     TM1637_DIO=0;
     Delay_us(2);
     TM1637_CLK=1;
     Delay_us(2);
     TM1637_DIO=1;
     Delay_us(2);
}

//写数据函数         先写低位
void TM1637_Write(unsigned char DATA)   
{
    unsigned char i;   
    for(i=0;i<8;i++)        
    {
        TM1637_CLK=0;     
        if(DATA & 0x01)
            TM1637_DIO=1;
        else TM1637_DIO=0;
         Delay_us(3);
        DATA=DATA>>1;      
        TM1637_CLK=1;
        Delay_us(3);
    }  
    //TM1637_ack();
}

  /////读按键
unsigned char TM1637_ScanKey(void)
{
     unsigned char rekey,i;
     TM1637_Start();
     TM1637_Write(0x42); //读按键命令
     TM1637_Ack();
     TM1637_DIO=1; // 在读按键前拉高数据线
     for(i=0;i<8;i++) //从低位开始读
     {
            TM1637_CLK=0;
        rekey=rekey>>1;
        Delay_us(30);
        TM1637_CLK=1;
        if(TM1637_DIO)
        {
           rekey=rekey|0x80;
        }
        else
        {
           rekey=rekey|0x00;
        }
        Delay_us(30);
     }
     TM1637_Ack();
     TM1637_Stop();
     return (rekey);
}

//按顺序显示
void TM1637_Display(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char h)
{

    TM1637_Start();
    TM1637_Write(0x40);   //写数据+自动地址加1+普通模式          0100 0000
    TM1637_Ack();
    TM1637_Stop();
    TM1637_Start();
    TM1637_Write(0xc0);//设置显示首地址即第一个LED
    TM1637_Ack();

    TM1637_Write(tab[a]);
    TM1637_Ack();
    TM1637_Write(tab[ b ]|h<<7);     //h为1时显示时钟中间的两点
    TM1637_Ack();
    TM1637_Write(tab[c]);
    TM1637_Ack();
    TM1637_Write(tab[d]);
    TM1637_Ack();

    TM1637_Stop();
    TM1637_Start();
    TM1637_Write(0x8a);//开显示,2/16亮度
    TM1637_Ack();
    TM1637_Stop();
}

//向指定地址显示一个字节内容
void TM1637_DisplayChar(unsigned char ch,unsigned char p)
{
        if(ch>21) ch=21;//防止数组越界
        TM1637_Start();
        TM1637_Write(0x44);//0x44固定模式有利于控制显示位,0x40则采用显示地址自加模式这里不使用
        TM1637_Ack();
        TM1637_Stop();
        TM1637_Start();

        TM1637_Write(0xC0+p);//0X00地址开始显示
        TM1637_Ack();

        TM1637_Write(tab[ch]);//显示
        TM1637_Ack();               
        TM1637_Stop();
        TM1637_Start();
        TM1637_Write(0x89);//开显示,2/16亮度
        TM1637_Ack();
        TM1637_Stop();            
}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表