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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3046|回復: 4
收起左側

為什么單片機按鍵兩側全為高電平?怎么改成左側低電平?

[復制鏈接]
ID:495312 發表于 2019-3-25 14:35 | 顯示全部樓層 |閱讀模式
電路原理圖如下:
P]ALRXYIUJZ1~0NR89XX5.png

單片機源程序如下:
  1. #include<REG51.h>
  2. #include<intrins.h>
  3. #defineLCM_Data  P0
  4. #define ucharunsigned char
  5. #define uint  unsigned int
  6. #define w 6                                  //定義密碼位數
  7. sbit lcd1602_rs=P2^7;
  8. sbitlcd1602_rw=P2^6;
  9. sbitlcd1602_en=P2^5;
  10. sbit Scl=P3^4;                      //24C02串行時鐘
  11. sbit Sda=P3^5;                     //24C02串行數據
  12. sbit ALAM = P2^1;              //報警        
  13. sbit KEY = P3^6;                 //開鎖
  14. sbit open_led=P2^2;            //開鎖指示燈
  15. bit  operation=0;                 //操作標志位
  16. bit  pass=0;                         //密碼正確標志
  17. bit  ReInputEn=0;               //重置輸入充許標志   
  18. bit  s3_keydown=0;           //3秒按鍵標志位
  19. bit  key_disable=0;             //鎖定鍵盤標志
  20. unsigned charcountt0,second;     //t0中斷計數器,秒計數器
  21. voidDelay5Ms(void);
  22. unsigned char codea[]={0xFE,0xFD,0xFB,0xF7};                                                                                                //控盤掃描控制表
  23. unsigned char codestart_line[]     = {"password:       "};
  24. unsigned char codename[]                  ={"===Coded Lock==="};                                                                                                   //顯示名稱
  25. unsigned char codeCorrect[]       = {"     correct   "};                                                                                             //輸入正確
  26. unsigned char codeError[]         = {"      error     "};                                                                                            //輸入錯誤
  27. unsigned char codecodepass[]     = {"      pass     "};
  28. unsigned char codeLockOpen[]  = {"      open     "};                                                                                                     //OPEN
  29. unsigned char codeSetNew[]      ={"SetNewWordEnable"};
  30. unsigned char codeInput[]        = {"input:         "};                                                                                                       //INPUT
  31. unsigned char codeResetOK[]    = {"ResetPasswordOK"};
  32. unsigned char codeinitword[]      = {"Initpassword..."};
  33. unsigned char codeEr_try[]                  ={"error,try again!"};
  34. unsigned char codeagain[]           = {"inputagain     "};
  35. unsigned charInputData[6];                                                                                                                                            //輸入密碼暫存區
  36. unsigned char CurrentPassword[6]={1,3,1,4,2,0};                                                                                                                           //當前密碼值
  37. unsigned charTempPassword[6];
  38. unsigned char N=0;                               //密碼輸入位數記數
  39. unsigned charErrorCont;                      //錯誤次數計數
  40. unsigned charCorrectCont;                   //正確輸入計數
  41. unsigned charReInputCont;                          //重新輸入計數
  42. unsigned char codeinitpassword[6]={0,0,0,0,0,0};
  43. //=====================5ms延時==============================
  44. void Delay5Ms(void)
  45. {
  46.          unsigned int TempCyc = 5552;
  47.          while(TempCyc--);
  48. }
  49. //===================400ms延時==============================
  50. voidDelay400Ms(void)
  51. {
  52. unsigned char TempCycA = 5;
  53. unsigned int TempCycB;
  54. while(TempCycA--)
  55. {
  56.   TempCycB=7269;
  57.   while(TempCycB--);
  58. }
  59. }
  60. //=============================================================================================
  61. //================================24C02========================================================
  62. //=============================================================================================
  63. void mDelay(uint t)//延時
  64. {
  65.          uchar i;
  66.        while(t--)
  67.      {
  68.                for(i=0;i<125;i++)
  69.                {;}
  70.        }
  71. }
  72.    void Nop(void)                //空操作
  73. {
  74.         _nop_();
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78. }
  79. /*起始條件*/
  80. void Start(void)
  81. {
  82.         Sda=1;
  83.         Scl=1;
  84.         Nop();
  85.         Sda=0;
  86.         Nop();
  87. }
  88. /*停止條件*/
  89. void Stop(void)
  90. {
  91.         Sda=0;
  92.         Scl=1;
  93.         Nop();
  94.         Sda=1;
  95.         Nop();
  96. }
  97. /*應答位*/
  98. void Ack(void)
  99. {
  100.          Sda=0;
  101.          Nop();
  102.          Scl=1;
  103.          Nop();
  104.        Scl=0;
  105. }
  106. /*反向應答位*/
  107. void NoAck(void)
  108. {
  109.         Sda=1;
  110.         Nop();
  111.         Scl=1;
  112.         Nop();
  113.         Scl=0;
  114. }
  115. /*發送數據子程序,Data為要求發送的數據*/
  116. void Send(ucharData)
  117. {
  118.        ucharBitCounter=8;
  119.        uchartemp;
  120.        do
  121.        {
  122.                temp=Data;
  123.                Scl=0;
  124.                Nop();
  125.                if((temp&0x80)==0x80)
  126.                Sda=1;
  127.                else
  128.                Sda=0;
  129.                Scl=1;
  130.                temp=Data<<1;
  131.                Data=temp;
  132.                BitCounter--;
  133.        }
  134.        while(BitCounter);
  135.        Scl=0;
  136. }
  137. /*讀一字節的數據,并返回該字節值*/
  138. uchar Read(void)
  139. {
  140.     uchar temp=0;
  141.          uchar temp1=0;
  142.          uchar BitCounter=8;
  143.          Sda=1;
  144.          do{
  145.          Scl=0;
  146.        Nop();
  147.          Scl=1;
  148.          Nop();
  149.          if(Sda)
  150.          temp=temp|0x01;
  151.          else
  152.          temp=temp&0xfe;
  153.          if(BitCounter-1)
  154.          {
  155.          temp1=temp<<1;
  156.          temp=temp1;
  157.          }
  158.          BitCounter--;
  159.          }
  160.          while(BitCounter);
  161.          return(temp);
  162.          }
  163. void WrToROM(ucharData[],uchar Address,uchar Num)
  164. {
  165.   uchar i;
  166.   uchar *PData;
  167.   PData=Data;
  168.   for(i=0;i<Num;i++)
  169.   {
  170.   Start();
  171.   Send(0xa0);
  172.   Ack();
  173.   Send(Address+i);
  174.   Ack();
  175.   Send(*(PData+i));
  176.   Ack();
  177.   Stop();
  178.   mDelay(20);
  179.   }
  180. }
  181. voidRdFromROM(uchar Data[],uchar Address,uchar Num)
  182. {
  183.   uchar i;
  184.   uchar *PData;
  185.   PData=Data;
  186.   for(i=0;i<Num;i++)
  187.   {
  188.   Start();
  189.   Send(0xa0);
  190.   Ack();
  191.   Send(Address+i);
  192.   Ack();
  193.   Start();
  194.   Send(0xa1);
  195.   Ack();
  196.   *(PData+i)=Read();
  197.   Scl=0;
  198.   NoAck();
  199.   Stop();
  200.   }
  201. }
  202. //==================================================================================================
  203. //=======================================LCD1602====================================================
  204. //==================================================================================================
  205. #define yi 0x80//LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
  206. #define er0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)
  207. //----------------延時函數,后面經常調用----------------------
  208. void delay(uintxms)//延時函數,有參函數
  209. {
  210.          uint x,y;
  211.          for(x=xms;x>0;x--)
  212.           for(y=110;y>0;y--);
  213. }
  214. //--------------------------寫指令---------------------------
  215. write_1602com(ucharcom)//****液晶寫入指令函數****
  216. {
  217.          lcd1602_rs=0;//數據/指令選擇置為指令
  218.          lcd1602_rw=0; //讀寫選擇置為寫
  219.          P0=com;//送入數據
  220.          delay(1);
  221.          lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準備
  222.          delay(1);
  223.          lcd1602_en=0;//en由高變低,產生下降沿,液晶執行命令
  224. }

  225. //-------------------------寫數據-----------------------------
  226. write_1602dat(uchardat)//***液晶寫入數據函數****
  227. {
  228.          lcd1602_rs=1;//數據/指令選擇置為數據
  229.          lcd1602_rw=0; //讀寫選擇置為寫
  230.          P0=dat;//送入數據
  231.          delay(1);
  232.          lcd1602_en=1; //en置高電平,為制造下降沿做準備
  233.          delay(1);
  234.          lcd1602_en=0; //en由高變低,產生下降沿,液晶執行命令
  235. }
  236. //-------------------------初始化-------------------------
  237. void lcd_init(void)
  238. {
  239.          write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  240.          write_1602com(0x0c);//開顯示不顯示光標
  241.          write_1602com(0x06);//整屏不移動,光標自動右移
  242.          write_1602com(0x01);//清顯示
  243. }
  244. //========================================================================================
  245. //=========================================================================================
  246. //==============將按鍵值編碼為數值=========================
  247. unsigned char coding(unsignedchar m)         
  248. {
  249.          unsigned char k;
  250.          
  251.          switch(m)
  252.          {
  253.                   case (0x11): k=1;break;
  254.                   case (0x21): k=2;break;
  255.                   case (0x41): k=3;break;
  256.                   case (0x81): k='A';break;
  257.                   case (0x12): k=4;break;
  258.                   case (0x22): k=5;break;
  259.                   case (0x42): k=6;break;
  260.                   case (0x82): k='B';break;
  261.                   case (0x14): k=7;break;
  262.                   case (0x24): k=8;break;
  263.                   case (0x44): k=9;break;
  264.                   case (0x84): k='C';break;
  265.                   case (0x18): k='*';break;
  266.                   case (0x28): k=0;break;
  267.                   case (0x48): k='#';break;
  268.                   case (0x88): k='D';break;
  269.          }
  270.          return(k);
  271. }
  272. //=====================按鍵檢測并返回按鍵值===============================
  273. unsigned charkeynum(void)
  274. {
  275.         unsignedchar row,col,i;
  276.         P1=0xf0;
  277.         if((P1&0xf0)!=0xf0)
  278.         {
  279.                Delay5Ms();
  280.         Delay5Ms();
  281.                if((P1&0xf0)!=0xf0)
  282.                   {
  283.                row=P1^0xf0;          //確定行線
  284.                           i=0;
  285.                           P1=a[ i];              //[ i]精確定位
  286.                           while(i<4)
  287.                           {
  288.                                    if((P1&0xf0)!=0xf0)
  289.                                  {
  290.                                          col=~(P1&0xff);          //確定列線
  291.                                          break;            //已定位后提前退出   
  292.                                  }
  293.                                    else
  294.                                  {
  295.                                          i++;
  296.                                          P1=a[ i];
  297.                                  }
  298.                           }
  299.                   }
  300.                   else
  301.                   {
  302.                           return 0;
  303.                   }
  304.               while((P1&0xf0)!=0xf0);
  305.        return (row|col);                       //行線與列線組合后返回
  306.         }
  307.         elsereturn 0;                          //無鍵按下時返回0
  308. }
  309. //=======================一聲提示音,表示有效輸入========================
  310. void OneAlam(void)
  311. {
  312.          ALAM=0;
  313.          Delay5Ms();
  314.     ALAM=1;
  315. }
  316. //========================二聲提示音,表示操作成功========================
  317. void TwoAlam(void)
  318. {
  319.          ALAM=0;
  320.          Delay5Ms();
  321.     ALAM=1;
  322.     Delay5Ms();
  323.          ALAM=0;
  324.          Delay5Ms();
  325.     ALAM=1;
  326. }
  327. //========================三聲提示音,表示錯誤========================
  328. voidThreeAlam(void)
  329. {
  330.          ALAM=0;
  331.          Delay5Ms();
  332.     ALAM=1;
  333.     Delay5Ms();
  334.          ALAM=0;
  335.          Delay5Ms();
  336.     ALAM=1;
  337.     Delay5Ms();
  338.          ALAM=0;
  339.          Delay5Ms();
  340.     ALAM=1;

  341. }
  342. //=====================顯示輸入的N個數字,用H代替以便隱藏============================
  343. voidDisplayOne(void)
  344. {
  345. //       DisplayOneChar(9+N,1,'*');
  346.          write_1602com(yi+5+N);
  347.          write_1602dat('*');
  348. }
  349. //=======================顯示提示輸入=========================
  350. voidDisplayChar(void)
  351. {
  352.          unsigned char i;
  353.          if(pass==1)
  354.          {
  355.                   //DisplayListChar(0,1,LockOpen);
  356.                   write_1602com(er);
  357.                   for(i=0;i<16;i++)
  358.                   {
  359.                           write_1602dat(LockOpen[ i]);      
  360.                   }
  361.          }
  362.          else
  363.          {
  364.                   if(N==0)
  365.                   {
  366.                           //DisplayListChar(0,1,Error);
  367.                           write_1602com(er);
  368.                           for(i=0;i<16;i++)
  369.                           {
  370.                                    write_1602dat(Error[ i]);      
  371.                           }
  372.                   }
  373.                   else
  374.                   {
  375.                           //DisplayListChar(0,1,start_line);  
  376.                           write_1602com(er);
  377.                           for(i=0;i<16;i++)
  378.                           {
  379.                                    write_1602dat(start_line[ i]);         
  380.                           }
  381.                   }
  382.          }
  383. }

  384. voidDisplayInput(void)
  385. {
  386.          unsigned char i;
  387.          if(CorrectCont==1)
  388.          {
  389.                   //DisplayListChar(0,0,Input);
  390.                   write_1602com(er);
  391.                   for(i=0;i<16;i++)
  392.                   {
  393.                           write_1602dat(Input[ i]);      
  394.                   }
  395.          }
  396. }


  397. //========================重置密碼==================================================
  398. //==================================================================================
  399. voidResetPassword(void)
  400. {
  401.          unsigned char i;  
  402.          unsigned char j;
  403.          if(pass==0)
  404.          {
  405.                   pass=0;
  406.                   DisplayChar();
  407.                   ThreeAlam();
  408.          }
  409.          else
  410.          {
  411.       if(ReInputEn==1)
  412.                   {
  413.                           if(N==6)
  414.                           {
  415.                                    ReInputCont++;                           
  416.                                    if(ReInputCont==2)
  417.                                    {
  418.                                             for(i=0;i<6;)
  419.                                             {
  420.                                                      if(TempPassword[ i]==InputData[ i])      //將兩次輸入的新密碼作對比
  421.                                                              i++;
  422.                                                      else
  423.                                                      {
  424.                                                              //DisplayListChar(0,1,Error);
  425.                                                              write_1602com(er);
  426.                                                              for(j=0;j<16;j++)
  427.                                                              {
  428.                                                                       write_1602dat(Error[j]);      
  429.                                                              }
  430.                                                              ThreeAlam();                       //錯誤提示
  431.                                                              pass=0;
  432.                                                              ReInputEn=0;                      //關閉重置功能,
  433.                                                              ReInputCont=0;
  434.                                                              DisplayChar();
  435.                                                              break;
  436.                                                      }
  437.                                             }
  438.                                             if(i==6)
  439.                                             {
  440.                                                      //DisplayListChar(0,1,ResetOK);
  441.                                                      write_1602com(er);
  442.                                                      for(j=0;j<16;j++)
  443.                                                      {
  444.                                                              write_1602dat(ResetOK[j]);         
  445.                                                      }

  446.                                                      TwoAlam();                                  //操作成功提示
  447.                                                     WrToROM(TempPassword,0,6);           //將新密碼寫入24C02存儲
  448.                                                      ReInputEn=0;
  449.                                             }
  450.                                             ReInputCont=0;
  451.                                             CorrectCont=0;
  452.                                    }
  453.                                    else
  454.                                    {
  455.                                             OneAlam();
  456.                                             //DisplayListChar(0,1, again);              //顯示再次輸入一次
  457.                                             write_1602com(er);
  458.                                             for(j=0;j<16;j++)
  459.                                             {
  460.                                                      write_1602dat(again[j]);      
  461.                                             }                                          
  462.                                             for(i=0;i<6;i++)
  463.                                             {
  464.                                                      TempPassword[ i]=InputData[ i];            //將第一次輸入的數據暫存起來                                             
  465.                                             }
  466.                                    }

  467.                           N=0;                                             //輸入數據位數計數器清零
  468.                      }
  469.             }
  470.          }

  471. }



  472. //=======================輸入密碼錯誤超過三過,報警并鎖死鍵盤======================
  473. voidAlam_KeyUnable(void)
  474. {
  475.          P1=0x00;
  476.          {
  477.                   ALAM=~ALAM;
  478.                   Delay5Ms();
  479.          }
  480. }


  481. //=======================取消所有操作============================================
  482. void Cancel(void)
  483. {      
  484.          unsigned char i;
  485.          unsigned char j;
  486.          //DisplayListChar(0, 1, start_line);
  487.          write_1602com(er);
  488.          for(j=0;j<16;j++)
  489.          {
  490.                   write_1602dat(start_line[j]);         
  491.          }
  492.          TwoAlam();                                  //提示音
  493.          for(i=0;i<6;i++)
  494.          {
  495.                   InputData[ i]=0;
  496.          }
  497.          KEY=1;                                        //關閉鎖
  498.          ALAM=1;                                     //報警關
  499.          operation=0;                        //操作標志位清零
  500.          pass=0;                                         //密碼正確標志清零
  501.          ReInputEn=0;                      //重置輸入充許標志清零
  502.          ErrorCont=0;                       //密碼錯誤輸入次數清零
  503.          CorrectCont=0;                    //密碼正確輸入次數清零
  504.          ReInputCont=0;                   //重置密碼輸入次數清零
  505.          open_led=1;
  506.          s3_keydown=0;
  507.          key_disable=0;
  508.          N=0;                                    //輸入位數計數器清零
  509. }


  510. //==========================確認鍵,并通過相應標志位執行相應功能===============================
  511. void Ensure(void)
  512. {      
  513.          unsigned char i,j;
  514.          RdFromROM(CurrentPassword,0,6);                                       //從24C02里讀出存儲密碼
  515.     if(N==6)
  516.          {
  517.             if(ReInputEn==0)                                                              //重置密碼功能未開啟
  518.                   {
  519.                           for(i=0;i<6;)
  520.                         {                                          
  521.                                    if(CurrentPassword[ i]==InputData[ i])
  522.                                    {
  523.                                             i++;
  524.                                    }
  525.                                    else
  526.                                    {                        
  527.                                             ErrorCont++;
  528.                                             if(ErrorCont==3)                          //錯誤輸入計數達三次時,報警并鎖定鍵盤
  529.                                             {
  530.                                                      write_1602com(er);
  531.                                                      for(i=0;i<16;i++)
  532.                                                      {
  533.                                                              write_1602dat(Error[ i]);      
  534.                                                      }
  535.                                                      do
  536.                                                      Alam_KeyUnable();
  537.                                                      while(1);
  538.                                             }
  539.                                             else
  540.                                             {
  541.                                                      TR0=1;                                //開啟定時
  542.                                                      key_disable=1;                    //鎖定鍵盤
  543.                                                      pass=0;
  544.                                                      break;
  545.                                             }
  546.                                    }
  547.                           }

  548.                           if(i==6)
  549.                           {
  550.                                    CorrectCont++;
  551.                                    if(CorrectCont==1)                               //正確輸入計數,當只有一次正確輸入時,開鎖,
  552.                                    {
  553.                                             //DisplayListChar(0,1,LockOpen);
  554.                                             write_1602com(er);
  555.                                             for(j=0;j<16;j++)
  556.                                             {
  557.                                                      write_1602dat(LockOpen[j]);      
  558.                                             }
  559.                                             TwoAlam();                         //操作成功提示音
  560.                                             KEY=0;                                                                                            //開鎖
  561.                                             pass=1;                                                                                             //置正確標志位
  562.                                             TR0=1;                                                                                             //開啟定時
  563.                                             open_led=0;                                                                                      //開鎖指示燈亮
  564.                                             for(j=0;j<6;j++)                                                               //將輸入清除
  565.                                             {
  566.                                                      InputData[ i]=0;
  567.                                             }
  568.                                    }      
  569.                                    else                                                                                                   //當兩次正確輸入時,開啟重置密碼功能
  570.                                    {
  571.                                             //DisplayListChar(0,1,SetNew);
  572.                                             write_1602com(er);
  573.                                             for(j=0;j<16;j++)
  574.                                             {
  575.                                                      write_1602dat(SetNew[j]);  
  576.                                             }
  577.                                             TwoAlam();                                                                                  //操作成功提示
  578.                                             ReInputEn=1;                                                                           //允許重置密碼輸入
  579.                                             CorrectCont=0;                                                                        //正確計數器清零
  580.                                    }
  581.                         }
  582.          
  583.                           else                    //=========================當第一次使用或忘記密碼時可以用131420對其密碼初始化============
  584.                           {
  585.                            if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))
  586.                                  {
  587.                                             WrToROM(initpassword,0,6);                               //強制將初始密碼寫入24C02存儲
  588.                                             //DisplayListChar(0,1,initword);                    //顯示初始化密碼
  589.                                             write_1602com(er);
  590.                                             for(j=0;j<16;j++)
  591.                                             {
  592.                                                      write_1602dat(initword[j]);
  593.                                             }
  594.                                             TwoAlam();
  595.                                             Delay400Ms();
  596.                                             TwoAlam();
  597.                                             N=0;
  598.                                    }
  599.                                    else
  600.                                    {
  601.                                             //DisplayListChar(0,1,Error);
  602.                                             write_1602com(er);
  603.                                             for(j=0;j<16;j++)
  604.                                             {
  605.                                                      write_1602dat(Error[j]);      
  606.                                             }
  607.                                            ThreeAlam();                                                                                    //錯誤提示音
  608.                                             pass=0;      
  609.                                    }
  610.                           }
  611.                   }

  612.                   else                                                                                          //當已經開啟重置密碼功能時,而按下開鎖鍵,
  613.                   {
  614.                           //DisplayListChar(0,1,Er_try);
  615.                           write_1602com(er);
  616.                           for(j=0;j<16;j++)
  617.                           {
  618.                                    write_1602dat(Er_try[j]);     
  619.                           }
  620.                           ThreeAlam();
  621.                   }
  622.          }

  623.          else
  624.          {
  625.                   //DisplayListChar(0,1,Error);
  626.                   write_1602com(er);
  627.                   for(j=0;j<16;j++)
  628.                   {
  629.                           write_1602dat(Error[j]);      
  630.                   }

  631.                  ThreeAlam();                                                                                    //錯誤提示音
  632.                   pass=0;      
  633.          }
  634.          N=0;                                                                                                          //將輸入數據計數器清零,為下一次輸入作準備
  635.   operation=1;
  636. }
  637. //==============================主函數===============================
  638. void main(void)
  639. {
  640.         unsignedchar KEY,NUM;
  641.          unsigned char i,j;
  642.         P1=0xFF;
  643.          TMOD=0x11;
  644.         TL0=0xB0;
  645.         TH0=0x3C;
  646.         EA=1;
  647.         ET0=1;      
  648.         TR0=0;
  649.         Delay400Ms(); //啟動等待,等LCM講入工作狀態
  650.         lcd_init(); //LCD初始化
  651.          write_1602com(yi);//日歷顯示固定符號從第一行第0個位置之后開始顯示
  652.          for(i=0;i<16;i++)
  653.          {
  654.                   write_1602dat(name[ i]);//[ i]向液晶屏寫日歷顯示的固定符號部分
  655.          }
  656.          write_1602com(er);//時間顯示固定符號寫入位置,從第2個位置后開始顯示
  657.          for(i=0;i<16;i++)
  658.          {
  659.                   write_1602dat(start_line[ i]);//[ i]寫顯示時間固定符號,兩個冒號
  660.          }
  661.          write_1602com(er+9);         //設置光標位置
  662.          write_1602com(0x0f);        //設置光標為閃爍
  663.         Delay5Ms();//延時片刻(可不要)

  664.         N=0;                                                                                                                   //初始化數據輸入位數
  665.         while(1)
  666.                                    NUM=coding(KEY);
  667.                                    {
  668.                                             switch(NUM)
  669.                                             {
  670.                                                      case('A'):          ;                                          break;
  671.                                                      case('B'):           ;                                       break;
  672.                                                      case('C'):  ;                                          break;
  673.                                                      case('D'): ResetPassword();         break;      //重新設置密碼
  674.                                                      case('*'): Cancel();                               break;      //取消當前輸入
  675.                                                      case('#'): Ensure();                               break;      //確認鍵,
  676.                                                      default:
  677.                                                      {      
  678.                                                              //DisplayListChar(0,1,Input);
  679.                                                              write_1602com(er);
  680.                                                              for(i=0;i<16;i++)
  681.                                                              {
  682.                                                                       write_1602dat(Input[ i]);
  683.                                                              }
  684.                                                          operation=0;
  685.                                                              if(N<6)                                                              //當輸入的密碼少于6位時,接受輸入并保存,大于6位時則無效。
  686.                                                              {  
  687.                                                                       OneAlam();                                                                     //按鍵提示音                                                  
  688.                                                                       //DisplayOneChar(6+N,1,'*');
  689.                                                                       for(j=0;j<=N;j++)
  690.                                                                       {
  691.                                                                                write_1602com(er+6+j);
  692.                                                                                write_1602dat('*');
  693.                                                                       }
  694.                                                                       InputData[N]=NUM;
  695.                                                                       N++;
  696.                                                              }
  697.                                                              else                                                                                  //輸入數據位數大于6后,忽略輸入
  698.                                                              {
  699.                                                                       N=6;
  700.                                                                       break;
  701.                                                              }
  702.                                                      }
  703.                                             }
  704.                                    }
  705.                           }
  706.                  //}
  707.          //}
  708. //}

  709. //*********************************中斷服務函數**************************************
  710. void  time0_int(void) interrupt 1
  711. {
  712.         TL0=0xB0;
  713.         TH0=0x3C;      if(countt0==20)
  714.        {
  715.                   countt0=0;
  716.                   second++;
  717.                   if(pass==1)
  718.                   {
  719.                           if(second==1)
  720.                           {
  721.                                    open_led=1;                        //關指示燈
  722.                                    TR0=0;                                //關定時器
  723.                                    TL0=0xB0;
  724.                                   TH0=0x3C;
  725.                                    second=0;
  726.                           }
  727.                   }
  728.                   else
  729.                   {
  730.                           if(second==3)
  731.                           {
  732.                                    TR0=0;
  733.                                    second=0;
  734.                                    key_disable=0;   
  735.                                    s3_keydown=0;
  736.                                    TL0=0xB0;
  737.                                    TH0=0x3C;
  738.                           }
  739.                           else
  740.                               TR0=1;
  741.                   }
  742.                           
  743.        }
  744. }
