数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1372|回复: 17

[C51] 新手求助坛友给改写一个STC15W408AS、DS3231、DS18B20数码管时钟的程序。

[复制链接]
发表于 2022-3-20 20:54:28 | 显示全部楼层 |阅读模式
想学习一下单片机,从网上淘了一个时钟套件,本着折腾的原则自己把原来的时钟芯片和温度传感器换成了DS3231、DS18B20(板上已预留了口),但是问题来了,卖家不给原代码连固件也不给,自己又不会写程序,改网上的程序也没有成功,连显示都没有,最后用坛友@1065307738https://www.mydigit.cn/thread-275008-2-1.html帖子里的代码倒是显示数字了,但由于后2个数码管是倒装的,所以显示的也不正常,自己搞的头大了,想麻烦坛友看看可能给改写个程序。谢谢 谢谢  



本帖子中包含更多资源

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

x
 楼主| 发表于 2022-3-20 20:58:28 | 显示全部楼层
  1. #include "STC15.H"
  2. sbit DA=P2^5;
  3. sbit DB=P2^4;
  4. sbit DC=P2^3;
  5. sbit DD=P2^2;
  6. sbit DE=P2^1;
  7. sbit DF=P2^0;
  8. sbit DG=P3^7;
  9. sbit DP=P3^6;

  10. sbit B4=P1^1;
  11. sbit B3=P1^2;
  12. sbit B2=P2^6;
  13. sbit B1=P1^0;

  14. unsigned char ShuZu[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  15.                       0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,};

  16. void Data(unsigned char Dat)
  17. {
  18.         DA=(bit)(Dat&0x01);
  19.         DB=(bit)(Dat&0x02);
  20.         DC=(bit)(Dat&0x04);
  21.         DD=(bit)(Dat&0x08);
  22.         DE=(bit)(Dat&0x10);
  23.         DF=(bit)(Dat&0x20);
  24.         DG=(bit)(Dat&0x40);
  25.         DP=(bit)(Dat&0x80);
  26. }

  27. void Delay (unsigned int z)
  28. {
  29.         unsigned int i,j;
  30.         for(i=0;i<z;i++)
  31.                 for(j=0;j<10;j++)
  32.                 ;
  33. }

  34. void Display(unsigned int Dat)
  35. {
  36.         B1=1;B2=1;B3=1;B4=1;
  37.         Data(ShuZu[Dat%10000/1000]);
  38.         B1=0;B2=1;B3=1;B4=1;

  39.         Delay (50);

  40.         B1=1;B2=1;B3=1;B4=1;
  41.         Data(ShuZu[Dat%1000/100]);
  42.         B1=1;B2=0;B3=1;B4=1;

  43.         Delay (50);

  44.         B1=1;B2=1;B3=1;B4=1;
  45.         Data(ShuZu[Dat%100/10]);
  46.         B1=1;B2=1;B3=0;B4=1;

  47.         Delay (50);

  48.         B1=1;B2=1;B3=1;B4=1;
  49.         Data(ShuZu[Dat%10]);
  50.         B1=1;B2=1;B3=1;B4=0;
  51.         
  52.         Delay (50);
  53. }


  54. void main ()
  55. {
  56.         while(1)
  57.         {
  58.                 Display(1234);
  59.         }        
  60. }
复制代码

这是改的显示1234的代码,不知翻转180度的语言rotate180应该怎么加。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 21:57:29 | 显示全部楼层
显示1234的代码,后两位倒了。
  1. #include "STC15.H"
  2. sbit DA=P2^5;
  3. sbit DB=P2^4;
  4. sbit DC=P2^3;
  5. sbit DD=P2^2;
  6. sbit DE=P2^1;
  7. sbit DF=P2^0;
  8. sbit DG=P3^7;
  9. sbit DP=P3^6;

  10. sbit B4=P1^1;
  11. sbit B3=P1^2;
  12. sbit B2=P2^6;
  13. sbit B1=P1^0;

  14. unsigned char ShuZu[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  15.                       0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,};

  16. void Data(unsigned char Dat)
  17. {
  18.         DA=(bit)(Dat&0x01);
  19.         DB=(bit)(Dat&0x02);
  20.         DC=(bit)(Dat&0x04);
  21.         DD=(bit)(Dat&0x08);
  22.         DE=(bit)(Dat&0x10);
  23.         DF=(bit)(Dat&0x20);
  24.         DG=(bit)(Dat&0x40);
  25.         DP=(bit)(Dat&0x80);
  26. }

  27. void Delay (unsigned int z)
  28. {
  29.         unsigned int i,j;
  30.         for(i=0;i<z;i++)
  31.                 for(j=0;j<10;j++)
  32.                 ;
  33. }

  34. void Display(unsigned int Dat)
  35. {
  36.         B1=1;B2=1;B3=1;B4=1;
  37.         Data(ShuZu[Dat%10000/1000]);
  38.         B1=0;B2=1;B3=1;B4=1;

  39.         Delay (50);

  40.         B1=1;B2=1;B3=1;B4=1;
  41.         Data(ShuZu[Dat%1000/100]);
  42.         B1=1;B2=0;B3=1;B4=1;

  43.         Delay (50);

  44.         B1=1;B2=1;B3=1;B4=1;
  45.         Data(ShuZu[Dat%100/10]);
  46.         B1=1;B2=1;B3=0;B4=1;

  47.         Delay (50);

  48.         B1=1;B2=1;B3=1;B4=1;
  49.         Data(ShuZu[Dat%10]);
  50.         B1=1;B2=1;B3=1;B4=0;
  51.         
  52.         Delay (50);
  53. }


  54. void main ()
  55. {
  56.         while(1)
  57.         {
  58.                 Display(1234);
  59.         }        
  60. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 18:59:44 | 显示全部楼层
谢谢大家的指导,已经完成了第一步的数码显示了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:36:17 | 显示全部楼层
这是抄的DS3231的C语言,不知应该如何进行集合。
  1. #include "IIC.h"
  2. #include "read_or_write.h"
  3. #include "DS3231.h"
  4. #include "uart.h"

  5. char Time[8];                               /*存储时间*/
  6. unsigned char Hour;                         /*小时*/
  7. unsigned char Minutes;                      /*分钟*/
  8. unsigned char Seconds;                      /*秒*/
  9. char Wdh;
  10. char Wdl;
  11. unsigned char ERRON;                                 /*出错标志*/

  12. uchar init_DS3231(uchar con)                  /*初始化DS3231*/
  13. {
  14.         uchar f = 0;
  15.         f = W_char(Con,con);
  16.         return f;
  17. }

  18. /*
  19. uchar Set_time(uchar data_H,uchar data_M,uchar data_S)
  20. {
  21.         uchar hh = 1;
  22.         uchar mm = 1;
  23.         uchar ss = 1;

  24.         data_H = hex_bcd(data_H);
  25.        
  26.         hh = W_char(H,data_H);
  27.        
  28.         data_H = hex_bcd(data_M);
  29.        
  30.         mm = W_char(M,data_M);
  31.        
  32.         data_H = hex_bcd(data_S);
  33.        
  34.         ss = W_char(S,data_S);
  35.        
  36.         if(!hh || !mm || !ss)
  37.                 return 0;
  38.        
  39.         return 1;
  40. }
  41. */

  42. uchar Get_H(void)                                       /*获得小时*/
  43. {
  44.         uchar temp = R_w_add_char(H);
  45.         temp = bcd_hex(temp);
  46.         temp &= 0x3f;
  47.         return temp;
  48. }

  49. uchar Get_M(void)                                       /*获得分钟*/
  50. {
  51.         uchar temp = R_w_add_char(M);
  52.         temp = bcd_hex(temp);
  53.         return temp;
  54. }

  55. uchar Get_S(void)                                       /*获得秒*/
  56. {
  57.         uchar temp = R_w_add_char(S);
  58.         temp = bcd_hex(temp);
  59.         return temp;
  60. }

  61. uchar Get_WDH(void)                                    /*获得温度整数位*/
  62. {
  63.         return R_w_add_char(WDH);
  64. }

  65. uchar Get_WDL(void)                                    /*获得温度小数位*/
  66. {
  67.         return R_w_add_char(WDL);
  68. }


复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:37:17 | 显示全部楼层
IIc代码
  1. #include <STC15W.h>
  2. #include "Interrupt.h"
  3. #include "IIC.h"
  4. #include "uart.h"

  5. void start(void)
  6. {
  7.         SDA = 1;
  8.        
  9.         display_us(1);
  10.        
  11.         SCL = 1;
  12.        
  13.         display_us(5);
  14.        
  15.         SDA = 0;
  16.        
  17.         display_us(5);
  18.        
  19.         SCL = 0;
  20.        
  21.         display_us(2);
  22.        
  23. }

  24. void stop(void)
  25. {
  26.        
  27.         SCL = 1;
  28.        
  29.         display_us(1);
  30.        
  31.         SDA = 0;
  32.        
  33.         display_us(5);
  34.        
  35.         SDA = 1;
  36.         display_us(3);
  37.        
  38. }

  39. uchar ack(void)  /*检测从机应答信号*/
  40. {
  41.         uchar ans;
  42.        
  43.         SDA = 1;
  44.        
  45.         display_us(2);
  46.        
  47.         SCL = 1;
  48.        
  49.         display_us(3);
  50.        
  51.         ans = SDA;
  52.        
  53.         SCL = 0;
  54.        
  55.         display_us(2);
  56.        
  57.         return ans;
  58. }

  59. uchar send_bit(uchar dat) /*发送一个字节*/
  60. {
  61.         uchar i;
  62.         uchar j;
  63.        
  64.         for(i = 0; i < 8; i++)
  65.         {
  66.                 if((dat << i) & 0x80)
  67.                         j = SDA = 1;
  68.                 else
  69.                         j = SDA = 0;
  70.                
  71.                 SCL = 1;
  72.                 display_us(5);
  73.                
  74.                 SCL = 0;
  75.                 display_us(1);
  76.         }
  77.         display_us(2);
  78.        
  79.         return ack();
  80. }

  81. char Read_bit(void)  /*读取一个字节*/
  82. {
  83.         uchar i;
  84.         char date = 0;
  85.        
  86.         SDA = 1;
  87.        
  88.         for(i = 0; i < 8; i++)
  89.         {
  90.                 display_us(1);
  91.                
  92.                 SCL = 0;
  93.                 display_us(5);
  94.                
  95.                 SCL = 1;
  96.                 display_us(3);
  97.                
  98.                 date = date << 1;
  99.                
  100.                 if(SDA)
  101.                         date += 1;
  102.                
  103.                 display_us(2);
  104.         }
  105.        
  106.         SCL = 0;
  107.         display_us(2);
  108.        
  109.         return date;
  110. }

  111. uchar ASLK(uchar Bit) /*主机应答信号*/
  112. {
  113.         uchar ans = 1;
  114.        
  115.        
  116.         if(!Bit)
  117.                 SDA = 0;
  118.         else
  119.                 SDA = 1;
  120.         display_us(2);
  121.        
  122.         SCL = 1;
  123.         display_us(5);
  124.        
  125.         SCL = 0;
  126.         display_us(2);
  127.        
  128.         return ans;
  129. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:38:52 | 显示全部楼层
Interrupt
  1. #include <STC15W.h>
  2. #include "Interrupt.h"
  3. #include "IIC.h"
  4. #include "DS3231.h"
  5. #include "led.h"
  6. #include "led.h"
  7. #include "key.h"
  8. #include "uart.h"

  9. void display_us(unsigned int tt) /*μ秒级*/
  10. {
  11.         while(tt--);
  12. }

  13. void display_ms(unsigned int tt) /*毫妙级*/
  14. {
  15.        
  16.         while(tt--)
  17.         {
  18.                 display_us(100);
  19.         }
  20. }

  21. void init_0(void) /*定时器0中断初始化,用于显示时间*/
  22. {
  23.         TMOD &= ~0x0f;
  24.         AUXR &= ~0x80;
  25.         TH0 = 65036 >> 8;
  26.         TL0 = 65036;
  27.         TR0 = 1;
  28.         ET0 = 1;
  29.         EA = 1;
  30. }

  31. void Read_WD(void)  /*读取温度*/
  32. {
  33.          uchar Wdh,Wdl;
  34.          unsigned int tt;
  35.          unsigned int t;
  36.          init_DS3231(0x3C);
  37.        
  38.         do
  39.         {
  40.           Wdh = Get_WDH();
  41.           Wdl = Get_WDL();
  42.        
  43.           Wdl = Wdl >> 6;
  44.           Wdl &= 0x03;
  45.           Wdl *= 25;
  46.        
  47.           Time[3] = Wdh / 10;
  48.           Time[2] = Wdh % 10;
  49.           Time[1] = Wdl / 10;
  50.           Time[0] = Wdl % 10;
  51.                 Out_Time_WD();
  52.                
  53.            tt = 1000;
  54.                  while(tt--)
  55.                  {
  56.        t = 1000;       
  57.                          while(t--)
  58.                          {
  59.                            KEY = Key_NO();
  60.                                  if(KEY == 3)
  61.                                          return;
  62.                          }
  63.                  }
  64.         }
  65.         while(KEY == 0 || KEY == 1);
  66. }

  67. void set_time_key(uchar f) /*更改时间位*/
  68. {
  69.         if(f == 1)
  70.         {
  71.                 Hour += 1;
  72.                 if(Hour >= 24)
  73.                         Hour = 0;
  74.           Time[3] = Hour / 10;
  75.           Time[2] = Hour % 10;
  76.         }
  77.         else if(f == 2)
  78.         {
  79.           Minutes += 1;
  80.                 if(Minutes > 59)
  81.                         Minutes = 0;
  82.                
  83.           Time[1] = Minutes / 10;
  84.           Time[0] = Minutes % 10;
  85.         }
  86. }

  87. void Read_SJ(void)  /*读取时间*/
  88. {
  89.   unsigned int tt;
  90.         unsigned int t;
  91.         uchar j = 1;
  92.         init_DS3231(0x1C);
  93.        
  94.         do
  95.         {
  96.              
  97.                  Hour =  Get_H();
  98.            Minutes = Get_M();
  99.            Seconds = Get_S();
  100.        
  101.            Time[3] = Hour / 10;
  102.            Time[2] = Hour % 10;
  103.            Time[1] = Minutes / 10;
  104.            Time[0] = Minutes %10;
  105.                  Out_Time_WD();
  106.                  tt = 1000;
  107.                  while(tt--)
  108.                  {
  109.        t = 1000;       
  110.                          while(t--)
  111.                          {
  112.                            KEY = Key_NO();
  113.                                  if(KEY ==1 || KEY == 3)
  114.                                          return;
  115.                          }
  116.                  }
  117.                 }
  118.                 while(KEY == 0);
  119. }


复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:39:19 | 显示全部楼层
key
  1. #include <STC15W.h>
  2. #include "Interrupt.h"
  3. #include "key.h"
  4. #include "IIC.h"
  5. #include "uart.h"

  6. unsigned char KEY;


  7. uchar Key_NO(void)               /*按键检测*/
  8. {
  9.         unsigned int time = 1000;
  10.   if(!key1  || !key2 || !key3 )
  11.   {
  12.                  OutString("有键按下\r\n");
  13.                  display_ms(10);
  14.                  if(!key1 || !key2 || !key3  )
  15.      {
  16.                          if(!key1)
  17.                          {
  18.                                  OutString("key1\r\n");
  19.                                  while(!key1 && time--)
  20.                                          display_us(1000);
  21.                                  return 1;
  22.                          }
  23.                          
  24.                          if(!key2)
  25.                          {
  26.                                   OutString("key2\r\n");
  27.                                  while(!key2 && time--)
  28.                                          display_us(1000);
  29.                                  return 2;
  30.                          }
  31.                          
  32.                          if(!key3)
  33.                          {
  34.                                  OutString("key3\r\n");
  35.                                  while(!key3 && time--)
  36.                                          display_us(1000);
  37.                                  return 3;
  38.                          }
  39.                          
  40.                          
  41.            }
  42.                  
  43.                  OutChar(KEY + '0');                 
  44.         }
  45.   return 0;       
  46. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:40:15 | 显示全部楼层
read_or_write
  1. #include "read_or_write.h"
  2. #include "IIC.h"
  3. #include "DS3231.h"
  4. #include "Interrupt.h"
  5. #include "uart.h"

  6. uchar bcd_hex(uchar bcd)
  7. {
  8.         uchar temp = bcd & 0x0f;
  9.         bcd = bcd >> 4;
  10.         bcd %= 0xf;
  11.        
  12.         return bcd *10 + temp;
  13. }

  14. uchar hex_bcd(uchar hex)
  15. {
  16.         uchar temp = hex / 10;
  17.         temp = temp << 4;
  18.        
  19.         OutChar(((temp + (hex % 10)) / 16 )+ '0');
  20.         OutChar(((temp + (hex % 10) ) % 16 )+ '0');
  21.         OutChar('\r');
  22.         OutChar('\n');
  23.        
  24.        
  25.         return temp + hex % 10;
  26. }

  27. uchar W_char(uchar Add,uchar Dat)
  28. {
  29.         start();
  30.        
  31.         if(send_bit(A_W))
  32.                 return 0;
  33.   
  34.         if(send_bit(Add))
  35.                 return 0;
  36.        
  37.         if(send_bit(Dat))
  38.                 return 0;
  39.        
  40.         stop();

  41.         display_us(2);
  42.        
  43.         return 1;
  44. }

  45. char R_char()
  46. {
  47.         char temp;
  48.        
  49.         start();
  50.        
  51.         if(send_bit(A_R))
  52.                 return 0;
  53.        
  54.   temp = Read_bit();
  55.        
  56.   
  57.         ASLK(1);
  58.        
  59.         stop();
  60.        
  61.         return temp;
  62. }

  63. char R_w_add_char(uchar Add)
  64. {
  65.         char temp;
  66.         start();

  67.   if(send_bit(A_W))
  68.       return 0;

  69.        
  70.         if(send_bit(Add))
  71.                 return 0;

  72.        
  73.         //stop();
  74.         display_us(2);

  75.        
  76.         temp = R_char();
  77.        
  78.         return temp;
  79. }


复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:41:37 | 显示全部楼层
DS18B20
  1. #include "STC15W.H"
  2. #include "INTRINS.H"

  3. typedef unsigned char BYTE;

  4. sbit DQ = P3^5;                     //DS18B20的数据口位P3.5
  5. BYTE TPH;                           //存放温度值的高字节
  6. BYTE TPL;                           //存放温度值的低字节

  7. void DelayXus(BYTE n);
  8. void DS18B20_Reset();
  9. void DS18B20_WriteByte(BYTE dat);
  10. BYTE DS18B20_ReadByte();

  11. void main()
  12. {
  13.     DS18B20_Reset();                //设备复位
  14.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  15.     DS18B20_WriteByte(0x44);        //开始转换命令
  16.     while (!DQ);                    //等待转换完成

  17.     DS18B20_Reset();                //设备复位
  18.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  19.     DS18B20_WriteByte(0xBE);        //读暂存存储器命令
  20.     TPL = DS18B20_ReadByte();       //读温度低字节
  21.     TPH = DS18B20_ReadByte();       //读温度高字节

  22.     while (1);
  23. }

  24. /**************************************
  25. 延时X微秒(STC12C5A60S2@12M)
  26. 不同的工作环境,需要调整此函数
  27. 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
  28. **************************************/
  29. void DelayXus(BYTE n)
  30. {
  31.     while (n--)
  32.     {
  33.         _nop_();
  34.         _nop_();
  35.     }
  36. }

  37. /**************************************
  38. 复位DS18B20,并检测设备是否存在
  39. **************************************/
  40. void DS18B20_Reset()
  41. {
  42.     CY = 1;
  43.     while (CY)
  44.     {
  45.         DQ = 0;                     //送出低电平复位信号
  46.         DelayXus(240);              //延时至少480us
  47.         DelayXus(240);
  48.         DQ = 1;                     //释放数据线
  49.         DelayXus(60);               //等待60us
  50.         CY = DQ;                    //检测存在脉冲
  51.         DelayXus(240);              //等待设备释放数据线
  52.         DelayXus(180);
  53.     }
  54. }

  55. /**************************************
  56. 从DS18B20读1字节数据
  57. **************************************/
  58. BYTE DS18B20_ReadByte()
  59. {
  60.     BYTE i;
  61.     BYTE dat = 0;

  62.     for (i=0; i<8; i++)             //8位计数器
  63.     {
  64.         dat >>= 1;
  65.         DQ = 0;                     //开始时间片
  66.         DelayXus(1);                //延时等待
  67.         DQ = 1;                     //准备接收
  68.         DelayXus(1);                //接收延时
  69.         if (DQ) dat |= 0x80;        //读取数据
  70.         DelayXus(60);               //等待时间片结束
  71.     }

  72.     return dat;
  73. }

  74. /**************************************
  75. 向DS18B20写1字节数据
  76. **************************************/
  77. void DS18B20_WriteByte(BYTE dat)
  78. {
  79.     char i;

  80.     for (i=0; i<8; i++)             //8位计数器
  81.     {
  82.         DQ = 0;                     //开始时间片
  83.         DelayXus(1);                //延时等待
  84.         dat >>= 1;                  //送出数据
  85.         DQ = CY;
  86.         DelayXus(60);               //等待时间片结束
  87.         DQ = 1;                     //恢复数据线
  88.         DelayXus(1);                //恢复延时
  89.     }
  90. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:42:37 | 显示全部楼层
main
  1. #include <STC15W.h>
  2. #include "read_or_write.h"
  3. #include "Interrupt.h"
  4. #include "led.h"
  5. #include "IIC.h"
  6. #include "key.h"
  7. #include "uart.h"
  8. #include "DS3231.h"

  9. static uchar f = 0;                              /*时间温度状态切换标志量*/
  10. static uchar flag;
  11. static unsigned int SUM = 1000;
  12. static unsigned int SUMM = 200;
  13. static unsigned int NO;
  14. int main()
  15. {
  16.         uchar set;
  17.         KEY = 0;                                         /*按键*/
  18.         ERRON = 1;
  19.         flag = 0;
  20.        
  21.         P2M0 = 0x00;
  22.         P2M1 = 0x00;
  23.        
  24.         Time[0] = 5;
  25.         Time[1] = 5;
  26.         Time[2] = 5;
  27.         Time[3] = 5;
  28.         init_uart1();                             /*初始化串口,用于监控代码运行,方便调试*/
  29.         init_0();

  30.         init_DS3231(0x1C);      

  31.         /*初始化DS3231*/

  32.        
  33.         //OutChar(Set_time(0x0C,0x01,0x0) + '0');                /*设置时间*/
  34.        
  35.   Out_Time_WD();
  36.         init(f);                                 /*初始化定时器0,显示时间*/
  37.        
  38.         Out_Time_WD();
  39.        
  40.         while(1)
  41.         {
  42.                 OutString("进入while\r\n");
  43.                 switch(KEY)
  44.                 {
  45.                         case 1:
  46.                                 if(!f)
  47.                                 {
  48.                                         flag = 1;
  49.                                         while(flag < 3)
  50.                                         {
  51.                                                 set = Key_NO();          /*检测按键变化*/
  52.                                                
  53.                                                 switch(set)
  54.                                                 {
  55.                                                         case 1: { if(flag == 1) W_char(H,hex_bcd(Hour)); if(flag ==

  56. 2) W_char(M,hex_bcd(Minutes)); flag += 1; }                        break;       /*分钟位开始闪烁*/
  57.                                                         case 2: set_time_key(flag); break;   /*加1*/
  58.                                                 }
  59.                                         }
  60.                                        
  61.                                         display_ms(100);
  62.                                         flag = 0;
  63.                                         KEY = 0;
  64.                                        
  65.                                 }
  66.                                 init(f);                           /*时间正常显示*/
  67.                                 break;
  68.                                
  69.                         /*
  70.                                 case 2:
  71.                           init(!f);                          /*显示非当前模式*/
  72.      /* display_ms(5000);                   /*延时5秒*/
  73.                  /* init(f);                           /*显示为当前模式*/                                       
  74.                 /*        break;
  75.                         */
  76.                                
  77.                         case 3:
  78.                                 f = !f;                            /*切换状态*/
  79.                                 init(f);                           /*显示为设置的工作状态*/
  80.                                 break;       
  81.                 }
  82.         }
  83. }

  84. void init_time0() interrupt 1
  85. {
  86.         uchar i,k;
  87.         uchar j = 1;
  88.        
  89.        
  90.         if(flag ==1)
  91.         {
  92.                 if(NO >= SUM)
  93.                 {
  94.                         i = 0;
  95.                         k = 4;
  96.                 }
  97.                 else
  98.                 {
  99.                         i = 0;
  100.                   k = 2;
  101.                 }
  102.         }
  103.         else if(flag == 2)
  104.         {
  105.                 if(NO >= SUM)
  106.                 {
  107.                         i = 0;
  108.                         k = 4;
  109.                 }
  110.                 else
  111.                 {
  112.                         i = 2;
  113.                   k = 4;
  114.                 }
  115.         }
  116.         else
  117.         {
  118.                 i = 0;
  119.                 k = 4;
  120.         }
  121.        
  122.         if(NO == 2*SUM)
  123.                  NO = 0;
  124.         NO += 1;
  125.        
  126.         for(;i < k; i++)
  127.         {
  128.                 if(f && i == 2)
  129.                 {
  130.                         led_one((table[Time[i]] & 0x7F),(j << i));
  131.                 }
  132.                 else if(!f && i == 2 && NO <= SUM && !flag)
  133.                 {
  134.                         led_one((table[Time[i]] & 0x7F),(j << i));
  135.                 }
  136.                 else
  137.                  led_one(table[Time[i]],(j << i));
  138.         }
  139.         for(i= 0;i < 4; i++)
  140.         {
  141.                  led_one(0xff,(j << i));
  142.         }
  143.   
  144. }


复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 20:49:54 | 显示全部楼层
不知以上代码如何进行集合,请大家指教。
全部文件https://pan.baidu.com/s/10A3iN40eWbWe3FTarsO2Gw?pwd=rn9j
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-18 11:05 , Processed in 0.530401 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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