(玩電子) 電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

按鍵實現加減運算及連續按鍵檢測

作者:佚名   來源:本站原創   點擊數:x  更新時間:2009年10月29日   【字體:

*
注意:如果無法在keil里編譯,請刪除每一行的所有前導空白
程序效果:若按鍵0(即7EH)按下,則加1;若按鍵1(即7DH)按下,
則減1;若按鍵2(即7BH)按下,則快加,若按鍵3(77H)按下,則快減。
*/
ORG 0000H
LJMP START
ORG 0030H
START:    MOV 30H,#00  //賦初值
   MOV 31H,#00
   MOV 32H,#01
 
LOOP1:    MOV R2,#04 //循環四次
   MOV R1,#0FEH  //分別為:0FEH ?FDH ?FBH ?F7H
 
LOOP:      MOV A,R1  //賦值,用于暫存A的值
   MOV P0,A   //賦初值
   RL A    //循環左移
   XCH A,R1   //暫存A的值
   MOV A,P0   //讀?P0口的值
   LCALL DELAY1  //延時

   CJNE A,#7EH,LOP1  //判斷是否有按鍵按下
   LCALL ADD1    //有,則加1
LOP12:    MOV A,P0   //以下語句是用于判斷按鍵是否松開
   LCALL DELAY1
   CJNE A,#7EH,LOP1
   LCALL DISPLAY
   SJMP LOP12  

LOP1:      CJNE A,#7DH,LOP2
   LCALL SUB1
LOP22:    MOV A,P0
   LCALL DELAY1
   CJNE A,#7DH,LOP2
   LCALL DISPLAY
   SJMP LOP22 
 
LOP2:      CJNE A,#7BH,LOP3  //判斷快加的按鍵按下
   MOV R3,#10   //按下了,下面的語句用于減慢數值變化速度
LOP32:    LCALL DISPLAY
   LCALL DELAY
   DJNZ R3,LOP32
   LCALL ADD1
 
LOP3:      CJNE A,#77H,LOP4
   MOV R4,#10
LOP42:    LCALL DISPLAY
   LCALL DELAY
   DJNZ R4,LOP42
   LCALL SUB1

LOP4:      DJNZ  R2,LOOP
   LCALL DISPLAY
   LJMP LOOP1
//顯示子程序   
DISPLAY: MOV DPTR,#TAB  //賦表首地址
   MOV A,#0FFH   
   MOV P1,A    //點亮最右邊的數碼管
   XCH A,R0   //暫存A的值
   MOV A,30H   //顯示個位數
   MOVC A,@A+DPTR
   MOV P2,A
   LCALL DELAY1  //延時
   DEC R0    //減1,用于點亮下一個數碼管,準備下次顯示
   XCH A,R0

   MOV P1,A
   XCH A,R0
   MOV A,31H
   MOVC A,@A+DPTR
   MOV P2,A
   LCALL DELAY1
   DEC R0
   XCH A,R0

   MOV P1,A
   XCH A,R0
   MOV A,32H
   MOVC A,@A+DPTR
   MOV P2,A
   LCALL DELAY1
   RET
//加子程序
ADD1:      INC 30H  //個位加1
   MOV A,30H //把30H的值賦給A
   CJNE A,#0AH,LAP //判斷個位是否加為10
   MOV 30H,#00    //是,則清零

   INC 31H
   MOV A,31H
   CJNE A,#0AH,LAP
   MOV 31H,#00

   INC 32H
   MOV A,32H
   CJNE A,#0AH,LAP
   MOV 32H,#00
LAP:         NOP   //空指令
   RET  //返回
//減子程序
SUB1:      DEC 30H  //個位減1
   MOV A,30H  //把30H的值賦給A
   CJNE A,#0FFH,LSP  //判斷30H的值為0后是否在減1
   MOV 30H,#09   //是,則給30H賦9

   DEC 31H
   MOV A,31H
   CJNE A,#0FFH,LSP
   MOV 31H,#09

   DEC 32H
   MOV A,32H
   CJNE A,#0FFH,LSP
   MOV 32H,#09

LSP:         NOP
   RET
//延時子程序,時間大約為2us*20*200=8ms
DELAY:    MOV R6,#20 
DEL2:       MOV R5,#200
DEL3:       DJNZ R5,DEL3
   DJNZ R6,DEL2
   RET
//延時子程序,時間約為:2us*5*250=2.5ms
DELAY1:  MOV R6,#5
DEL4:       MOV R5,#250
DEL5:       DJNZ R5,DEL5
   DJNZ R6,DEL4
   RET
TAB: DB 3FH,06H,5BH,4FH,66H ;數碼管顯示的數值
      DB 6DH,7DH,07H,7FH,6FH
   END
注意:如果無法在keil里編譯,請刪除每一行的所有前導空白,
 

發表評論】【告訴好友】【收藏此文】【關閉窗口

文章評論

相關文章

专注江西快三走势分析 西甲巴萨vs皇马 辉煌棋牌5000上庄游戏 捕鱼王者电玩版 单机捕鱼内购破解大全 幸运赛车号码走势图 东北麻将怎么胡图解 k7大圣闹海捕鱼游戏 下载温州茶苑app 上市公司股权价值评 51q棋牌