復制代碼


回復

使用道具 舉報

ID:365802 發表于 2019-3-25 18:58 | 顯示全部樓層
鍵盤掃描電路空閒狀態應該就是高電平呀, 掃描時控制行線或列線為低電平進行掃描.
回復

使用道具 舉報

ID:466164 發表于 2019-3-25 22:00 | 顯示全部樓層
你的問題很奇怪你程序里不是 if((P1&0xf0)!=0xf0)把P1口高4位變成高了,低四位變成低了啊!按鍵檢測必須給行列給不同電平否則怎么檢測。
回復

使用道具 舉報

ID:213173 發表于 2019-3-26 07:34 | 顯示全部樓層
只要矩陣鍵盤掃描程序運行正常,不必計較仿真顯示的電平高低。因為掃描速度很快,仿真顯示的不一定準確。不信你寫一個簡單的流水燈程序試試,描速度快了仿真就亂套,但用于實際電路是正常的。
回復

使用道具 舉報

ID:495312 發表于 2019-3-28 11:23 | 顯示全部樓層
7358655 發表于 2019-3-25 22:00
你的問題很奇怪你程序里不是 if((P1&0xf0)!=0xf0)把P1口高4位變成高了,低四位變成低了啊!按鍵檢測必須給 ...

那不是應該一邊低電平跟一邊高電平嗎?兩邊都高,按鈕按下沒反應了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区av在线 | 久久久免费精品 | 99re6在线视频 | 日韩在线中文 | 精品久久久久久久久亚洲 | 999精品视频 | 久久精品国产一区老色匹 | 97精品国产 | 日本特黄a级高清免费大片 成年人黄色小视频 | 青春草91| 99久久婷婷国产综合精品 | 中文字幕韩在线第一页 | 蜜桃视频在线观看免费视频网站www | 久久精品色欧美aⅴ一区二区 | 麻豆视频国产在线观看 | 亚洲精品一| 精品一区二区三区在线观看 | 久久久免费少妇高潮毛片 | 殴美黄色录像 | 日韩av在线中文字幕 | 成人在线视频免费看 | 国产精品美女久久久久久免费 | 毛片一区二区三区 | 亚洲一区二区三区四区五区中文 | 在线精品国产 | 日韩在线| 日韩视频免费在线 | 精产国产伦理一二三区 | 久久久久久91 | 亚洲日本激情 | 色一情一乱一伦一区二区三区 | 国产视频一区二区 | 国产农村妇女精品一区 | 中文字幕一区二区三区在线乱码 | 精品国产免费一区二区三区演员表 | 精品国产乱码久久久久久图片 | 男人天堂免费在线 | 中文字幕中文字幕 | 97国产爽爽爽久久久 | 国产三级 | 国产精品成人在线播放 |