|

楼主 |
发表于 2010-2-23 22:17:39
|
显示全部楼层
BIT_COUNT DATA 7FH ;2005.5.17.我的硬件 Write By ClimberWinTIMER DATA 7EHTIMER1 DATA 7DHTEN DATA 7CHDATA_IN DATA 20HDATA_OUT DATA 21H! \* S* f5 w& p! b/ h6 P( Y" c
, N( N; o( O- L! u$ H9 k& y; Q W0 vSMG6 DATA 50H ;数码管值所存的地址SMG5 DATA 51HSMG4 DATA 52HSMG3 DATA 53H;****************TEN0 DATA 40H ;TEN1 DATA 41HTEN2 DATA 42HTEN3 DATA 43H3 Z9 k7 Q$ m" `1 u, I
. o' `+ k6 y: A" L! C# f;*************** ;R4 R5 R6 R7分别存数码管数据DAT BIT P2.2KEY BIT P2.1CS BIT P2.4CLK BIT P2.3 ;;;;;;;;;;;;;;;;A0 EQU P1.5A1 EQU P1.4CS1 EQU P1.3WR EQU P1.1RD EQU P1.2;;;;;;;;;;;;;;;;;;A8 EQU P1.6A9 EQU P1.7* X/ m. V& o* S
2 u$ n3 ]% \+ p4 y& Y
ORG 00H JMP ST ORG 13H JMP INT1ST: MOV IE, #10000100B ;设置INT0中断使能 MOV TCON,#00000000B ;设置中断为电平触发 MOV TMOD,#01010000B MOV SMG3,#00H MOV SMG4,#00H MOV SMG5,#00H MOV SMG6,#00H MOV 27H,#20H ;计数器低8位 MOV 28H,#03H ;计数器高8位 JMP START MOV R0,#00H MOV R6,#00H MOV 2DH,#03H ;波形选择 MOV 70H,#01H MOV 54H,#00H ;用于确定,让调节的不再闪动。0AH这个键控制(80H是P0口
* J, s+ T) _) u) C! @" l6 W- r N- v0 q5 q
MOV 21H,#20H ;设置8254的计数器值 ;计数器1 MOV 3FH,#00H MOV 22H,#4EH CALL MODE1 ;计数器0 NOP MOV 27H,#20H CALL MODE2 ;计数器1
1 X8 N3 D k* O8 @5 Y" y: \* p9 l6 X' l* ~
START: MOV SP,#2FH ; ; CLR P2.2 ;A10 ;CLR P2.3 ;A11 ; CLR P2.4 ;A12 CLR A8 CLR A9 CLR DAT CLR CLK MOV TIMER,#50 ;ST_DELAY: MOV TIMER1,#255ST_DELAY1 JNZ TIMER1,ST_DELAY1 DJNZ TIMER,ST_DELAY MOV DATA_OUT,#10100100B ; 清屏 CALL SEND;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;) k. i0 U3 @; x) F9 N: h" e; u
; W* H9 G' I, H) H5 m/ T+ l! F3 w
;******************************************** MOV DATA_OUT,#10000001B ;显示 ".HZ."* CALL SEND ;H ;* MOV DATA_OUT,#0CH ;* CALL SEND ;* ;++++++++++++++++++++++++++++++ ;* MOV DATA_OUT,#10000000B ;* CALL SEND ;* MOV DATA_OUT,#82H ; Z ;* CALL SEND ;*;++++++++++++++++++++++++++++++ ;* MOV DATA_OUT,#10000010B ;.点亮小数点;* CALL SEND ;* MOV DATA_OUT,#10001111B ;* CALL SEND ;*;++++++++++++++++++++++++++++++ ;* ;用个定时器就可以让小数点一闪一闪了;********************************************* ;MOV DATA_OUT,#98H ;这里的7位消隐 ;CALL SEND ; MOV DATA_OUT,#11111101B ; CALL SEND SETB CS;*********************************************MAIN: JB KEY,$ ;
) x: p Z" q; C: R) A3 r+ G3 |: y8 r+ C7 q+ v+ `; `& Q: j' n
CLR A MOV DATA_OUT,#15H ; 键盘读取指令 CALL SEND CALL RECEIVE SETB CS MOV A,DATA_IN MOV R0,#00H ;用来测试按键的对应值 MOV R0,A ;;;;;;;;;;;;;;;;;;;;;;;;; ;键值编码 CALL JUDGE CJNE A,#05H,LL MOV DATA_OUT,#0A4H ; 清屏 CALL SEND JMP START ;;;;;;;;;;;;;;;;;;;;;;;LL: MOV A,70H CJNE A,#01,L1 ;判断哪个数码管显示 JMP SM3L1: CJNE A,#02,L2 JMP SM4L2: CJNE A,#03,L3 JMP SM5L3: CJNE A,#04,L4 JMP SM6L4: CJNE A,#05,L5L5: MOV 70H,#01H
9 t G5 g3 d* g9 C
9 t3 d$ I! |6 P F/ jSM3: MOV DATA_OUT,#10000010B ;数码管3的值存在SMG3地址中 CALL SEND MOV SMG3 ,TEN MOV R4,TEN MOV DATA_OUT,SMG3 MOV TEN ,SMG3 ;取的值存回TEN种,对进位,减位时有用 CALL SEND ;////////////////////////// MOV A,54H CJNE A,#00H,SD MOV DATA_OUT,#88H ;闪动程序 CALL SEND MOV DATA_OUT,#11111011B CALL SEND JMP KK0 \$ @; D2 i8 R) q0 e
9 D0 |$ T4 Q9 S+ o/ k2 W
SD: CALL NOSD ;调用不闪动子程序 JMP KK ;;;;;;;;;;;
0 n8 `- Y3 I6 S! v; w& Y% y# C% s1 N& A, w# u
SM4: MOV DATA_OUT,#10000011B CALL SEND MOV SMG4 ,TEN ;数码管4的值存在SMG4地址中 MOV R5,TEN MOV DATA_OUT,SMG4 MOV TEN ,SMG4 CALL SEND ;////////////////////////// MOV A,54H ;用50H的地址值来判断是否抖动显示 CJNE A,#00H,SD ;#00H就抖动程序,#01H就跳到不抖动的程序 MOV DATA_OUT,#88H CALL SEND MOV DATA_OUT,#11110111B CALL SEND JMP KKSM5: MOV DATA_OUT,#10000100B CALL SEND MOV SMG5 ,TEN ;数码管5的值存在SMG5地址中 MOV R6,TEN MOV DATA_OUT,SMG5 MOV TEN ,SMG5 CALL SEND ;/////////////////////// MOV A,54H CJNE A,#00H,SD ;判断是否选择抖动显示程序 MOV DATA_OUT,#88H CALL SEND MOV DATA_OUT,#11101111B CALL SEND JMP KKSM6: MOV DATA_OUT,#10000101B CALL SEND MOV SMG6 ,TEN ;数码管5的值存在SMG5地址中 MOV R7,TEN MOV A,SMG6 ;********************** ADD A,#10000000B ;数码管6的小数点的显示* MOV SMG6,A ;********************** MOV DATA_OUT,SMG6 ANL A,#01111111B MOV SMG6,A MOV TEN ,SMG6 CALL SEND ;/////////////////// ; U2 @/ o$ e* M/ |3 p9 \* e7 r
7 e8 F% w' N: N6 {& d; Z ;;;;;;;;;;;;;;;;;;;;;; MOV A,54H CJNE A,#00H,SD MOV DATA_OUT,#88H CALL SEND MOV DATA_OUT,#11011111B CALL SEND( D# t9 z5 M! f7 b% q
: M9 i# r* I" N( _ c9 m8 f
JMP KKKK: SETB CSWAIT: JNB KEY,WAIT ; JMP MAIN;*******************************************
+ b- q0 ~! v) a
) x8 o, r0 b: V1 k- Q- E/ C1 U+ O;*******************************************SEND: MOV BIT_COUNT,#8 ; ;****;LED显示的发送子程序 CLR CS ;**** CALL LDELAY ;****SEND_LOOP: MOV C,DATA_OUT.7 ;**** MOV DAT,C ;**** SETB CLK ;**** MOV A,DATA_OUT ;**** RL A ;**** MOV DATA_OUT,A ;**** CALL SDELAY ;**** CLR CLK ;**** CALL SDELAY ;**** DJNZ BIT_COUNT,SEND_LOOP ;**** CLR DAT ;**** RET ;****;*******************************************
1 u' b0 a: Z9 ?1 l/ p1 H5 M* a" @) }1 l2 v
;*******************************************RECEIVE: MOV BIT_COUNT,#8 ; 按键值接收指令 SETB DAT ; CALL LDELAY ;RECEIVE_LOOP: SETB CLK ; CALL SDELAY ; MOV A,DATA_IN ; RL A ; MOV DATA_IN,A ; MOV C,DAT ; MOV DATA_IN.0,C ; CLR CLK ; CALL SDELAY ; DJNZ BIT_COUNT,RECEIVE_LOOP CLR DAT RET ;;*******************************************JUDGE: CJNE A,#02H,NEXT1 ;按键值的对应设置,即各个按键的功能 MOV TEN,#00H JMP OUTNEXT1: CJNE A,#0BH,NEXT2 MOV TEN,#01H JMP OUTNEXT2: CJNE A,#0AH,NEXT3 MOV TEN,#02H JMP OUTNEXT3: CJNE A,#09H,NEXT4 ;;; MOV TEN,#03H JMP OUTNEXT4: CJNE A,#08H,NEXT5 MOV TEN,#04H JMP OUT ;*******************************NEXT5: CJNE A,#0FH,NEXT6 ;* 键盘对应值 * MOV TEN,#05H ;*0B 0A 09 08 ; 0D 0C 0D 0C JMP OUT ;*03 02 01 00*NEXT6: CJNE A,#0EH,NEXT7 ; 07 06 05 04******************* MOV TEN,#06H JMP OUTNEXT7: CJNE A,#0DH,NEXT8 MOV TEN,#07H JMP OUTNEXT8: CJNE A,#0CH,NEXT9 MOV TEN,#08H JMP OUTNEXT9: CJNE A,#03H,NEXT10 MOV TEN,#09H JMP |
|