久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3022|回復: 0
收起左側

中國碼電波機芯源碼(僅供參考)MSP430單片機程序

[復制鏈接]
ID:613800 發表于 2019-12-14 15:41 | 顯示全部樓層 |閱讀模式
電波鐘源碼:中國碼機型的,有興趣可以拿去參考吧。改下硬件引腳就可以了
      不詳細解說了,能看懂得應該都懂

單片機源程序如下:
  1. #include <msp430x14x.h>


  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;


  4. #define XTOFF 0x40


  5. #define DataDir     P4DIR
  6. #define DataPort    P4OUT                                
  7. #define Busy            0x80
  8. #define CtrlDir     P3DIR


  9. #define CLR_RS P3OUT&=~BIT0;    //RS = P3.0        
  10. #define SET_RS P3OUT|=BIT0;        
  11. #define CLR_RW P3OUT&=~BIT1;        //RW = P3.1
  12. #define SET_RW P3OUT|=BIT1;        
  13. #define CLR_EN P3OUT&=~BIT2;        //EN = P3.2        
  14. #define SET_EN P3OUT|=BIT2;        


  15. #define keyin (P2IN&0x0f)


  16. uint high_level[19],dattmp[19];
  17. uint low_level;
  18. uchar month,day,year,hour,min,sec,weekday;
  19. uchar tmp_month,tmp_day,tmp_year,tmp_hour,tmp_min,tmp_sec,tmp_weekday;
  20. uchar flag;
  21. uchar i;
  22. uchar PP=0;
  23. uchar cflag=0;


  24. void main_test(void);
  25. void Init_TimerA(void);
  26. void Init_TimerB(void);
  27. void Decode(void);
  28. void Display(void);
  29. void Delay10ms(void);
  30. uchar Key4Scan(void);


  31. void DispStr(uchar x,uchar y,uchar *ptr);
  32. void DispNChar(uchar x,uchar y,uchar n,uchar *ptr);
  33. void LocateXY(uchar x,uchar y);
  34. void Disp1Char(uchar x,uchar y,uchar data);
  35. void LcdReset(void);
  36. void LcdWriteCommand(uchar cmd,uchar chk);
  37. void LcdWriteData(uchar data);
  38. void WaitForEnable(void);
  39. void Delay5ms(void);


  40. void main(void)
  41. {
  42.   main_test();
  43. }


  44. void main_test(void)
  45. {   
  46.     WDTCTL = WDTPW + WDTHOLD;   //關閉看門狗
  47.     P2DIR = 0x80;
  48.     P2OUT = 0x00;
  49.     LcdReset();
  50.     Init_TimerA();
  51.     Init_TimerB();
  52.     while(i<19)
  53.       ;
  54.     while(19<=i)
  55.       Decode();
  56.     Display();
  57.     while(1)
  58.     {
  59.         if(!cflag)
  60.         {
  61.           Display();
  62.         }
  63.         switch(Key4Scan())
  64.         {
  65.         case 0x01:
  66.           switch(PP++)      //確定游標地址
  67.           {
  68.           case 0:
  69.             LocateXY(4,0);
  70.             break;
  71.           case 1:
  72.             LocateXY(7,0);
  73.             break;
  74.           case 2:
  75.             LocateXY(10,0);
  76.             break;
  77.           case 3:
  78.             LocateXY(14,0);
  79.             break;
  80.           case 4:
  81.             LocateXY(4,1);
  82.             break;
  83.           case 5:
  84.             LocateXY(7,1);
  85.             break;
  86.           case 6:
  87.             LocateXY(10,1);
  88.             break;
  89.           default:
  90.             break;
  91.           }                  
  92.           LcdWriteCommand(0x0f,1);
  93.           if(7==PP)
  94.             PP=0;
  95.           cflag=1;          //標志置位
  96.           break;
  97.         case 0x02:
  98.           if(cflag)
  99.           {
  100.             tmp_year=year;
  101.             tmp_month=month;
  102.             tmp_day=day;
  103.             
  104.             tmp_hour=hour;
  105.             tmp_min=min;
  106.             tmp_sec=sec;
  107.             
  108.             tmp_weekday=weekday;
  109.             
  110.             switch(PP)
  111.             {
  112.             case 0:         //年
  113.               year++;
  114.               if(99<year)
  115.                 year=0;
  116.               Disp1Char(3,0,year/10+48);
  117.               Disp1Char(4,0,year%10+48);
  118.               LocateXY(4,0);
  119.               break;
  120.             case 1:         //月
  121.               month++;
  122.               if(12<month)
  123.                 month=0;
  124.               Disp1Char(6,0,month/10+48);
  125.               Disp1Char(7,0,month%10+48);
  126.               LocateXY(7,0);
  127.               break;
  128.             case 2:         //日
  129.               day++;
  130.               switch(month)
  131.               {
  132.               case 2:
  133.                 if(0==year%4)
  134.                 {
  135.                   if(29<day)
  136.                     day=1;
  137.                 }
  138.                 else
  139.                   if(28<day)
  140.                     day=1;
  141.                 break;
  142.               case 4:
  143.               case 6:
  144.               case 9:
  145.               case 11:
  146.                 if(30<day)
  147.                   day=1;
  148.                 break;
  149.               case 1:
  150.               case 3:
  151.               case 5:
  152.               case 7:
  153.               case 8:
  154.               case 10:
  155.               case 12:
  156.                 if(31<day)
  157.                   day=1;
  158.               default:
  159.                 break;
  160.               }
  161.               Disp1Char(9,0,day/10+48);
  162.               Disp1Char(10,0,day%10+48);
  163.               LocateXY(10,0);
  164.               break;
  165.             case 3:         //weekday
  166.               weekday++;
  167.               if(7<weekday)
  168.                 weekday=1;
  169.                 switch(weekday)
  170.                 {
  171.                 case 1:
  172.                   Disp1Char(12,1,'M');
  173.                   Disp1Char(13,1,'o');
  174.                   Disp1Char(14,1,'n');
  175.                   break;
  176.                 case 2:
  177.                   Disp1Char(12,1,'T');
  178.                   Disp1Char(13,1,'u');
  179.                   Disp1Char(14,1,'e');
  180.                   break;
  181.                 case 3:
  182.                   Disp1Char(12,1,'W');
  183.                   Disp1Char(13,1,'e');
  184.                   Disp1Char(14,1,'d');
  185.                   break;
  186.                 case 4:
  187.                   Disp1Char(12,1,'T');
  188.                   Disp1Char(13,1,'h');
  189.                   Disp1Char(14,1,'u');
  190.                   break;
  191.                 case 5:
  192.                   Disp1Char(12,1,'F');
  193.                   Disp1Char(13,1,'r');
  194.                   Disp1Char(14,1,'i');
  195.                   break;
  196.                 case 6:
  197.                   Disp1Char(12,1,'S');
  198.                   Disp1Char(13,1,'a');
  199.                   Disp1Char(14,1,'t');
  200.                   break;
  201.                 case 7:
  202.                   Disp1Char(12,1,'S');
  203.                   Disp1Char(13,1,'u');
  204.                   Disp1Char(14,1,'n');
  205.                   break;
  206.                 default:
  207.                   break;
  208.                 }
  209.               LocateXY(14,0);
  210.               break;  
  211.             case 4:         //時
  212.               hour++;
  213.               if(24<hour)
  214.                 hour=0;
  215.               Disp1Char(3,1,hour/10+48);
  216.               Disp1Char(4,1,hour%10+48);
  217.               LocateXY(4,1);
  218.               break;
  219.             case 5:         //分
  220.               min++;
  221.               if(60<min)
  222.                 min=0;
  223.               Disp1Char(6,1,min/10+48);
  224.               Disp1Char(7,1,min%10+48);
  225.               LocateXY(7,1);
  226.               break;
  227.             case 6:         //時
  228.               sec++;
  229.               if(60<sec)
  230.                 sec=0;
  231.               Disp1Char(9,1,sec/10+48);
  232.               Disp1Char(10,1,sec%10+48);
  233.               LocateXY(10,1);
  234.               break;
  235.             default:
  236.               break;                           
  237.             }
  238.           }
  239.           break;
  240.         case 0x03:
  241.           if(cflag)
  242.           {
  243.             cflag = 0;
  244.             PP = 0;
  245.             
  246.             year=tmp_year;
  247.             month=tmp_month;
  248.             day=tmp_day;
  249.             
  250.             hour=tmp_hour;
  251.             min=tmp_min;
  252.             sec=tmp_sec;
  253.             
  254.             weekday=tmp_weekday;
  255.             
  256.             Display();


  257.             LcdWriteCommand(0x0c,1);
  258.           }
  259.           break;
  260.         case 0x04:
  261.           if(cflag)
  262.           {
  263.             cflag = 0;
  264.             PP = 0;
  265.             LcdWriteCommand(0x0c, 1);   //關閉游標
  266.           }
  267.         break;
  268.         default:
  269.           break;                    
  270.         }
  271.     }
  272. }


  273. void Init_TimerA(void)
  274. {
  275.   P1SEL|=BIT2;                                  //set the port 1.2 to pulse-capture mode.
  276.   TACTL=TASSEL0+MC1+TACLR+TAIE;                 //Timer A clock source:ACLK | continuous mode | clear the Timer A | enable the Timer A.
  277.   CCTL1=CCIE+CM0+SCS+CAP;                       //enable the interrupt | capture mode | rising edge capture | synchronize capture source.
  278. }


  279. void Init_TimerB(void)
  280. {
  281.   /*
  282.   BCSCTL1&=~XT2OFF;
  283.   BCSCTL2=SELS+DIVS1+DIVS0;
  284.   TBCTL=0x02d4;
  285.   CCTL0=CCIE;
  286.   CCR0=62500;
  287.   _EINT();
  288.   */
  289.   TBCTL=TBSSEL0+TBCLR;
  290.   CCR0=32767;
  291.   TBCTL|=MC0;
  292.   CCTL0=CCIE;
  293. }


  294. void Decode(void)
  295. {
  296.   uchar ii;
  297.   //while(1)          //keep decoding.
  298.   //{
  299.     if(19<=i)       //decode the value if the array is filled.
  300.     {
  301.       i=0;
  302.       for(ii=0;ii<19-flag;ii++)                    //set the former data number of high_level array.
  303.         dattmp[ii]=high_level[flag+ii];      
  304.       for(ii=0;ii<flag;ii++)                 //set the latter data number of high_level array.
  305.         dattmp[19-flag+ii]=high_level[ii];
  306.       for(ii=0;ii<19;ii++)                           //reset the value of the dattmp array.
  307.       {
  308.         if(1638<dattmp[ii]&&dattmp[ii]<4915)                        //5%--15%
  309.           dattmp[ii]=0;
  310.         else if(4915<dattmp[ii]&&dattmp[ii]<8192)                   //15%--25%
  311.           dattmp[ii]=1;
  312.         else if(8192<dattmp[ii]&&dattmp[ii]<11468)                  //25%--35%
  313.           dattmp[ii]=2;
  314.         else if(11468<dattmp[ii]&&dattmp[ii]<14765)                 //35%--45%
  315.           dattmp[ii]=3;
  316.       }
  317.       
  318.       year=dattmp[15]*16+dattmp[16]*4+dattmp[17];
  319.       month=dattmp[13]*4+dattmp[14];
  320.       day=dattmp[10]*16+dattmp[11]*4+dattmp[12];
  321.         
  322.       hour=dattmp[2]*4+dattmp[3];
  323.       min=dattmp[4]*16+dattmp[5]*4+dattmp[6];
  324.       sec=dattmp[0]*20+20-flag;
  325.         
  326.       weekday=dattmp[7]*4+dattmp[8];
  327.       
  328.       flag=0;
  329.         
  330.       if(2==dattmp[9]||3==dattmp[9])
  331.         hour+=12;
  332.       if(59<sec)
  333.       {
  334.         sec=0;
  335.         min++;
  336.         if(59<min)
  337.         {      
  338.           min=0;
  339.           hour++;
  340.           if(11<hour)
  341.             hour=0;
  342.         }
  343.       }
  344.     }
  345.   //}
  346. }


  347. //type:     Timer A interrupt service routine.
  348. //purpose:  get the high level pulse width,provide frame information for the function Decode.
  349. //version:  1.0 by chen on 9/4/2014.
  350. #pragma vector=TIMERA0_VECTOR
  351. __interrupt void TimerA_ISR(void)
  352. {      
  353.   switch(TAIV)                                
  354.   {
  355.   case 2:                                       //use 0x01==TAIV here for the consideration of the low frequency of watch oscillator.
  356.     if(CCTL1&CM0)                               //rising edge capture.
  357.     {
  358.       low_level=TAR;                            //get the low level width to judge the frame flag.
  359.       TACTL|=TACLR;                             //restart the counter to provide a pure origin for the high level width recording.
  360.       CCTL1=(CCTL1&(~CM0))|CM1;                 //switch the capture mode to falling edge capture.
  361.     }
  362.     else
  363.       if(CCTL1&CM1)                             //falling edge capture.
  364.       {
  365.         high_level[ i]=TAR;                    //record the value of the high level width.[ i]
  366.         i++;
  367.         TACTL|=TACLR;                           //restart the counter to provide a pure origin for the low level width recording.
  368.         CCTL1=(CCTL1&(~CM1))|CM0;               //switch the capture mode to rising edge capture.
  369.       }
  370.     break;
  371.   default:
  372.     break;
  373.   }
  374.   if(4915<low_level)                               //resort the high_level array by the frame flag.
  375.     flag=i;                                //locate the frame flag position.
  376. }


  377. //type:     Timer B interrupt service routine.
  378. //purpose:  provide a pulse for the main clock frequency per second.
  379. //version:  1.0 by chen on 9/4/2014.
  380. #pragma vector=TIMERB0_VECTOR
  381. __interrupt void Timer_B(void)
  382. {
  383.     sec++;
  384.     if(59<sec)
  385.     {
  386.       sec=0;
  387.       min++;
  388.       if(59<min)
  389.       {
  390.         min=0;
  391.         hour++;
  392.         if(23<hour)
  393.           hour=0;
  394.       }
  395.     }
  396.     if(cflag)
  397.     {
  398.       tmp_sec++;
  399.       if(59<sec)
  400.       {
  401.         tmp_sec=0;
  402.         tmp_min++;
  403.         if(59<tmp_min)
  404.         {
  405.           tmp_min=0;
  406.           tmp_hour++;
  407.           if(23<tmp_hour)
  408.             tmp_hour=0;
  409.         }
  410.       }
  411.     }
  412. }


  413. void Display(void)
  414. {
  415.   Disp1Char(1,0,'2');
  416.   Disp1Char(2,0,'0');
  417.   Disp1Char(3,0,year/10+48);
  418.   Disp1Char(4,0,year%10+48);
  419.   Disp1Char(5,0,'-');
  420.   Disp1Char(6,0,month/10+48);
  421.   Disp1Char(7,0,month%10+48);
  422.   Disp1Char(8,0,'-');
  423.   Disp1Char(9,0,day/10+48);
  424.   Disp1Char(10,0,day%10+48);
  425.   
  426.   Disp1Char(3,1,hour/10+48);
  427.   Disp1Char(4,1,hour%10+48);
  428.   Disp1Char(5,1,'-');
  429.   Disp1Char(6,1,min/10+48);
  430.   Disp1Char(7,1,min%10+48);
  431.   Disp1Char(8,1,'-');
  432.   Disp1Char(9,1,sec/10+48);
  433.   Disp1Char(10,1,sec%10+48);
  434.   switch(weekday)
  435.   {
  436.   case 1:
  437.     Disp1Char(12,1,'M');
  438.     Disp1Char(13,1,'o');
  439.     Disp1Char(14,1,'n');
  440.     break;
  441.   case 2:
  442.     Disp1Char(12,1,'T');
  443.     Disp1Char(13,1,'u');
  444.     Disp1Char(14,1,'e');
  445.     break;
  446.   case 3:
  447.     Disp1Char(12,1,'W');
  448.     Disp1Char(13,1,'e');
  449.     Disp1Char(14,1,'d');
  450.     break;
  451.   case 4:
  452.     Disp1Char(12,1,'T');
  453.     Disp1Char(13,1,'h');
  454.     Disp1Char(14,1,'u');
  455.     break;
  456.   case 5:
  457.     Disp1Char(12,1,'F');
  458.     Disp1Char(13,1,'r');
  459.     Disp1Char(14,1,'i');
  460.     break;
  461.   case 6:
  462.     Disp1Char(12,1,'S');
  463.     Disp1Char(13,1,'a');
  464.     Disp1Char(14,1,'t');
  465.     break;
  466.   case 7:
  467.     Disp1Char(12,1,'S');
  468.     Disp1Char(13,1,'u');
  469.     Disp1Char(14,1,'n');
  470.     break;
  471.   default:
  472.     break;
  473.   }
  474. }


  475. //explanation:  following functions are the display effect function for the LCD 1602.
  476. void DispStr(uchar x,uchar y,uchar *ptr)
  477. {
  478.     uchar *temp;
  479.     uchar i,n=0;  
  480.     temp=ptr;
  481.     while(*ptr++ != '\0')
  482.       n++;                          //計算字符串有效字符的個數
  483.     for (i=0;i<n;i++)
  484.     {
  485.         Disp1Char(x++,y,temp[ i]);[ i]
  486.         if (x == 0x0f)
  487.         {
  488.            x  = 0;
  489.            y ^= 1;
  490.         }
  491.     }
  492. }


  493. void DispNChar(uchar x,uchar y,uchar n,uchar *ptr)
  494. {
  495.     uchar i;
  496.     for (i=0;i<n;i++)
  497.     {
  498.         Disp1Char(x++,y,ptr[ i]);[ i]
  499.         if (x==0x0f)
  500.         {
  501.            x=0;
  502.            y^=1;
  503.         }
  504.     }
  505. }


  506. void LocateXY(uchar x,uchar y)
  507. {
  508.     uchar temp;
  509.     temp=x&0x0f;
  510.     y&=0x01;
  511.     if(y)
  512.       temp|=0x40;  //如果在第2行
  513.     temp|=0x80;
  514.     LcdWriteCommand(temp,1);
  515. }


  516. void Disp1Char(uchar x,uchar y,uchar data)
  517. {
  518.     LocateXY(x,y);                        
  519.     LcdWriteData(data);               
  520. }


  521. void LcdReset(void)
  522. {
  523.     CtrlDir|=0x07;                 //控制線端口設為輸出狀態
  524.     DataDir=0xFF;                 //數據端口設為輸出狀態
  525.     LcdWriteCommand(0x38, 0);            //規定的復位操作
  526.     Delay5ms();
  527.     LcdWriteCommand(0x38, 0);               
  528.     Delay5ms();
  529.     LcdWriteCommand(0x38, 0);
  530.     Delay5ms();


  531.     LcdWriteCommand(0x38, 1);                //顯示模式設置
  532.     LcdWriteCommand(0x08, 1);                //顯示關閉
  533.     LcdWriteCommand(0x01, 1);            //顯示清屏
  534.     LcdWriteCommand(0x06, 1);                //寫字符時整體不移動
  535.     LcdWriteCommand(0x0c, 1);                //顯示開,不開游標,不閃爍
  536. }


  537. void LcdWriteCommand(uchar cmd,uchar chk)
  538. {
  539.     if(chk)
  540.       WaitForEnable();   // 檢測忙信號?
  541.     CLR_RS;        
  542.     CLR_RW;
  543.     _NOP();
  544.     DataPort=cmd;             //將命令字寫入數據端口
  545.     _NOP();                                       
  546.     SET_EN;                     //產生使能脈沖信號
  547.     _NOP();
  548.     _NOP();
  549.     CLR_EN;                        
  550. }


  551. void LcdWriteData(uchar data)
  552. {
  553.     WaitForEnable();        //等待液晶不忙
  554.     SET_RS;
  555.     CLR_RW;
  556.     _NOP();
  557.     DataPort = data;        //將顯示數據寫入數據端口
  558.     _NOP();
  559.     SET_EN;                 //產生使能脈沖信號
  560.     _NOP();
  561.     _NOP();
  562.     CLR_EN;               
  563. }


  564. void WaitForEnable(void)
  565. {
  566.     P4DIR&=0x00;  //將P4口切換為輸入狀態
  567.     CLR_RS;
  568.     SET_RW;
  569.     _NOP();
  570.     SET_EN;
  571.     _NOP();
  572.     _NOP();
  573.     while((P4IN&Busy)!=0);  //檢測忙標志
  574.     CLR_EN;
  575.     P4DIR |= 0xFF;  //將P4口切換為輸出狀態
  576. }        
  577.                        
  578. void Delay5ms(void)
  579. {
  580.     uint tmp=40000;
  581.     while (tmp!=0)
  582.     {
  583.         tmp--;
  584.     }
  585. }


  586. void Delay10ms(void)
  587. {
  588.     uint tmp;   
  589.     for(tmp=0x3fff;tmp>0;tmp--)
  590.       ;
  591. }


  592. uchar Key4Scan(void)
  593. {
  594.     uchar temp,keyval;
  595.     if(keyin!=0x0f)
  596.     {
  597.         Delay10ms();
  598.         keyval=0;
  599.         if(keyin!=0x0f)
  600.         {
  601.             temp=keyin;
  602.             while(keyin!=0x0f)
  603.               ;
  604.             switch(temp)
  605.             {
  606.             case 0x0e:
  607.               keyval=1;
  608.               break;
  609.             case 0x0d:
  610.               keyval=2;
  611.               break;
  612.             case 0x0b:
  613.               keyval=3;
  614.               break;
  615.             case 0x07:
  616.               keyval=4;
  617.               break;
  618.             default:
  619.               keyval=0;
  620.               break;
  621.             }
  622.         }
  623.     }
  624.     else
  625.       keyval = 0;
  626.     return keyval;
  627. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区三区视频 | 91精品久久久久久久久久入口 | 免费观看av网站 | 国产成人精品久久久 | 亚洲精品在线看 | 亚洲v日韩v综合v精品v | 91精品国产乱码麻豆白嫩 | av在线伊人 | 色综合天天综合网国产成人网 | 亚洲国产成人精品久久久国产成人一区 | 久草网址| 拍真实国产伦偷精品 | 亚洲精品一区二区三区四区高清 | 国产成人小视频 | 1级黄色大片 | 国产精品一区二区欧美 | 欧美黄 片免费观看 | 小h片免费观看久久久久 | 超碰美女在线 | 精品视频一区二区三区 | 久久久久精 | 欧美二级 | 狠狠干网 | 美女黄18岁以下禁止观看 | 亚洲国产成人精品女人久久久 | 日日夜夜免费精品视频 | 北条麻妃视频在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 欧美日日 | 久久久高清| 欧美a∨| 亚洲欧洲国产视频 | 久久er精品 | 国产免费一区二区三区 | 国产免费一区 | 综合激情av| 亚洲国产视频一区 | 亚洲成人一二区 | 青青草视频网 | 国产91一区 | 国产日韩一区二区三区 |