单片机实验(二)LED数码管显示实验

终于到了有显示屏的实验了,终于可以看到输出了呢

本次实验的实验电路图如下

LED显示屏需要有两个输入口,一个是字形码输入口,就是输入的是什么字符(LED哪一个灯亮,哪一个灯灭);另一个就是字位码输入口(控制哪一组LED灯亮),因为我们用了一个反相器,所以P2口中为0的那些位显示。

我们先来看一个简单的实验,控制显示字符8

		ORG 0000H
		ajmp main
		
		org 0050H
main: 	MOV SP,#5FH ;设置堆栈指针
  		MOV a,#0feH ;置字位码初值   1111 1110B       
LD0:    mov p2,a   ;字位码送字位码口  
        MOV p0,#00H	   ;8.字形码送P0
        ACALL DLAY  ;延时
        RL A        ;左移A,为低电平的哪一个位显示      
        AJMP LD0    

;延时子程序
DLAY:   MOV R7,#250
DL1:    MOV R6,#0F8H
DL2:    DJNZ R6,DL2
        DJNZ R7,DL1
        RET
        END

程序先将堆栈指针SP初始化,然后送字位码给ACC,一开始送的值为 1111 1110B,也就是最后一组LED灯亮

然后送8的字形码00H给P0口,延时一会儿,左移A, 1111 1101B,变成控制第二个LED灯亮,然后一直执行这个循环

当延时很短的时候,看起来就好像是连续显示的一样

当我们了解了这个原理之后,实际上就很简单啦,我们可以事先将所有要用到字符的字形码都写在程序储存器中的某个位置,然后要使用的时候直接查表就行啦

TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H
        DB 82H,0F8H,80H,90H,88H,83H,0C6H
        DB 0A1H,86H,8EH,0FFH,0CH,89H
        DB 0C8H,0C1H,7FH,0BFH

上面就是字形码表

ORG 0000H
	ajmp main
	org 0050H
main:   MOV R0,#7fH  ;置显示缓冲区
        MOV A,#1
        MOV R2,#8
WRITE:  MOV @R0,A
        DEC R0
        INC A
        DJNZ R2,WRITE
;执行完之后的内存单元 
;7FH   7EH   7DH   7CH  7BH  7AH  79H   78H
; 1     2     3     4     5   6    7     8

上面是初始化程序,我们规定78H-7FH的内存单元为显存,到时候从这些地方取地址,然后取字形码送入p0口就可以显示啦

;显示字符子程序
DISP:  	MOV R5,#0FEH ;置字位码初值
        MOV R0,#78H	;显示缓冲区始地址送R0(78H-7FH)   
LD0:    MOV p2,R5   ;字位码送字位码口 (因为有反相器,所以低位对应的那一位显示)
        MOV A,@R0	;待显示字符字形码地址偏移量送A
        MOVC A,@A+DPTR ;查字形码表
        MOV p0,A	   ;字形码送P0(p0口送字形码给显示屏)
        ACALL DLAY      ;延时
        INC R0          ;R0++
        MOV A,R5	   ;字位码送A
        JNB ACC.7,LD1   ;若显示一遍,再循环(ACC最高位为0则转移)
        RL A        ;循环左移(不带进位)
        MOV R5,A
        AJMP LD0
LD1:    RET

上面是显示字形码子程序,一开始置字形码初值,然后将缓冲区地址78H送入R0,通过78H中存的字形码表偏移量取出字形码送入p0口,每次送完之后都延时一会儿,R0++,然后将A左移,当A最高位为0的时候,表示已经显示完一遍了,那么就 重新执行这个子程序,在重复显示一遍,同理,只要速度足够快,就看不出频闪的效果。

最后,贴一下完整代码

	ORG 0000H
	ajmp main
	org 0050H
main:   MOV R0,#7fH  ;置显示缓冲区
        MOV A,#1
        MOV R2,#8
WRITE:  MOV @R0,A
        DEC R0
        INC A
        DJNZ R2,WRITE
;执行完之后的内存单元 
;7FH   7EH   7DH   7CH  7BH  7AH  79H   78H
; 1     2     3     4     5   6    7     8
       	MOV SP,#5FH
	mov DPTR,#tab
L1:	ACALL DISP
	SJMP L1

;显示字符子程序
DISP:  	MOV R5,#0FEH ;置字位码初值
        MOV R0,#78H	;显示缓冲区始地址送R0(78H-7FH)   
LD0:    MOV p2,R5   ;字位码送字位码口 (因为有反相器,所以低位对应的那一位显示)
        MOV A,@R0	;待显示字符字形码地址偏移量送A
        MOVC A,@A+DPTR ;查字形码表
        MOV p0,A	   ;字形码送P0(p0口送字形码给显示屏)
        ACALL DLAY      ;延时
        INC R0          ;R0++
        MOV A,R5	   ;字位码送A
        JNB ACC.7,LD1   ;若显示一遍,再循环(ACC最高位为0则转移)
        RL A        ;循环左移(不带进位)
        MOV R5,A
        AJMP LD0
LD1:    RET

;存字形码
TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H
        DB 82H,0F8H,80H,90H,88H,83H,0C6H
        DB 0A1H,86H,8EH,0FFH,0CH,89H
        DB 0C8H,0C1H,7FH,0BFH

;延时子程序
DLAY:   MOV R7,#02H
DL1:    MOV R6,#0F8H
DL2:    DJNZ R6,DL2
        DJNZ R7,DL1
        RET
        END

怎么样,是不是也没有那么难?加油,只剩下一个课程设计啦ヾ(◍°∇°◍)ノ゙

发布了130 篇原创文章 · 获赞 151 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/90781644