欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

       找回密碼
       立即注冊

      QQ登錄

      只需一步,快速開始

      搜索
      查看: 1964|回復: 2
      打印 上一主題 下一主題
      收起左側

      下面這個單片機程序里的二維數組問題

      [復制鏈接]
      跳轉到指定樓層
      樓主
      ID:65237 發表于 2020-4-22 21:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      這是
      zhangxinchun的貼子  有這段沒看明白  da1527[rep][ii]&=~(1<<((7-k)));數組里的值是最后多少
                                  特別是這里~(1<<((7-k))) 望高人們指點

      單片機源程序如下:
      1. //測試單片機:STC15W408AS

      2. //晶振:內部 11.0592mHZ

      3. //復位方式:內部復位
      4.                      
      5. //串口通訊:波特率9600/數據位8/停止位1/無校驗

      6. //調試環境:KEIL3

      7. //程序功能:實現2262解碼,學習、自適應多阻值,片內EEPROM,存儲60個遙控器數據
      8.         
      9. //          不依賴硬件,不占用硬件資源。移植更加方便

      10. //                        學習遙控器:按一下學習鍵,學習燈點亮,松開學習鍵,按動要學習的遙控器按鍵,學習燈熄滅,學習成功。重復上述操作可學習多個遙控器.
      11. //
      12. //          清除:按住學習鍵不放,直到學習燈自動熄滅,擦除成功.

      13. /**********************************************************/


      14. #include <STC15W408AS.h>
      15. #include <intrins.h>
      16. #define uchar unsigned char
      17. #define uint  unsigned int
      18. sbit RF                           =        P1^1;          //信號輸入
      19. sbit LED                =        P3^3;          //學習指示燈
      20. sbit set                 =        P1^2;          //學習鍵                                                         
      21. sbit D0                        =        P3^4;          //1號繼電器解碼輸出
      22. sbit D1                        =        P3^5;     //2號繼電器
      23. sbit D2                        =        P3^6;          //3號繼電器
      24. sbit D3                        =        P3^7;          //4號繼電器
      25. sbit deng1      =        P1^7;          //K1指示燈
      26. sbit deng2      =        P5^4;          //K2指示燈
      27. sbit deng3      =        P5^5;          //K3指示燈
      28. sbit deng4      =        P3^2;          //K4指示燈
      29. sbit VT                        =        P1^0;     //接收指示燈                                
      30. sbit aj1                =   P1^3;          //K1
      31. sbit aj2                =   P1^4;          //K2
      32. sbit aj3                =   P1^5;          //K3
      33. sbit aj4                =   P1^6;          //K4
      34. bit  decode_ok;                 //解碼成功
      35. bit rf_ok;               //收到有效數據
      36. bit study;         //學習標志
      37. bit jmnx;  //編碼類型 0是2262,1是1527
      38. bit m=0,ba=0,ca=0,da=0,ea=0,za=0,aa=0,hv=0,ff=0,ra=0,rb=0,rc=0,rd=0,g=0,hm=0,biao=0,kt=0;
      39. bit biao_1=0,g_1=0,kt_1=0,hm_1=0;
      40. bit biao_2=0,g_2=0,kt_2=0,hm_2=0;
      41. bit biao_3=0,g_3=0,kt_3=0,hm_3=0;
      42. uchar da1527[2][3];  //解碼過程中臨時數組
      43. uchar key_d;  //遙控器按鍵碼
      44. uchar short_k;     //窄脈沖寬度
      45. uchar ss=0,sn=0,h=0,yz=0,hh=0,yy=0,yk=0,yu=0;hk=0,sj=0,so=0,jk=0,hu=0,t1=0,t2=0,t3=0,t4=0;
      46. uint dt=0,dr=0,dq=0,rv=0,rv_1=0,rv_2=0,rv_3=0;
      47. uchar trg=0,trg_1=0,trg_2=0,trg_3=0,cont=0,cont_1=0,cont_2=0,cont_3=0;
      48. uchar ReadData=0,ReadData_1=0,ReadData_2=0,ReadData_3=0;
      49. static uint sk=0;
      50. uchar xdata key_number[181];                //遙控器編碼數組,存放60個遙控器


      51. void delay_1ms(uint x)    //1毫秒延時
      52. {
      53.         uchar b,c;
      54.         for(x;x>0;x--)
      55.                 {
      56.                         for(b=3;b>0;b--)
      57.                                 {
      58.                                         for(c=150;c>0;c--);
      59.                                 }
      60.                 }
      61. }

      62. void delay(uint ms)//
      63. {
      64.   while(ms--)
      65.     {
      66.          ms++;

      67.          ms--;
      68.     }
      69. }




      70. //====================================================
      71. /////////片內EEPROM讀寫驅動程序///////////////////////////
      72. //====================================================


      73. void IAP_Disable()           //關閉IAP
      74. {
      75.     //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
      76.     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
      77.     IAP_CONTR = 0;      //關閉IAP 功能
      78.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
      79.     IAP_TRIG = 0;      //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
      80.     IAP_ADDRH = 0;
      81.     IAP_ADDRL = 0;
      82. }//



      83. //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
      84. uchar read_add(uint addr)         //讀EEPROM
      85. {
      86.     IAP_DATA = 0x00;
      87.     IAP_CONTR = 0x84;         //打開IAP 功能, 設置Flash 操作等待時間
      88.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節讀命令

      89.     IAP_ADDRH = addr>>8;    //設置目標單元地址的高8 位地址
      90.     IAP_ADDRL = addr&0xff;    //設置目標單元地址的低8 位地址

      91.     EA = 0;
      92.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
      93.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
      94.     _nop_();
      95.     EA = 1;
      96.     IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
      97.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
      98.     return (IAP_DATA);
      99. }//------------------------------------------------------------------------------


      100. //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
      101. void write_add(uint addr,uchar ch)         //直接寫EEPROM
      102. {
      103.     IAP_CONTR = 0x84;         //打開 IAP 功能, 設置Flash 操作等待時間
      104.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節編程命令


      105.     IAP_ADDRH = addr>>8;    //設置目標單元地址的高8 位地址
      106.     IAP_ADDRL = addr&0xff;    //設置目標單元地址的低8 位地址

      107.     IAP_DATA = ch;                  //要編程的數據先送進IAP_DATA 寄存器
      108.     EA = 0;
      109.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
      110.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
      111.     _nop_();
      112.     EA = 1;
      113.     IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
      114.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
      115. }//------------------------------------------------------------------------------
      116. //擦除扇區, 入口:DPTR = 扇區地址


      117. void Sector_Erase(uint addr)         //扇區擦除
      118. {
      119.      IAP_CONTR = 0x84;         //打開IAP 功能, 設置Flash 操作等待時間
      120.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區擦除命令

      121.     IAP_ADDRH =addr>>8;    //設置目標單元地址的高8 位地址
      122.     IAP_ADDRL =addr&0xff;    //設置目標單元地址的低8 位地址

      123.     EA = 0;
      124.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
      125.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
      126.     _nop_();
      127.     EA = 1;
      128. }//------------------------------------------------------------------------------



      129. //============================接收解碼部分========================================//

      130. void RF_decode()         
      131. {
      132.            uchar ii=0,j=0,k=0,rep=0;
      133.             uint head_k=0;           //短脈沖寬度
      134.           uchar s;   
      135. //-------------------------------數據接收-----------------------------------------
      136.       short_k=0;
      137.           while(RF && j<250)         //檢測頭信號前一個高脈沖的寬度
      138.                    {
      139.                          delay(1);        
      140.                         short_k++;
      141.                  }
      142.           while(!RF)
      143.                    {
      144.                          delay(1);
      145.                         head_k++;
      146.                  } //檢測頭脈沖的寬度         
      147.       if(((short_k*24)<head_k) && (head_k<(short_k*38)))   //引導碼寬度是窄脈沖的32倍 24/38
      148.          {                        
      149.             for(rep=0;rep<2;rep++)         
      150.                {  
      151.                              for(ii=0;ii<3;ii++)//3字節
      152.                              {
      153.                                    for(k=0;k<8;k++)//每個字節8位
      154.                                       {                                      
      155.                                                     j=0;
      156.                                                         while(RF && j<245)
      157.                                                                 {
      158.                                                                         delay(1);
      159.                                                                         j++;
      160.                                                                 }//
      161.                                                if(j>(short_k-short_k/2-short_k/3)&&j<(short_k*1.96))
      162.                                                                 {
      163.                                                                         da1527[rep][ii]&=~(1<<((7-k)));
      164.                                                                 }                                    
      165.                                                         else if(j>(short_k*1.96)&&j<(short_k*5))da1527[rep][ii]|=(1<<(7-k));                                                
      166.                                                 else {return;}          //亂碼退出        
      167.                                                j=0;
      168.                                                         while(!RF && j<150){delay(2);j++;}      //跳過低電平                                   
      169.                                                  }
      170.                                  }//for(ii=0;ii<12;ii++)  
      171.                    j=0;while(RF && (j<200)){delay(1);j++;}            //跳個最后一個高脈沖                           
      172.                                head_k=0;while(!RF) {delay(1);head_k++;} //檢測下一個前導信號的寬度  
      173.                                if((head_k<(short_k*26)) || (head_k>(short_k*38)))  {return;} //引導碼寬度是窄脈沖的32倍  //亂碼退出
      174.                            }
      175.             //+++++++++++++++++++++++++2262與1527數據分離處理++++++++++++++++++++++++++++++++++++++++              
      176.                          if((da1527[0][0]==da1527[1][0]) && (da1527[0][1]==da1527[1][1]) && (da1527[0][2]==da1527[1][2]))        //兩次接收到的數據相同
      177.                       {         
      178.                      uchar u,i,x;
      179.                                          rf_ok=1;
      180.                                          for(i=0;i<3;i++)  //判定2262與1527
      181.                         {
      182.                            for(u=0;u<4;u++) {if(((da1527[0][i]>>(u*2)) & 3)==2) {i=80;break;}}  //有10則為1527
      183.                                                    if(i==80) break;
      184.                         }
      185.                      if(i==80)  //1527
      186.                         {
      187.                           key_d=da1527[1][2] & 0x0f;         //分出1527的按鍵值
      188.                           da1527[0][2]=da1527[1][2]>>4; //分出1527的后4位地址
      189.                                                   jmnx=1;         //為0是2262,1是1527
      190.                         }
      191.                        else      //2262
      192.                          {
      193.                           key_d=0;
      194.                           for(i=0;i<4;i++){if(((da1527[0][2]>>(i*2))&3)==3) key_d|=1<<i;}   //計算出2262的按鍵數據                                 
      195.                           da1527[0][2]=0x00; //2262無后4位地址,全為0
      196.                                                   jmnx=0;         //為0是2262,1是1527
      197.                                                   jk++;//自鎖用,作用:按下按鍵不松手繼電器狀態不變,松開再按下改變,一次只改變一次狀態,因為按下按鍵后遙控會一直發碼,所以讓jk一直自加,但是只取jk=1的值的狀態
      198.                          }
      199.                                                    
      200.                                           if (!study)                //非學習狀態
      201.                                                   {
      202.                                                         rf_ok=0;
      203.                                                         for(x=0;x<60;x++)
      204.                                                                    {
      205.                                                                         if((da1527[0][0]==key_number[x*3+1])&&(da1527[0][1]==key_number[x*3+2])
      206.                                                                                                                                         &&(da1527[0][2]==key_number[x*3+3]))//判斷是否已學習過的編碼
      207.                                                                                 {

      208. //                                                                                    D0=!(key_d&0x08);                //取得按鍵碼
      209. //                                                                                        D1=!(key_d&0x04);
      210. //                                                                                        D2=!(key_d&0x02);
      211. //                                                                                        D3=!(key_d&0x01);
      212.                                             if(m==1)  //互鎖
      213.                                                                                         {         
      214.                                                                                         if(key_d == 0x01){D0=0;D1=1;D2=1;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}//else{D0=1;}
      215.                                                                                         if(key_d == 0x02){D0=1;D1=0;D2=1;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
      216. //                                                                                        if(key_d == 0x03){D0=1;D1=1;D2=0;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
      217.                                                                                         if(key_d == 0x04){D0=1;D1=1;D2=0;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
      218. //                                                                                        if(key_d == 0x05){D0=1;D1=1;D2=1;D3=1;D4=0;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
      219. //                                                                                        if(key_d == 0x06){D0=1;D1=1;D2=1;D3=1;D4=1;D5=0;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;}
      220. //                                                                                        if(key_d == 0x07){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=0;D7=1;D8=1;D9=1;D10=1;D11=1;}
      221.                                                                                         if(key_d == 0x08){D0=1;D1=1;D2=1;D3=0;}//D4=1;D5=1;D6=1;D7=0;D8=1;D9=1;D10=1;D11=1;}
      222. //                                                                                        if(key_d == 0x09){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=0;D9=1;D10=1;D11=1;}
      223. //                                                                                        if(key_d == 0x0a){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=0;D10=1;D11=1;}
      224. //                                                                                        if(key_d == 0x0b){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=0;D11=1;}
      225. //                                                                                        if(key_d == 0x0c){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=0;}
      226.                                                                                         }
      227.                                                                                         else
      228.                                                                                         {
      229.                                                                                         if(ba==0) //B按鍵自鎖
      230.                                                                                         {
      231.                                                                                      if(key_d == 0x04)
      232.                                                                                           {
      233.                                                                                                   if(jk==1)
      234.                                                                                                    {
      235.                                                                                                      D2=~D2;
      236.                                                                                                         }
      237.                                                                                             }
      238.                                                                                          } //B自鎖

      239.                                                                                          if(da==0) //A按鍵自鎖
      240.                                                                                         {
      241.                                                                                      if(key_d == 0x08)
      242.                                                                                           {
      243.                                                                                                  if(jk==1)
      244.                                                                                                    {
      245.                                                                                                      D3=~D3;
      246.                                                                                                         }
      247.                                                                                             }
      248.                                                                                          } //A自鎖
      249.                                                                                          if(ca==0) //C按鍵自鎖
      250.                                                                                         {
      251.                                                                                      if(key_d == 0x02)
      252.                                                                                           {
      253.                                                                                                  if(jk==1)
      254.                                                                                                    {
      255.                                                                                                      D1=~D1;
      256.                                                                                                         }
      257.                                                                                             }
      258.                                                                                          } //C自鎖
      259.                                                                                          if(ea==0) //D按鍵自鎖
      260.                                                                                         {
      261.                                                                                      if(key_d == 0x01)
      262.                                                                                           {
      263.                                                                                                  if(jk==1)
      264.                                                                                                    {
      265.                                                                                                      D0=~D0;
      266.                                                                                                         }
      267.                                                                                             }
      268.                                                                                          } //D自鎖
      269.                                                                                          if(ba==1)//B按鍵點動,ba為自鎖轉點動標志位
      270.                                                                                          {
      271.                                                                                           if(key_d == 0x04){D2=0;}
      272.                                                                                           }
      273.                                                                                          if(da==1)//A按鍵點動,da為自鎖轉點動標志位
      274.                                                                                          {
      275.                                                                                           if(key_d == 0x08){D3=0;}
      276.                                                                                           }
      277.                                                                                           if(ca==1)//C按鍵點動,da為自鎖轉點動標志位
      278.                                                                                          {
      279.                                                                                           if(key_d == 0x02){D1=0;}
      280.                                                                                           }
      281.                                                                                           if(ea==1)//D按鍵點動,da為自鎖轉點動標志位
      282.                                                                                          {
      283.                                                                                           if(key_d == 0x01){D0=0;}
      284.                                                                                           }
      285.                                                                                         }                                                                                
      286.                                                                                         decode_ok=1;
      287.                                                                                         ss=1;
      288.                                                                                         sn=1;
      289.                                                                                         sj=1;
      290.                                                                                         so=1;
      291.                                                                                         VT=0;                                                               
      292.                                                                                         s=30;
      293.                                                                                         break;
      294.                                                                                 }
      295.                                                                                                                
      296.                                                                 }        
      297.                                                 
      298.                                                 
      299.                                                 }

      300.                  }
      301.               
      302.          }
      復制代碼

      分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
      收藏收藏 分享淘帖 頂 踩
      回復

      使用道具 舉報

      沙發
      ID:191511 發表于 2020-4-23 10:23 | 只看該作者
      ~這個操作符是按位取反。
      1<<x的意思是1向左移動x位,起始位是0位,1左移位結果二進制的話就是 0000 0100(一個字節的話)。
      上邊組合起來就是1左移x位之后,按位取反。那么上邊的結果就會變成1111 1011。
      之所以這么做,這是與矩陣按鍵判斷所在行/列的值相關的
      回復

      使用道具 舉報

      板凳
      ID:65237 發表于 2020-4-24 20:55 來自觸屏版 | 只看該作者
      wo4fisher 發表于 2020-4-23 10:23
      ~這個操作符是按位取反。
      1

      謝謝指點 這點我懂了 我還想請教數組是二維, 我想知程序進來這二個括號,等號右邊值是給左邊這二個括右邊那個,還是左邊括號,
      如接收值是01010100 10011111 11110001那么這個二維數組是這樣的嗎[00000000][01010100] [11111111][10011111]   [22222222][11110001]請指點
      回復

      使用道具 舉報

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

      本版積分規則

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

      Powered by 單片機教程網

      快速回復 返回頂部 返回列表