数码之家

 找回密码
 立即注册
搜索
查看: 104|回复: 4

[C51] 如何将单片机直接输出改为TM1639输出

[复制链接]
发表于 昨天 11:59 | 显示全部楼层 |阅读模式
学了一段时间的普中/江协的视频,用DS1302及STC15W408AS搭建了一个时钟电路,可以正常走时。现在想通过TM1639输出,看了很多例程也没做出来,坛里的大神能不能帮忙写一个TM1639的代码,以便好好研究。




  1. main.c:

  2. #include <STC15F2K60S2.H>
  3. #include "DS1302.h"
  4. #include "Delay.h"
  5. #include "SMG.h"
  6. #include "Key.h"
  7. #include "PAUSE.h"


  8. void main()
  9. {
  10. //                DS1302_Init();       
  11. //                        DS1302_SetTime();

  12.         while(1)
  13.         {
  14.                                 DS1302_ReadTime();//读取时间
  15.                
  16.                 SMG_Display(1,DS1302_Time[1]);
  17.                 SMG_Display(2,DS1302_Time[2]);                       
  18.                 SMG_Display(3,10);                //"--""               
  19.                 SMG_Display(4,DS1302_Time[3]);
  20.                 SMG_Display(5,DS1302_Time[4]);               
  21.                 SMG_Display(6,10);                               
  22.                 SMG_Display(7,DS1302_Time[5]);               
  23.                 SMG_Display(8,DS1302_Time[6]);                               
  24.        
  25.                
  26.         }

  27. }
复制代码


  1. ds1302.c:
  2. #include <STC15F2K60S2.H>
  3. #include "DS1302.h"
  4. #include "SMG.h"

  5. sbit DS1302_SCLK=P3^4;
  6. sbit DS1302_IO=P3^5;
  7. sbit DS1302_CE=P3^6;


  8. //寄存器写入地址/指令定义
  9. #define DS1302_SECOND                0x80
  10. #define DS1302_MINUTE                0x82
  11. #define DS1302_HOUR                        0x84
  12. #define DS1302_DATE                        0x86
  13. #define DS1302_MONTH                0x88
  14. #define DS1302_DAY                        0x8A
  15. #define DS1302_YEAR                        0x8C
  16. #define DS1302_WP                        0x8E

  17. //时间数组,索引0~6分别为年、月、日、时、分、秒、星期
  18. unsigned char DS1302_Time[]={25,05,1,15,37,55,4};


  19. /**
  20.   * [url=home.php?mod=space&uid=650075]@brief[/url]  DS1302初始化
  21.   * @param  无
  22.   * @retval 无
  23.   */
  24. void DS1302_Init(void)
  25. {
  26.         DS1302_CE=0;
  27.         DS1302_SCLK=0;       
  28. }


  29. void DS1302_WriteByte(unsigned char Command,Data)
  30. {
  31.         unsigned char i;
  32.         DS1302_CE=1;
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 DS1302_IO=Command&(0x01<<i);
  36.                 DS1302_SCLK=1;
  37.                 DS1302_SCLK=0;
  38.         }
  39.         for(i=0;i<8;i++)
  40.         {
  41.                 DS1302_IO=Data&(0x01<<i);
  42.                 DS1302_SCLK=1;
  43.                 DS1302_SCLK=0;
  44.         }
  45.         DS1302_CE=0;
  46. }


  47. unsigned char DS1302_ReadByte(unsigned char Command)
  48. {
  49.         unsigned char i,Data=0x00;
  50.         Command|=0x01;        //将指令转换为读指令
  51.         DS1302_CE=1;
  52.         for(i=0;i<8;i++)
  53.         {
  54.                 DS1302_IO=Command&(0x01<<i);
  55.                 DS1302_SCLK=0;
  56.                 DS1302_SCLK=1;
  57.         }
  58.         for(i=0;i<8;i++)
  59.         {
  60.                 DS1302_SCLK=1;
  61.                 DS1302_SCLK=0;
  62.                 if(DS1302_IO){Data|=(0x01<<i);}
  63.         }
  64.         DS1302_CE=0;
  65.         DS1302_IO=0;       
  66.         return Data;
  67. }


  68. void DS1302_SetTime(void) //设置时间
  69. {
  70.         DS1302_WriteByte(DS1302_WP,0x00);
  71.         DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入
  72.         DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
  73.         DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
  74.         DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
  75.         DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
  76.         DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
  77.         DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
  78.         DS1302_WriteByte(DS1302_WP,0x80);
  79. }


  80. void DS1302_ReadTime(void)
  81. {
  82.         unsigned char Temp;

  83.         Temp=DS1302_ReadByte(DS1302_HOUR);
  84.         DS1302_Time[1]=Temp/16;
  85.         DS1302_Time[2]=Temp%16;               
  86.        
  87.         Temp=DS1302_ReadByte(DS1302_MINUTE);
  88.         DS1302_Time[3]=Temp/16;
  89.         DS1302_Time[4]=Temp%16;       
  90.        
  91.         Temp=DS1302_ReadByte(DS1302_SECOND);
  92.         DS1302_Time[5]=Temp/16;
  93.         DS1302_Time[6]=Temp%16;       
  94.        

  95. }






