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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1846|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧产日产国产精品v | 久久亚洲二区 | 91成人在线 | 国产成年人视频 | 久久91精品国产一区二区 | 夜夜艹天天干 | 精品久久久久香蕉网 | 日日操夜夜操天天操 | 日本精品视频一区二区三区四区 | 欧美xxxx性 | 福利社午夜影院 | 99re免费 | 成人免费日韩 | 99精品网站 | 99热碰| 亚洲一页 | 中文字幕一区二区三区四区五区 | 99在线精品视频 | 国产第一页在线观看 | 一区二区视频在线 | 免费a网站 | 国产精品视频观看 | 91在线观看免费视频 | 国产一区二区在线播放视频 | 午夜在线免费观看视频 | 99久久精品免费看国产四区 | 欧美一区二区三区久久精品视 | 日韩久久久久久 | 免费福利视频一区二区三区 | 国产精品综合一区二区 | 久久久成人免费一区二区 | 亚洲国产中文在线 | 九色porny自拍视频 | 很黄很污的网站 | 欧美在线观看一区 | 日韩av免费在线观看 | 亚洲人成在线观看 | 一级黄色片在线看 | 日本在线免费观看 | 亚洲精品国产电影 | 久久久久久91香蕉国产 |