数码管显示的多种方式
大小:0.15 MB 人气: 2017-09-06 需要积分:0
1、实现3*4按键数码管显示
;******************************************************************************;* 描述:
;* 实现3*4按键数码管显示, 按K1 对应四个数码管显示1 ; 按K2 对应四个数码管显示2, 按K3 对应四个数码管显示3
; 按K4 对应四个数码管显示4, 按K5 对应四个数码管显示5
; 按K6 对应四个数码管显示6, 按K7 对应四个数码管显示7
; 按K8 对应四个数码管显示8, 按K9 对应四个数码管显示9
; 按K10 对应四个数码管显示a, 按K11 对应四个数码管显示b
; 按K12 对应四个数码管显示C
; Y1接P2.0 Y2接P2.1 Y3接P2.2 X1接P2.4 X2接P2.5 X3接P2.6 X4接P2.7
;******************************************************************************
;* 【版权】 Copyright(C)东哥单片机学习网 www.picavr.com All Rights Reserved
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!
;******************************************************************************
DATA1 EQU 30H ;
DATA2 EQU 31H ;
DATA3 EQU 32H ;
DATA4 EQU 33H ;
KEYBUF EQU 34H ;
;-------------------------------------------
ORG 0000H ;
LJMP START ;转入主程序
ORG 0030H ;
START:
MOV SP,#60H ;初始化堆栈指针
MOV P0,#0FFH ;初始化I/O口
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV A,#00H ;
MOV DATA1,A ;设定显示初值
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
;*******************************************
MAIN:
CALL DISP ;调显示子程序
CALL KEYWORK ;
AJMP MAIN ;
;*******************************************
;显示子程序
;******************************************
DISP:
MOV A,DATA1 ;
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR ;取数据表数据
MOV P0,A ;DATA1 显示代码传送到P0口
CLR P1.0 ;
LCALL DELAY1MS ;
SETB P1.0 ;
MOV A,DATA2 ;
MOVC A,@A+DPTR ;取数据表数据
MOV P0,A ;DATA2 显示代码传送到P0口
CLR P1.1 ;
LCALL DELAY1MS ;
SETB P1.1 ;
MOV A,DATA3 ;
MOVC A,@A+DPTR ;取数据表数据
MOV P0,A ;DATA3 显示代码传送到P0口
CLR P1.2 ;
LCALL DELAY1MS ;
SETB P1.2 ;
MOV A,DATA4 ;
MOVC A,@A+DPTR ;取数据表数据
MOV P0,A ;DATA4 显示代码传送到P0口
CLR P1.3 ;
LCALL DELAY1MS ;
SETB P1.3 ;
RET ;
;*******************************************
;*******************************************
;4*4行列扫描查键子程序
;*******************************************
KEYWORK: MOV P2,#0FFH ;置P2口為输入状态
CLR P2.0 ;扫描第1行(第1行為0)
MOV A,P2 ;读入P2口值
ANL A,#0F0H ;低4位为0
CJNE A,#0F0H,KEYROW ;高4位不为全1(有鍵按下)轉KEYROW
SETB P2.0 ;
CLR P2.1 ;扫描第2行(第2行為0)
MOV A,P2 ;读入P2口值
ANL A,#0F0H ;低4位为0
CJNE A,#0F0H,KEYROW ;高4位不为全1(有鍵按下)轉KEYROW
SETB P2.1 ;
CLR P2.2 ;扫描第3行(第3行為0)
MOV A,P2 ;读入P2口值
ANL A,#0F0H ;低4位为0
CJNE A,#0F0H,KEYROW ;高4位不为全1(有鍵按下)轉KEYROW
SETB P2.2 ;
RET ;子程序返回
;***********************************************************************
KEYROW: ACALL DISP ;消抖處理
MOV A,P2 ;再讀入P2口值
ANL A,#0F0H ;低4位为0
CJNE A,#0F0H,KEYCHE ;高4位不为全1確有鍵按下轉KEYCHE
KEYOUT: RET ;干擾子程序返回
;------------------------------------------------------
KEYCHE: MOV A,P2 ;读入P2口值
MOV KEYBUF,A ;放入KEYBUF暫存
CJLOOP: ACALL DISP ;調顯示子程序
MOV A,P2 ;读入P2口值
ANL A,#0F0H ;低4位为0
CJNE A,#0F0H,CJLOOP ;高4位为全1(鍵還按住),轉CJLOOP等待釋放
MOV R7,#00H ;鍵釋放,置R7初值為#00H(查表次數)
MOV DPTR,#KEYTAB ;取鍵值表首址
CHEKEYLOOP: MOV A,R7 ;查表次數入A
MOVC A,@A+DPTR ;查表
XRL A,KEYBUF ;查表值與P2口讀入值比較
JZ K1 ;為0(相等)轉KEYOK
INC R7 ;不等,查表次數加1
CJNE R7,#0DH,CHEKEYLOOP;查表次數不超過12次轉LHEKEYLOOP再查
AJMP KEYOUT ;12次到,退出
;***********************************************************************
K1:
MOV A,R7 ;查表次數入 A(即鍵號值)
CJNE A,#00H,K2 ;
MOV A,#01H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K2:
MOV A,R7 ;
CJNE A,#01H,K3 ;
MOV A,#02H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K3:
MOV A,R7 ;
CJNE A,#02H,K4 ;
MOV A,#03H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K4:
MOV A,R7 ;
CJNE A,#03H,K5 ;
MOV A,#04H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
;-------------------------------------------
K5:
MOV A,R7 ;
CJNE A,#04H,K6 ;
MOV A,#05H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K6:
MOV A,R7 ;
CJNE A,#05H,K7 ;
MOV A,#06H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K7:
MOV A,R7 ;
CJNE A,#06H,K8 ;
MOV A,#07H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K8:
MOV A,R7 ;
CJNE A,#07H,K9 ;
MOV A,#08H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K9:
MOV A,R7 ;
CJNE A,#08H,K10 ;
MOV A,#09H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K10:
MOV A,R7 ;
CJNE A,#09H,K11 ;
MOV A,#0AH ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K11:
MOV A,R7 ;
CJNE A,#0AH,K12 ;
MOV A,#0BH ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K12:
MOV A,R7 ;
CJNE A,#0BH,K12_1 ;
MOV A,#0CH ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
K12_1:
AJMP KEYOUT ;
;*******************************************
DELAY1MS:
MOV R4,#2 ;延时子程序
DEL1:
MOV R5,#250 ;
DJNZ R5,$ ;
DJNZ R4,DEL1 ;
RET ;
;-------------------------------------------
DELAY10MS:
MOV R4,#20 ;
DEL2:
MOV R5,#250 ;
DJNZ R5,$ ;
DJNZ R4,DEL2 ;
RET ;
;*******************************************
TABLE:
DB 0C0H ;0 11000000B
DB 0F9H ;1 11111001B
DB 0A4H ;2 10100100B
DB 0B0H ;3 10110000B
DB 99H ;4 10011001B
DB 92H ;5 10010010B
DB 82H ;6 10000010B
DB 0F8H ;7 11111000B
DB 80H ;8 10000000B
DB 90H ;9 10010000B
DB 88H ;A 10001000B
DB 83H ;b 10000011B
DB 0C6H ;C 11000110B
;********************************************
;鍵號對應P2口數值表(同時按下兩鍵為無效操作)
KEYTAB: DB 0EEH,0DEH,0BEH,7EH ;
DB 0EDH,0DDH,0BDH,7DH ;
DB 0EBH,0DBH,0BBH,7BH ;
END ;
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%