找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1052|回复: 0
收起左侧

单片机时钟显示程序 要怎么提取出平面指针的代码?

[复制链接]
ID:298554 发表于 2020-12-23 15:41 | 显示全部楼层 |阅读模式
30黑币
最近在玩旋转led屏幕,想单独屏面显示指针时钟,侧面数字时钟或者日期也行,但是就是提取不了商家的代码用后面老是有错
  1. /*************************************************************
  2.                      时钟显示程序
  3. 单片机 IAP15W4K61S4  或者其他51         晶振频率 18.432M  
  4. 字模软件用  PC2002
  5. 逐列取模方式

  6. 电机旋转方向 顺时针
  7. /***********************************************************
  8. 说明:本程序支持配套遥控器调整时间
  9. 播放按键  切换调整 时、分、秒、月、日
  10. 加 按键:增加
  11. 减 按键:减少
  12. menu按键: 时钟复位

  13. 遥控器按键1 :平面显示文字+侧面显示时钟         可调时
  14. 遥控器按键2 :平面指针时钟+侧面显示文字
  15. *************************************************************/
  16. #include "NEW_8051.H"
  17. #include "intrins.h"
  18. #include "task.h"
  19. #define FOSC 18432000L          //系统频率
  20. #define BAUD 115200             //串口波特率
  21. bit Scan_bit=0;         
  22. uint Offset=0;
  23. bit BIT_timeout=0;
  24. uchar ucMode=1;         //模式
  25. bit Time0_flag=0;        //定时器T0中断标志位
  26. uchar DISP_LINE=0;
  27. uint Pt=50,S0,T,D;                //计数用的变量
  28. uchar ucAdder=0;
  29. uchar code TAB_12369[]=
  30. {

  31.         0xFF,0x03,0xFF,0xB3,0x6B,0x6B,0x9B,0xFF,               
  32.         0x8F,0x77,0x7F,0x8F,0x7F,0x77,0x8F,0xFF,//3
  33.         0xFF,0xFF,0x9F,0x6D,0x6D,0x6B,0x87,0xFF,//6        
  34.         0x9F,0xEF,0xF7,0x87,0x77,0x77,0x8F,0xFF,///9


  35. };
  36. /*********中断子程序**********/
  37. void int0() interrupt 0        //使用外部中断0
  38. {
  39.         BIT_timeout=1; //起点标志位
  40.         if(ucMode!=1)
  41.         {        

  42.                         D+=(DISP_LINE-180)*2;   //修正值
  43.                            Pt=205+D;
  44.             //得到定时器T0的初设值
  45.                 TH0=-Pt/256;
  46.                 TL0=-Pt%256;   //设置定时器T0的初设值
  47.                 DISP_LINE=0;   //计数器清零,将重新计数        
  48.                 switch (ucMode)
  49.                 {
  50.                         case 0x02:
  51.                                 du1302();//获取时间
  52.                                 Sec=Sec/16*10+Sec%16 ;
  53.                     Cent=Cent/16*10+Cent%16 ;
  54.                         Hour=Hour/16*10+Hour%16 ;
  55.                                 if(Hour>11)
  56.                                 {
  57.                                         Hour=Hour-12;        
  58.                                 }
  59.                                 Sec=Sec*3;//秒针定位="秒"*3
  60.                                 Hour=(Hour*15)+(Cent/4);//时针定位="时"*15+"分"/4
  61.                                 Cent=Cent*3;//分针定位="分"*3
  62.                                 Offset++;
  63.                                 if(Offset>672)//侧面有多少文字 这个值就对应改成  多少字*16
  64.                                 Offset=0;        
  65.                                 break;
  66.                         case 0x03:
  67.                                 du1302();//获取时间
  68.                                 Sec=Sec/16*10+Sec%16 ;
  69.                     Cent=Cent/16*10+Cent%16 ;
  70.                         Hour=Hour/16*10+Hour%16 ;
  71.                                 if(Hour>12)
  72.                                 {
  73.                                         Hour=Hour-12;        
  74.                                 }
  75.                                 break;
  76.                         default:
  77.                                 break;
  78.                 }
  79.         }
  80. }
  81. /******************************************/
  82. void Send_uart(unsigned char d)          /*从串口发送数据*/
  83. {
  84.           ES=0;
  85.       SBUF=d;
  86.           while(TI==0);       //等待发送完毕
  87.       TI=0;
  88.           ES=1;
  89. }
  90. /*************************************/
  91. //图片切换以及模拟表盘显示函数
  92. void display_pic()
  93. {
  94.         //uchar date1,date2,date3,date4;
  95.         if(DISP_LINE<180)
  96.         {
  97.                 if(Time0_flag)
  98.                 {
  99.                          Time0_flag=0;
  100.                         Close();
  101.                         if(ucMode==2)
  102.                         {
  103.                                   //DISP_LINE=DISP_LINE-1;
  104.                                       //标整点,以及显示数字12,3,6,9
  105.                               if ( (DISP_LINE >= 175) || (DISP_LINE <= 3))  //12点
  106.                               {
  107.                                ucAdder=DISP_LINE+4 ;
  108.                                if ( ucAdder>=180) ucAdder=ucAdder-180 ;
  109.                               }
  110.                               else if ( (DISP_LINE >= 41) && (DISP_LINE <= 48)) //3点
  111.                               {
  112.                                ucAdder=DISP_LINE-41+8*1 ;
  113.                               }
  114.                               else if ( (DISP_LINE >= 86) && (DISP_LINE <= 93)) //6点
  115.                               {
  116.                                ucAdder=DISP_LINE-86+8*2 ;
  117.                               }
  118.                               else if ( (DISP_LINE >= 131) && (DISP_LINE <= 138)) //9点
  119.                               {
  120.                                ucAdder=DISP_LINE-131+8*3 ;
  121.                               }
  122.                                   else
  123.                                   {
  124.                                          ucAdder=250;
  125.                                         /*************形成表盘*******************/
  126.                                    switch (DISP_LINE)   
  127.                                {
  128.                                         case 180*1/12 :    //1点
  129.                                         case 180*2/12 :    //2点
  130.                                         case 180*4/12 :    //4点
  131.                                         case 180*5/12 :    //5点
  132.                                         case 180*7/12 :    //6点
  133.                                         case 180*8/12 :    //7点
  134.                                         case 180*10/12 :   //10点
  135.                                         case 180*11/12 :   //11点
  136.                                           //LED=0;
  137.                                                   PortA(0X0F);
  138.                                          break;
  139.                                }
  140.                                    }
  141.                                    if ( ucAdder < 32 )
  142.                                     {
  143.                                                 PortA(TAB_12369[ucAdder]) ; //查表显示12,3,6,9
  144.                                                 
  145.                                         }
  146.                            /****************************************/   
  147.                                      //显示指针"时"
  148.                         //           i = Hour ;
  149.                         //       j = Hour ;
  150.                         //      if ( ++i > 179 ) i=0 ;    //i+1,结果>179,则清零
  151.                         //      if ( --j > 179 ) i=179 ;   //j-1,结果为负,则重新赋值179
  152.                                 if(( (Hour-2)<=DISP_LINE)&&((Hour+2)>=DISP_LINE) )
  153.                                 {
  154.                                         if(((Hour-1)==DISP_LINE)||((Hour+1)==DISP_LINE))
  155.                                         {
  156.                                                 PortD(0XFF);
  157.                                                 PortC(0XBF);
  158.                                        
  159.                                         }
  160.                                         else if(((Hour-2)==DISP_LINE)||((Hour+2)==DISP_LINE))
  161.                                         {
  162.                                                 PortD(0XFF);
  163.                                                 PortC(0XDF);
  164.                                                 
  165.                                         }        
  166.                                 }
  167.                                    if(Hour==DISP_LINE)//||(DISP_LINE==i)||(DISP_LINE==j
  168.                             {
  169.                                 
  170.                                 PortD(0X80) ;
  171.                                         PortC(0X00);
  172.                             }   
  173.                             //显示指针"分"
  174.                                 if(( (Cent-2)<=DISP_LINE)&&((Cent+2)>=DISP_LINE) )
  175.                                 {
  176.                                         if(((Cent-1)==DISP_LINE)||((Cent+1)==DISP_LINE))
  177.                                         {
  178.                                                 PortC(0XFF);
  179.                                                 PortB(0XFB);
  180.                                                 PortD(0XFF);
  181.                                        
  182.                                         }        
  183.                                         else if(((Cent-2)==DISP_LINE)||((Cent+2)==DISP_LINE))
  184.                                         {
  185.                                                 PortC(0XFF);
  186.                                                 PortB(0XFD);
  187.                                                 PortD(0XFF);
  188.                                                 
  189.                                         }
  190.                                        
  191.                                 }
  192.                                 if(Cent==DISP_LINE)
  193.                             {
  194.                                 //PortB=(0X00);
  195.                                         PortC(0X00);
  196.                                         PortB(0XF0);
  197.                                         PortD(0X80);                                       
  198.                             }
  199.                                 //显示指针"秒"
  200.                                 if(( (Sec-2)<=DISP_LINE)&&((Sec+2)>=DISP_LINE) )
  201.                                 {
  202.                                         if(((Sec-1)==DISP_LINE)||((Sec+1)==DISP_LINE))
  203.                                         {
  204.                                                 PortB(0XBF);
  205.                                                 PortC(0XFF);
  206.                                                 PortD(0XFF);                                       
  207.                                         }
  208.                                         else if(((Sec-2)==DISP_LINE)||((Sec+2)==DISP_LINE))
  209.                                         {
  210.                                                 PortB(0XDF);
  211.                                                 PortC(0XFF);
  212.                                                 PortD(0XFF);
  213.                                         }                                                
  214.                                 }
  215.                             if(Sec==DISP_LINE)
  216.                             {
  217.                                 PortB(0X00);
  218.                                         PortC(0X00);
  219.                                         PortD(0X80);                       
  220.                             }
  221.                                 //DISP_LINE=DISP_LINE+1;
  222.                           Show_R(Lzimo[(DISP_LINE+Offset)*2],Lzimo[(DISP_LINE+Offset)*2+1]);//送16*16文字显示        
  223.                         }
  224.                 }
  225.       }
  226. }
  227. /*********************************************/
  228. void Init(void)
  229. {
  230.            P0M0=0X00;//初始化IO口 为准双向口
  231.         P0M1=0X00;

  232.         P1M0=0X00;
  233.         P1M1=0X00;

  234.         P2M0=0X00;
  235.         P2M1=0X00;

  236.         P3M0=0X00;
  237.         P3M1=0X00;

  238.         P4M0=0X00;
  239.         P4M1=0X00;

  240.         P5M0=0X00;
  241.         P5M1=0X00;

  242.         P6M0=0X00;
  243.         P6M1=0X00;

  244.         P7M0=0X00;
  245.         P7M1=0X00;

  246.         Show_R(0x55,0x55);//测试
  247.         Show_L(0x55,0x55,0x55,0x55);//测试

  248.   AUXR &= 0x7F;                //定时器时钟12T模式  //200us
  249.         TMOD &= 0xF0;                //设置定时器模式
  250.         TMOD |= 0x01;                //设置定时器模式
  251.         TL0 = 0xCD;                //设置定时初值
  252.         TH0 = 0xFE;                //设置定时初值
  253.         TF0 = 0;                //清除TF0标志
  254.         TR0 = 1;                //定时器0开始计时
  255.         ET0=1;

  256.         AUXR &= 0xBF;                //定时器时钟12T模式
  257.         TMOD &= 0x0F;                //设置定时器模式
  258.         TMOD |= 0x20;                //设置定时器模式
  259.         TL1 = 0x12;                //设置定时初值 155US
  260.         TH1 = 0x12;                //设置定时重载值
  261.         TF1 = 0;                //清除TF1标志
  262.         ET1=1;
  263.         TR1 = 0;                //定时器1开始计时

  264.         SCON = 0x50;
  265.          T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
  266.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  267.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  268.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  269.    // ES = 1;                     //使能串口1中断

  270.      IT0 = 1;    //外部中断为边沿触发
  271.                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
  272.      EX0 = 1;  //使能INT0中断

  273.          IT1=1;
  274.          EX1=1;//外部中断1 下降沿 中断
  275.          EA = 1;                 
  276. }
  277. /************************************/
  278. void Timer0Interrupt(void) interrupt 1
  279. {                        
  280.     Time0_flag=1;                   //定时中断标志位置1;
  281.         TH0=-Pt/256;TL0=-Pt%256;   //设置定时器T0的初设值
  282.         DISP_LINE++;                    //计数
  283. }
  284. /*****主函数*****/
  285. void main(void)
  286. {
  287.         Init();
  288.         Auto_Set1302(starts_time);//自动初始化时钟
  289.         Send_uart(0x55);
  290.         
  291.     //主程序
  292.            while(1)
  293.     {                       
  294.                 if((ucMode==2)||(ucMode==3))
  295.                 {
  296.                         display_pic();
  297.                 }
  298.                  //BIT_timeout=1;
  299.                 if(BIT_timeout==1)        //起点判断
  300.                  {                        
  301.                         BIT_timeout=0; //清零
  302.                         
  303.                         Scan_bit=1;// 起点检测到后 LED不再流水测试
  304.                         if( new_code ) //有红外按键
  305.                         {
  306.                                 new_code=0;
  307.                                 switch( key_code ) //根据不同的按键值执行不同的动作
  308.                                 {        
  309.                                    case 0x0C:
  310.                                         ucMode=0x01;//数字钟模式+侧面文字
  311.                                         TR0 = 0;        
  312.                                 break;

  313.                                 case 0x18:
  314.                                         ucMode=0x02;//指针式时钟模式
  315.                                         TR0 = 1;
  316.                                 break;
  317.                                 case 0x5E:
  318.                                 //        ucMode=0x03;//指针时钟模式
  319.                                         TR0=1;                                 
  320.                                 break;
  321.                                         case 0x40:         //调时加
  322.                                                 Set(id,1);

  323.                                         break;
  324.         
  325.                                         case 0x19: //调时减                                
  326.                                                         Set(id,0);
  327.                                        
  328.                                         break;
  329.                                        
  330.                                         case 0x15://调时切换
  331.                                                                 id++;                                                
  332.                                                                    if(id>5)
  333.                                                                 {
  334.                                                                     id=0;
  335.                                                                 }
  336.                                         break;
  337.                                         case 0x47://时钟初始化
  338.                                                         Set1302(starts_time);    //初始化
  339.                                                         W1302(0x8e,0x00); //控制命令,WP=0,写操作               
  340.                                                         W1302(0x90,0xa5); //打涞二级? 一个二级管串联一个2K玷
  341.                                                         //write_1302Data(DISP_TIME_adder,160);
  342.                                         break;
  343.         
  344.                                         default: break;
  345.                                 }
  346.                                 key_code=0;
  347.                         }
  348.                
  349.                         if(ucMode==1)
  350.                         {
  351.                                 du1302();//读取时钟芯片 的时钟数据
  352.                                 Show_line_time();//显示时间
  353.                         }           
  354.                     }   
  355.    
  356.                 }
  357. }

复制代码


实验4、 指针式时钟显示程序.zip

124.2 KB, 下载次数: 2

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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