;----------------------------------------------------------------------
;2010年10月5号
;----------------------------------------------
;控制数码管点阵的8255片选端为P2.1管脚CS1
;PA0---PA7依次接四位数码管的A,B,C,D,E,F,G,DP
;-----------------------------------------------------------------------
;功能: 4*4按键与数码管显L示
;-----------------------------------------------------------------------
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV SP,#60H;给堆栈赋地址初值
MOV P2,#00H ;P2口5,4,3,2四位为数码管的位选端
MOV DPTR,#0FDFFH
MOV A,#80H
MOVX @DPTR,A ;将方式控制字写入8255的控制寄存器,将8255的A,B,C口设置为输出口
;-------------扫描第一行-------------------------------------
;------------------------------------------------------------
LOOP0:
MOV P1,#0FEH;给P3口赋值11111110
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP
JMP LOOP20
LOOP:
LCALL DELAY10MS
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP1
LJMP LOOP0
LOOP1:
MOV R0,P1
CJNE R0,#0EEH,LOOP12
MOV A,#0
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP
LOOP12: CJNE R0,#0DEH,LOOP3
MOV A,#1
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP
LOOP3:
CJNE R0,#0BEH,LOOP4
MOV A,#2
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP
LOOP4:
CJNE R0,#07EH,LOOP
MOV A,#3
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP
;---------------扫描第二行------------------------------
LOOP20:
MOV P1,#0FDH;给P3口赋值11111101
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP2
JMP LOOP30
LOOP2:
LCALL DELAY10MS
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP21
LJMP LOOP20
LOOP21:
MOV R0,P1
CJNE R0,#0EDH,LOOP22
MOV A,#4
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP2
LOOP22: CJNE R0,#0DDH,LOOP23
MOV A,#5
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP2
LOOP23:
CJNE R0,#0BDH,LOOP24
MOV A,#6
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP2
LOOP24:
CJNE R0,#07DH,LOOP2
MOV A,#7
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP2
;------------------------------------------------------
;------------------扫描第三行--------------------------
LOOP30:
MOV P1,#0FBH;给P3口赋值11111101
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP33
JMP LOOP40
LOOP33:
LCALL DELAY10MS
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP31
LJMP LOOP30
LOOP31:
MOV R0,P1
CJNE R0,#0EBH,LOOP32
MOV A,#8
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP33
LOOP32: CJNE R0,#0DBH,LOOP333
MOV A,#9
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP33
LOOP333:
CJNE R0,#0BBH,LOOP34
MOV A,#10
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP33
LOOP34:
CJNE R0,#07BH,LOOP33
MOV A,#11
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP33
;--------------------------------------------------------------
;------------------扫描第四行----------------------------------
LOOP40:
MOV P1,#0F7H;给P3口赋值11111101
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP44
JMP LOOP0
LOOP44:
LCALL DELAY10MS
MOV R0,P1
MOV A,#0F0H
ANL A,R0;将R0与到累加器中
CJNE A,#0F0H,LOOP41
LJMP LOOP40
LOOP41:
MOV R0,P1
CJNE R0,#0E7H,LOOP42
MOV A,#12
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP44
LOOP42: CJNE R0,#0D7H,LOOP43
MOV A,#13
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP44
LOOP43:
CJNE R0,#0B7H,LOOP444
MOV A,#14
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP44
LOOP444:
CJNE R0,#077H,LOOP44
MOV A,#15
LCALL DISPLAY
LCALL DELAY10MS
JMP LOOP44
;--------------------------------------------------------------
DELAY10MS: ;误差 0us
MOV R7,#01H
DL1:
MOV R6,#26H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
DISPLAY:
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CALL SHUCHU
RET
;---------------------------------------------------------------------------------
;子程序功能:输出数据
;入口参数:R0
;出口参数:
;---------------------------------------------------------------------------------
SHUCHU:
MOV DPTR,#0FDFCH
MOVX @DPTR,A;将R0中的数据输出到8255的PA口
RET
;---------------------------------------------------------------------------------
;共阴数码管的段码,供查表使用
;---------------------------------------------------------------------------------
TABLE:
DB 03FH;0
DB 006H;1
DB 05BH;2
DB 04FH;3
DB 066H;4
DB 06DH;5
DB 07DH;6
DB 007H;7
DB 07FH;8
DB 06FH;9
DB 077H;A
DB 07CH;b
DB 039H;C
DB 05EH;d
DB 079H;E
DB 071H;F
END