<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PORTB的電平變化中斷進(jìn)行鍵盤輸入

          PORTB的電平變化中斷進(jìn)行鍵盤輸入

          作者: 時(shí)間:2012-12-31 來源:網(wǎng)絡(luò) 收藏

          //該程序通過的""進(jìn)行鍵盤的輸入,使按下K1鍵時(shí)第一個(gè)數(shù)碼管顯示1,按下K2
          //鍵時(shí)第一個(gè)數(shù)碼管上顯示2,按下K3鍵時(shí)第一個(gè)數(shù)碼管上顯示3,按下K4鍵時(shí)第一個(gè)數(shù)碼管上顯示4
          //對(duì)鍵盤的掃描采用中斷方式

          #include"p18f458.h"

          unsigned chardata;
          unsigned inti;
          unsigned charj;
          const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};

          voidInterruptHandlerHigh(void);

          /*初始化子程序*/
          /* http://www.51hei.com 提供此程序*/
          void initial()
          {
          INTCON=0x08;/*關(guān)閉所有中斷,B口變位中斷允許*/
          INTCON2=0x01;/*使能B口弱上拉,B口變位中斷高優(yōu)先級(jí)*/
          RCONbits.IPEN=1;/*使能中斷優(yōu)先級(jí)*/
          TRISA=0x00;/*A口設(shè)置為輸出*/
          TRISB=0XF0;/*RB1輸出,RB4輸入*/
          TRISC=0x00;/*SDO引腳為輸出,SCK引腳為輸出*/
          TRISE=0x00;/*E口設(shè)置為輸出*/
          SSPCON1=0x30;/*SSPEN=1;CKP=1,F(xiàn)OSC/4*/
          SSPSTAT=0xC0;/*時(shí)鐘下降沿發(fā)送數(shù)據(jù)*/
          PIR1=0;/*清除SSPIF標(biāo)志*/
          data=0X00;/*待顯示的寄存器賦初值*/
          bits.RB1=0;
          PORTAbits.RA3=0;
          PORTE=0;/*將K1,K2,K3,K4四條列線置0*/
          =PORTB;/*讀B口的值,為變位中斷創(chuàng)造條件*/
          }

          /*鍵服務(wù)子程序*/
          voidKEYSERVE()
          {
          PORTBbits.RB1=0;/*K1,K2置低電平,K3,K4置高電平*/
          PORTAbits.RA3=0;/*RB4為0,表示按鍵為K1,K2中的一個(gè)*/
          PORTE=3;/*RB4為1,表示按鍵為K3,K4中的一個(gè)*/
          if(PORTBbits.RB4==0)
          {
          PORTBbits.RB1=0;/*K1置低電平,K2置高電平*/
          PORTAbits.RA3=1;/*RB4為0,表示按鍵為K1;RB4為1,表示按鍵為K2*/
          if(PORTBbits.RB4==0)j=0X01;
          else{j=0X02;PORTAbits.RA3=0;}
          }
          else
          {
          PORTEbits.RE0=0;/*K3置低電平,K4置高電平*/
          PORTEbits.RE1=1;/*RB4為0,表示按鍵為K3;RB4為1,表示按鍵為K4*/
          if(PORTBbits.RB4==0)j=0X03;
          else{j=0X04;PORTEbits.RE1=0;}
          }
          }

          /*軟件延時(shí)子程序*/
          void DELAY()
          {
          for(i = 6553; --i ;)
          continue;
          }

          /*顯示子程序*/
          voidSPILED(char data)
          {
          PORTAbits.RA5=0;/*LACK送低電平,為鎖存做準(zhǔn)備*/
          SSPBUF=data;/*啟動(dòng)發(fā)送*/
          do
          {
          ;
          }while(PIR1bits.SSPIF==0);/*等待發(fā)送完畢*/
          PIR1bits.SSPIF=0;/*清除SSPIF標(biāo)志*/
          PORTAbits.RA5=1;/*最后給鎖存信號(hào),代表顯示任務(wù)完成*/
          }

          /*高優(yōu)先級(jí)中斷向量*/
          #pragma code InterruptVectorHigh=0x08
          voidInterruptVectorHigh (void)
          {
          _asm
          goto InterruptHandlerHigh /*跳到中斷程序*/
          _endasm
          }

          /*高優(yōu)先級(jí)中斷程序*/
          #pragma code
          #pragma interrupt InterruptHandlerHigh
          voidInterruptHandlerHigh ()
          {
          INTCONbits.RBIF=0;/*中斷標(biāo)志清0*/
          DELAY();/*軟件延時(shí)*/
          PORTB=PORTB;/*讀PORTB的值,并改變中斷發(fā)生的條件,可屏蔽*/
          /*一次按鍵松開時(shí)產(chǎn)生的無(wú)效的中斷,又可以防止按鍵*/
          /*時(shí)間過長(zhǎng)發(fā)生連續(xù)中斷*/
          if(PORTBbits.RB4==0)
          {
          KEYSERVE();/*進(jìn)行鍵盤的識(shí)別*/
          PORTBbits.RB1=0;
          PORTAbits.RA3=0;
          PORTE=0;/*將K1,K2,K3,K4四條列線置0,以防止鍵掃描時(shí)改變*/
          /*K1,K2,K3,K4的電平,從而改變中斷條件*/
          INTCONbits.RBIF=0;/*鍵掃描時(shí)可能會(huì)產(chǎn)生"電平變化"而使置1,再清除一次*/
          /*RBIF以求避免額外中斷*/
          data=table[j];/*獲得需要送出顯示的段碼*/
          SPILED(data);
          }
          }

          /*主程序*/
          main()
          {
          initial();/*系統(tǒng)初始化*/
          INTCONbits.GIE=1;/*總中斷允許*/
          while(1)
          {
          }/*等待中斷*/
          }



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();