复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 昨天 16:08 | 显示全部楼层
以前研究过tm1640,,虽然和1639不同,但可以参考一下改一下的
























#include<reg51.h>
#define nop _nop_();
#define uchar unsigned char           //方便书写
#define uint  unsigned int
sbit sda=P2^7;           //TM1640时钟线
sbit scl=P2^6;           //TM1640数据线
uchar data1[16]={1,2,3,4};        //用户控制单元 往这个16个单元存 1  显示1  存2显示2
uchar xsld[8]={0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};//控制显示的亮度   88最暗 8f最亮
uchar code tm1640dis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0xff};//共阴极
//                       //0    1    2    3    4     5    6    7    8   9    a    b    c    d    e     f   全灭        全开
//************共阴数码管显示0-F************************
//*********START***********************************************
void tm1640start()                  //1640开始
{

        sda=1;
        scl=1;
        sda=0;//下降沿
        scl=0;
}
//**************************************************************
void tm1640stop()                         //1640结束
{
        sda=0;
        scl=1;
        sda=1;         //上升沿
        scl=1;
}

//***********************************************************
void tm1640write(uchar date)                  //1640写字节
{
        uchar i;
        for(i=0;i<8;i++)
        {         
                scl=0;
                if(date&0x01)               
                  {
                        sda=1;//"1"
                  }
                else
                  {
                        sda=0;//"0"
                    }
                scl=1; //上升沿  数据送入
                date=date>>1;          //数据右移
        }
        scl=0;
        sda=0;                       
}
//**************向TM1640发送显示数据****方式2循环送入 测试OK*********************
void tm1640send()                  
{
         tm1640start();
         tm1640write(0x40);  //地址+1模式
         tm1640stop();
         tm1640start();
         tm1640write(0xc0);                  //送第一个地址,0XCO
         tm1640write(tm1640dis[data1[0]]);                  //第1个数码管 显示的值         显示data1单元的 数字 0-F
         tm1640write(tm1640dis[data1[1]]);                  //第2个数码管 显示的值         显示data1单元的 数字 0-F
         tm1640write(tm1640dis[data1[2]]);                  //第3个数码管 显示的值         显示data1单元的 数字 0-F
         tm1640write(tm1640dis[data1[3]]);                  //第4个数码管 显示的值         显示data1单元的 数字 0-F
         tm1640write(tm1640dis[data1[4]]);              //第5个数码管 显示的值         显示data1单元的 数字 0-F
         tm1640write(tm1640dis[data1[5]]);        //第6个数码管 显示的值         显示data1单元的 数字 0-F
         tm1640write(tm1640dis[data1[6]]);        //第7个数码管 显示的值         显示data1单元的 数字 0-F
         tm1640write(tm1640dis[data1[7]]);                  //第8个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[8]]);                  //第9个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[9]]);                 //第10个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[10]]);                 //第11个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[11]]);             //第12个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[12]]);                 //第13个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[13]]);             //第14个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[14]]);          //第15个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640write(tm1640dis[data1[15]]);      //第16个数码管 显示的值         显示data1单元的 数字 0-F
     tm1640stop();
     tm1640start();
     tm1640write(xsld[1]);       //控制显示,开显示,脉冲宽度为14/16         88-8f
     tm1640stop();                                                                                                           
                  
}

void tm1640init()  //初始化
{
  tm1640send();           //刷新该程序,即可刷新显示          显示data1[0]-data[15]的数字  
       
}


回复 支持 反对

使用道具 举报

发表于 昨天 18:49 | 显示全部楼层
看图  电路图应该不对   如果使用 TM1639  与单片机只有三根线 (DIO CLK STB)

想研究 看看本站的   全网首发:TM1639 LED显示和按键程序   https://www.mydigit.cn/thread-457304-1-1.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 19:43 | 显示全部楼层
chanwah2009 发表于 2025-5-20 16:08
以前研究过tm1640,,虽然和1639不同,但可以参考一下改一下的

也有TM1640芯片,等把这个搞明白了再研究它。
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 19:45 | 显示全部楼层
by64214 发表于 2025-5-20 18:49
看图  电路图应该不对   如果使用 TM1639  与单片机只有三根线 (DIO CLK STB)

想研究 看看本站的   全网 ...

电路图应该没问题,直接套用他的代码可以完美运行,从但是就是不知道怎么用在时钟上。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-21 03:18 , Processed in 0.218400 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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