;-------------------------------------------------------
;程序名称:3X4矩阵键盘4位动态移位LED显示程序 *
;实现功能:扫描出键盘的键值并在4位LED上分别显示 *
;MCU: STC89C58RD+ 支持ISP功能 *
;p0口接LED段码 p2.4(第一位LED片选)~~p2.0(第4位片选)*
;p1.6 p1.5 p1.4 p1.3 *
; p1.2 *
; 3 X 4矩阵 p1.1 *
; p1.0 *
;-------------------------------------------------------
org 0000H
mov 30h,#00h ;将30H个位显示缓冲单元清零
mov 31h,#00h ;将31H十位显示缓冲单元清零
mov 32h,#00h ;将32H百位显示缓冲单元清零
mov 33h,#00h ;将33H千位显示缓冲单元清零
loop_r0: mov r0,#00h ;LED位计数器初始值
ajmp main ;跳主程序
org 0030h
;************************************************************
MAIN: ;主程序
LCALL DISPLAY ; 调显示子程序
LCALL KEY ; 调键盘子程序
AJMP MAIN ; 返回
;*******************************************************
loop_jishu: inc r0
CJNE R0,#01h,LOOP_02H
mov 30h,r3
ajmp main
ret
loop_02h: CJNE R0,#02h,LOOP_03H
mov 31h,r3
ajmp main
ret
loop_03h: CJNE R0,#03h,LOOP_04H
mov 32h,r3
ajmp main
ret
loop_04h: CJNE R0,#04h,LOOP_r0
mov 33h,r3
ajmp main
ret
CJNE R0,#05h,main
ajmp loop_r0
ret
;***********************************************************
KEY: MOV P1,#0FFH
CLR P1.0 ;扫KEY1
JB P1.3,KEY1_4 ;P1.3为高电平,跳出,扫描下个I/O口,P1.3为低电平执行下一句
ACALL DELAY10ms ;延时消抖再确认按下
key1__3: JB P1.3,KEY1_4 ;确认跳出,不确认执行下一句
MOV r3,#088H ;*
lcall display
jnb p1.3,key1__3
LJMP loop_jishu
KEY1_4: JB P1.4 ,KEY1_5
ACALL DELAY10ms
KEY1__4: JB P1.4 ,KEY1_5
MOV r3,#0F8H ;7
lcall display
jnb p1.4,key1__4
LJMP loop_jishu
KEY1_5: JB P1.5 ,KEY1_6
ACALL DELAY10ms
JB P1.5 ,KEY1_6
KEY1__5: MOV r3,#99H ;4
lcall display
jnb p1.5,key1__5
LJMP loop_jishu
KEY1_6: JB P1.6 ,next1
ACALL DELAY10ms
JB P1.6,NEXT1
KEY1__6: MOV r3,#0F9H ;1
lcall display
jnb p1.6,key1__6
LJMP loop_jishu
; -----------------------------
next1: setb p1.0
CLR P1.1 ;扫KEY2
JB P1.3 ,KEY2_4
ACALL DELAY10ms
JB P1.3 ,KEY2_4
KEY2__3: MOV r3,#0C0H ;0
lcall display
jnb p1.3,key2__3
LJMP loop_jishu
KEY2_4: JB P1.4 ,KEY2_5
ACALL DELAY10ms
JB P1.4 ,KEY2_5
KEY2__4: MOV r3,#80H ;8
lcall display
jnb p1.4,key2__4
LJMP loop_jishu
KEY2_5: JB P1.5 ,KEY2_6
ACALL DELAY10ms
JB P1.5 ,KEY2_6
KEY2__5: MOV r3,#92H ;5
lcall display
jnb p1.5,key2__5
LJMP loop_jishu
KEY2_6: JB P1.6 ,next2
ACALL DELAY10ms
JB P1.6,NEXT2
KEY2__6: MOV r3,#0A4H ;2
lcall display
jnb p1.6,key2__6
LJMP loop_jishu
;--------------------------------
next2: setb p1.1
CLR P1.2 ;扫KEY3
JB P1.3 ,KEY3_4
ACALL DELAY10ms
JB P1.3 ,KEY3_4
KEY3__3: MOV r3,#83H ;#
lcall display
jnb p1.3,key3__3
LJMP loop_jishu
KEY3_4: JB P1.4 ,KEY3_5
ACALL DELAY10ms
JB P1.4 ,KEY3_5
KEY3__4: MOV r3,#90H ;9
lcall display
JNB P1.4,KEY3__4
LJMP loop_jishu
KEY3_5: JB P1.5 ,KEY3_6
ACALL DELAY10ms
JB P1.5 ,KEY3_6
KEY3__5: MOV r3,#82H ;6
lcall display
jnb p1.5,key3__5
LJMP loop_jishu
KEY3_6: JB P1.6 ,next3
ACALL DELAY10ms
JB P1.6 ,NEXT3
KEY3__6: MOV r3,#0B0H ;3
lcall display
jnb p1.6,key3__6
LJMP loop_jishu
next3: setb p1.2
RET
;**************************************************************
display: mov p0,#0ffh ;将P02口置高电平
mov p2,#0ffh
mov r7,#100 ;软件计数器赋值
dd1:
mov R2,30h ;将显示缓冲区30H中的值送入ACC
;movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p0,R2 ;将要显示的数送入P0口
clr p2.4 ;开个位显示单元
lcall delay100us ;延时100US
setb p2.4 ;关个位显示单
mov R2,31h ;将显示缓冲区别31H中的值送入A
;movc A,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p0,R2 ;将要显示的数送入P0口
clr p2.5 ;开十位显示单元
lcall delay100us ;延时100US
setb p2.5 ;关十位显示单元
mov R2,32h ;将显示缓冲区32H中的值送入ACC
;movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p0,R2 ;将要显示的数送入P0口
clr p2.6 ;开百位显示单元
lcall delay100us ;延时100US
setb p2.6 ;关百位显示单元
mov R2,33h ;将显示缓冲区33H中的值送入ACC
;movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
mov p0,R2 ;将要显示的数送入P0口
clr p2.7 ;开千位显示单元
lcall delay100us ;延时100US
setb p2.7 ;关千位显示单元
djnz r7,dd1 ;R7不等于0返回至DD1处
ret ;R7等于0子程序返回
;***********************************************************
delay10ms:
mov r6,#50
tt2:
mov r5,#30
djnz r5,$
djnz r6,tt2
ret
delay100us:
mov r5,#30
djnz r5,$
ret
end
上一篇:51单片机驱动74HC595的编程及使用要点
下一篇:C8051F320单片机功能部件及特点简介
推荐阅读最新更新时间:2024-03-16 15:52