⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 19长数显示清无效零.asm

📁 长数显示清无效零,连续触发清有重启功能
💻 ASM
字号:
;本程序需要观看LED显示,请将CZ2和P1口用排线连接起来
org 00h

mov r1,#0
mov 30h,#0
mov 31h,#1
mov 32h,#2
mov 33h,#3
mov 34h,#4
mov 35h,#5
mov 36h,#6
mov 37h,#7   ;先将要显示的数放入寄存器内,以后做产品时,你要显示什么数就由你的程序自动计算自动放进这里


main:;LED动态扫描程序显示开始,说明有8只LED数码管,就需要分别显示8只数码管,r7表示是轮到显示第几只

cc:mov a,30h
cjne a,#0,cced
mov 30h,#16
mov a,31h
cjne a,#0,cced
mov 31h,#16
mov a,32h
cjne a,#0,cced
mov 32h,#16
mov a,33h
cjne a,#0,cced
mov 33h,#16
mov a,34h
cjne a,#0,cced
mov 34h,#16
mov a,35h
cjne a,#0,cced
mov 35h,#16
mov a,36h
cjne a,#0,cced
mov 36h,#16
cced:


inc r7
disp0:cjne r7,#8,disp1
mov r7,#0
disp1:cjne r7,#0,disp2
	mov 38h,#10000000b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,30h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp2:cjne r7,#1,disp3
	mov 38h,#01000000b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,31h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp3:cjne r7,#2,disp4
	mov 38h,#00100000b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,32h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp4:cjne r7,#3,disp5
	mov 38h,#00010000b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,33h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp5:cjne r7,#4,disp6
	mov 38h,#00001000b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,34h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp6:cjne r7,#5,disp7
	mov 38h,#00000100b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,35h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp7:cjne r7,#6,disp8
	mov 38h,#00000010b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,36h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp8:cjne r7,#7,disp9
	mov 38h,#00000001b    ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov 39h,37h  		;将要显示的数码管的笔画数据
	call ddpp               ;调用显示子程序,对上面的数码管数据显示    
disp9:
cc1:mov a,30h
cjne a,#16,cced1
mov 30h,#0
mov a,31h
cjne a,#16,cced1
mov 31h,#0
mov a,32h
cjne a,#16,cced1
mov 32h,#0
mov a,33h
cjne a,#16,cced1
mov 33h,#0
mov a,34h
cjne a,#16,cced1
mov 34h,#0
mov a,35h
cjne a,#16,cced1
mov 35h,#0
mov a,36h
cjne a,#16,cced1
mov 36h,#0
cced1:


call key
run:mov a, r1
cjne a,40h,rend0 ;看看和上次扫描的键值是否相等?不相等就跳到run1,确保下次时键值是相等;相等的话就往下面执行.
jb 00h,rend1           ;保证只执行一次,高电平跳过全部的功能执行
setb 00h      ;保证只执行一次,以下是跟据键值执行
run1:cjne r1,#0,run2
call yw
run2:cjne r1,#1,run3
call yw
run3:cjne r1,#2,run4
call yw
run4:cjne r1,#3,run5
call yw
run5:cjne r1,#4,run6
call yw
run6:cjne r1,#5,run7
call yw
run7:cjne r1,#6,run8
call yw
run8:cjne r1,#7,run9
call yw
run9:cjne r1,#8,run10
call yw
run10:cjne r1,#9,run11
call yw
run11:cjne r1,#10,run12
call yw
run12:cjne r1,#11,run13
call yw
run13:cjne r1,#12,run14
call yw
run14:cjne r1,#13,run15
call yw
run15:cjne r1,#14,run16
call yw
run16:cjne r1,#15,run17
call yw
run17:jmp rend1

rend0:mov 40h,r1   ;这里很关键,当按键放开后,或者按了键后,总会执行到这里来,
clr 00h;将00h变低,允许下一次程序执行,因此,本程序总是会可靠的只执行一次,达到消抖动和防止执行多次的目的
rend1: 


djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键

djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键


jmp main  

key:;这是站长后来经常用的键盘扫描程序,现在也只用了四种指令,以前的要占58行,现在的程序只有39行
;;说明:五一电子提供的本例子程序不是从书上和网上抄的,甚至思路都是原创的,写程序是想到哪儿就写到哪儿,最后才写成这样,
;所以,请大家学习和理解这其中的思路,如果跟某些书上、网上的思路或者代码有相同或者近似,纯属巧合!
mov p0,#00001111b    
mov a,p0
mov p0,#11110000b
add a,p0
mov r1,#51
kn0:cjne a,#01110111b,kn1
mov r1,#0
kn1:cjne a,#10110111b,kn2
mov r1,#1
kn2:cjne a,#11010111b,kn3
mov r1,#2
kn3:cjne a,#11100111b,kn4
mov r1,#3
kn4:cjne a,#01111011b,kn5
mov r1,#4
kn5:cjne a,#10111011b,kn6
mov r1,#5
kn6:cjne a,#11011011b,kn7
mov r1,#6
kn7:cjne a,#11101011b,kn8
mov r1,#7
kn8:cjne a,#01111101b,kn9
mov r1,#8
kn9:cjne a,#10111101b,kn10
mov r1,#9
kn10:cjne a,#11011101b,kn11
mov r1,#10
kn11:cjne a,#11101101b,kn12
mov r1,#11
kn12:cjne a,#01111110b,kn13
mov r1,#12
kn13:cjne a,#10111110b,kn14
mov r1,#13
kn14:cjne a,#11011110b,kn15
mov r1,#14
kn15:cjne a,#11101110b,kend
mov r1,#15
kend:ret








ledtab: db 11101101b,00000101b,11100011b,01100111b,00001111b,01101110b,11101110b,00100101b,11101111b,01101111b,10101111b,11001110b,11101000b,11000111b,11101010b,10101010b,0b


ddpp:	mov a,38h    ;通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
	mov p1,#0ffh    ;向74HC164送数据前要先熄灭LED数码管显示,否则,会出"鬼影",因为要确保每一位管对应每一位管的数据
	mov sbuf,a
	nop
	nop
	nop
	nop
	mov a,39h  		;累加器读入要显示的第一个数
	mov dptr,#ledtab
	movc a,@a+dptr  ;这是唯一的查表指令,作用就是读出DPTR中的表名中的第几个数的数据.
	cpl a ;可以显示阴文或者阳文,ledtab是顺序存放的0123456789abcdef的LED笔画关系,根据数码管的共阴或者共阳,有时高电平是点亮,有时低电平是点亮.
	mov p1,a ;放到P1口,显示出字符
	ret


yw:mov a,r1
xch a,37h
xch a,36h
xch a,35h
xch a,34h
xch a,33h
xch a,32h
xch a,31h
xch a,30h
ret




end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -