- ;===============================================================
- ;程序編寫人:蘭建文
- ;編寫地點:51hei培訓機構
- ;時間:2009年6月9日上午 星期二
- ;功能:本程序實現P0口的對2個數碼管顯示0到99,一個按鍵實現一次
- ;按鍵只遞加1次,到99回到0,按著不動不影響數碼管動態顯示;任何時
- ;刻,任何一個按鍵,若按鍵時間超過3秒,循環顯示0到9回到0,時間
- ;間隔1秒。若時間小于1秒,顯示加1,低電平亮
- ;P2口實現對數碼管的片選功能
- ;===============================================================
- ;=========================開始初始化============================
- SHUCHU EQU P0 ;定義P0口為輸出口
- PIANXUAN EQU P2 ;定義P2口為片選口
- SHUZI EQU 30H ;設置處理數據存放地址
- ANJIAN1 BIT 20H.0 ;設置按鍵標志位
- ANJIAN2 BIT 20H.1 ;設置按鍵標志位
- BIT0 BIT 20H.2 ;設置中斷定時器0標志位
- CHANGAN BIT 20H.3 ;設置長按標志位
- LIANAN BIT 20H.4 ;設置連按標志位
- XIAN1 BIT 20H.5
- XIAN2 BIT 20H.6
- BIT4 BIT 20H.7
- MODE EQU 01H
- ;========================程序開始==============================
- ORG 00H ;程序開始
- LJMP START ;跳到START
- ORG 0BH ;中斷定時器0入口地址
- JMP T0_1 ;跳到定時器0服務程序
- ORG 0030H ;入口地址
- ;=========================主程序===============================
- START:MOV SP,#70H ;移開指針
- MOV SHUZI,#00 ;數據初始化
- MOV DPTR,#TAB ;查表初始化
- CALL INIT ;開中斷
- CLR ANJIAN1 ;按鍵標志位清0
- CLR ANJIAN2 ;按鍵標志位清0
- CLR CHANGAN ;長按標志位清0
- CLR LIANAN
- CLR XIAN1
- CLR XIAN2
- CLR BIT4
- SETB BIT0 ;中斷標志位置1
- MOV R0,#0
- MOV R1,#0
- MOV R2,#0
- MOV R3,#0
-
- MAIN:JNB BIT0,MAIN ;等待中斷
- CLR BIT0 ;中斷標志位清0
-
- JB BIT4,VV
- INC R3
- CJNE R3,#50,XX
- MOV R3,#00
- MOV R2,#0
- JMP DD
- XX:CJNE R2,#3,VV
- SETB LIANAN
- MOV R2,#00
-
- DD:CLR BIT4
- VV:JB LIANAN,ZIJIAN
- JB CHANGAN,ZIJIA ;長按標志位=1,循環顯示0-9;若不為0顯示鍵值加一
-
- CALL JISUAN
- CALL DISPLAY
- JB ANJIAN2,JJ
-
- JNB ANJIAN1,PANDUAN1
- JNB P1.2,XIANSHI1
- MOV R0,#00
- CLR ANJIAN1
- CLR XIAN1
- CLR ANJIAN2
- CLR XIAN2
- JMP MAIN
- JJ:JNB ANJIAN2,PANDUAN2
- JNB P1.3,XIANSHI2
- ; SETB BIT4
- INC R2
- ; MOV R3,#0
- CLR ANJIAN1
- CLR XIAN1
- CLR ANJIAN2
- CLR XIAN2
- JMP MAIN
- PANDUAN1:JB P1.3,YY
- SETB BIT4
- ; INC R2
- MOV R3,#0
- SETB ANJIAN2
- ;JMP MAIN
- YY:JB P1.2,MAIN ;若按鍵抬起則返回MAIN,若沒有抬起按鍵標志位清0
- SETB ANJIAN1
- JMP MAIN
- PANDUAN2:JB P1.2,ZZ
- SETB ANJIAN1
- JMP MAIN
- ZZ:JB P1.3,MAIN ;若按鍵抬起則返回MAIN,若沒有抬起按鍵標志位清0
- SETB ANJIAN2
- JMP MAIN
- XIANSHI1:
- INC R0
- CJNE R0,#150,L6 ;若R0=150,長按到達1秒,循環顯示0-9;不相等,則顯示鍵值加1
- MOV R0,#00
- SETB CHANGAN
- L6:JB XIAN1,MAIN
- SETB XIAN1 ;顯示標志位清0
- CALL JIACHULI ;加處理
- JMP MAIN
- XIANSHI2:
- JB XIAN2,OUT
- SETB XIAN2 ;顯示標志位清0
- CALL JIANCHULI ;加處理
- OUT:JMP MAIN
-
- ZIJIA:MOV A,SHUZI
- CALL JIACHULI
- CALL JISUAN
- CALL DISPLAY
- JMP MAIN
- ZIJIAN:MOV A,SHUZI
- CALL JIANCHULI
- CALL JISUAN
- CALL DISPLAY
- JMP MAIN
- ;====================定時中斷0服務子程序========================
- ;輸入:無
- ;輸出:無
- ;實現的功能:實現定時20MS,影響標志位T_BIT.
- ;===============================================================
- T0_1:MOV TL0,#0E0H ;設置定時初值
- MOV TH0,#0B1H
- SETB BIT0 ;定時標志位清0
- RETI
- ;========================中斷設置子程序=========================
- ;輸入:無
- ;輸出:無
- ;實現的功能:初始化設置定時器,設置初值
- ;===============================================================
- INIT:MOV TMOD,#MODE ;定時器0工作方式1
- MOV TL0,#0E0H
- MOV TH0,#0B1H
- MOV IE,#82H ;開定時器中斷0
- SETB TR0 ;開定時器0
- RET
- ;========================計算子程序=============================
- ;輸入:30H
- ;輸出:"A和B"
- ;實現的功能:把30H的數據的十位和個位分離出來
- ;===============================================================
- JISUAN:MOV A,SHUZI
- MOV B,#10 ;除數放在B中
- DIV AB ;商放在A中,余數放在B中
- RET
- ;========================顯示子程序=============================
- ;輸入:"A"
- ;輸出:"P0口"
- ;實現的功能:把A的數輸出到P0口顯示,十位和個位分開顯示
- ;===============================================================
- DISPLAY:MOVC A,@A+DPTR ;查表
- MOV SHUCHU,A ;顯示十位
- MOV PIANXUAN,#04H ;片選
- CALL DELAY
- MOV SHUCHU,#0FFH
- MOV A,B
- MOVC A,@A+DPTR ;查表
- MOV SHUCHU,A ;顯示個位
- MOV PIANXUAN,#05H ;片選
- CALL DELAY
- MOV SHUCHU,#0FFH
- RET
- ;======================加處理子程序=============================
- ;輸入:無
- ;輸出:無
- ;實現的功能:把30H地址加1
- ;===============================================================
- JIACHULI:
- MOV A,SHUZI
- CJNE A,#99,L7
- MOV SHUZI,#00
- CLR CHANGAN
- JMP L8
- L7:INC SHUZI
- L8:RET
- ;======================減處理子程序=============================
- ;輸入:無
- ;輸出:無
- ;實現的功能:把30H地址加1
- ;===============================================================
- JIANCHULI:MOV A,SHUZI
- CJNE A,#00,L9
- MOV SHUZI,#99
- CLR LIANAN
- JMP LL
- L9:DEC SHUZI
- LL:RET
- ;========================延時程序===============================
- ;輸入;無
- ;輸出: 無
- ;實現的功能:延時一段時間
- ;===============================================================
- DELAY:
- MOV R6,#3
- LL1:MOV R7,#250
- DJNZ R7,$
- DJNZ R6,LL1
- RET
- ;=====================共陽查表數據==============================
- TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- ;=======================程序結束================================
- END
復制代碼
|