微机原理-汇编语言-实验七:数码管动态显示实验详解

系列文章目录

实验一 软件开发环境和简单程序设计
实验二 I_O输入输出实验
实验三 键盘扫描显示实验
实验四 中断实验
实验五 定时器实验
实验六 串行口实验
实验七 数码管动态显示实验
实验八 矩阵键盘应用实验
实验九 电子时钟


文章目录

  • 系列文章目录
  • 前言
  • 一、实验目的
  • 二、实验仪器
  • 三、实验内容
  • 四、流程框图
  • 通过找到数码管数据之间的关系实现(难,不容易理解)
  • 通过查表法实现(简单、容易理解)
  • 五、实验程序
  • 逻辑法
  • 查表法
  • 六、程序分析
  • 1.逻辑法
  • 数码管动态显示
  • 字符移位
  • 切换方式
  • 数码管位选
  • 2.查表法
  • 七、测试报告
  • 总结

  • 前言

    微机原理实验课程,会陆续根据目录更新文章

    一、实验目的

    掌握LED八段码显示器的动态显示工作原理

    二、实验仪器

    1. Keil5
    2. 普中A2开发板
    3. stc-isp

    三、实验内容

    单片机控制8只数码管,同时显示8个字符。例如,从左至右显示“12345678”,接着显示“23456781”,…“81234567”,“12345678”。

    四、流程框图

    通过找到数码管数据之间的关系实现(难,不容易理解)

    通过查表法实现(简单、容易理解)

    五、实验程序

    逻辑法

        ORG     0000H
        LJMP    START
        ORG     0003H
        LJMP    EX0_ISR             ;外部中断0程序入口
        ORG     000BH
        LJMP    TM0_ISR             ;定时器0中断程序入口
        ORG     0030H
    START:                          ;系统初始化
        ACALL   EX0_INIT            ;外部中断0初始化
        ACALL   TM0_INIT            ;定时器0初始化
        MOV     DPTR,   #TAB1       ;指向字形码表首地址
        MOV     R1  ,   #01H        ;因为显示的是1-8,所以初始化为1,如果显示是0-7,则初始化为0
        SETB    EA                  ;开启总中断
    MAIN:
        ACALL   DTSEG               ;数码管显示
        AJMP    MAIN                ;主函数循环
    EX0_INIT:
        SETB    EX0                 ;允许外部中断0中断
        SETB    IT0                 ;设置外部中断0下降沿触发
        RET
    TM0_INIT:
        ANL     TMOD,   #0F0H       ;初始化定时器0
        ORL     TMOD,   #01H        ;设置定时器0工作方式1
        MOV     TL0 ,   #00H        ;设置定时器初值 50ms
        MOV     TH0 ,   #4CH        ;设置定时器初值
        CLR     TF0                 ;清除TF0标志
        SETB    TR0                 ;定时器0开始计时
        SETB    ET0                 ;开启T0溢出中断
        RET
    DTSEG:                          ;动态数码管显示
        MOV     A   ,   R1          ;R1存储的是第1位数码管显示的值(从右到左数第一位)
        ADD     A   ,   #8          ;
        MOV     R0  ,   A           ;
    ONE:                            ;第一个数码管显示
        CLR     P2.2                ;选择第一位数码管显示
        CLR     P2.3                
        CLR     P2.4                
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;R0 - 8
        JZ      JW1                 ;判断R0是否为8,是则直接显示R0的值
        JNC     JNW1                ;判断R0是否小于8,小于8则直接显示R0的值
                                    ;大于8则显示R0-8的值
    JW1:MOV     A   ,   R0          ;
    JNW1:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US          ;单个数码管显示时间,时间太短,人眼无法看清;但也不能太长,因为要受限于临界闪烁频率。
        MOV     P0  ,   #00H        ;熄灭数码管,消影,防止下一个数码管显示上一个数码管显示的残影
    TWO:
        SETB    P2.2
        CLR     P2.3
        CLR     P2.4
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;判断R0是否大于8
        JZ      JW2                 ;
        JNC     JNW2
    JW2:MOV     A   ,   R0          ;
    JNW2:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US
        MOV     P0  ,   #00H        ;
    THREE:
        CLR     P2.2
        SETB    P2.3
        CLR     P2.4
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;判断R0是否大于8
        JZ      JW3                 ;
        JNC     JNW3
    JW3:MOV     A   ,   R0          ;
    JNW3:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US
        MOV     P0  ,   #00H        ;
    FOUR:
        SETB    P2.2
        SETB    P2.3
        CLR     P2.4
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;判断R0是否大于8
        JZ      JW4                 ;
        JNC     JNW4
    JW4:MOV     A   ,   R0          ;
    JNW4:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US
        MOV     P0  ,   #00H        ;
    FIVE:
        CLR     P2.2
        CLR     P2.3
        SETB     P2.4
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;判断R0是否大于8
        JZ      JW5                 ;
        JNC     JNW5
    JW5:MOV     A   ,   R0          ;
    JNW5:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US
        MOV     P0  ,   #00H        ;
    SIX:
        SETB    P2.2
        CLR     P2.3
        SETB    P2.4
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;判断R0是否大于8
        JZ      JW6                 ;
        JNC     JNW6
    JW6:MOV     A   ,   R0          ;
    JNW6:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US
        MOV     P0  ,   #00H        ;
    SEVEN:
        CLR     P2.2
        SETB    P2.3
        SETB    P2.4
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;判断R0是否大于8
        JZ      JW7                 ;
        JNC     JNW7
    JW7:MOV     A   ,   R0          ;
    JNW7:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US
        MOV     P0  ,   #00H        ;
    EIGHT:
        SETB    P2.2
        SETB    P2.3
        SETB    P2.4
        DEC     R0                  ;R0减一 
        MOV     A   ,   R0          
        SUBB    A   ,   #8          ;判断R0是否大于8
        JZ      JW8                 ;
        JNC     JNW8
    JW8:MOV     A   ,   R0          ;
    JNW8:
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        ACALL   DELAY100US
        MOV     P0  ,   #00H        ;
        RET
    EX0_ISR:
        ACALL   DELAY50MS           ;延时50ms消抖
        SETB    P3.2                ;P3,2置1,准备读取端口的值
        MOV     C   ,   P3.2        ;读取P3.2口的值
        JC      RETURN              ;如果P3,2为1,则说明按键没有按下,退出中断
        INC     R1                  ;进入中断一次,数码管显示的值+1
        CJNE    R1  ,   #9, RETURN  ;如果R1的值为9,则置1
        MOV     R1  ,   #01H        
        RETI
    TM0_ISR:
        MOV     TL0 ,   #00H        ;重装定时器初值 50ms
        MOV     TH0 ,   #4CH        ;重装定时器初值                                                            
        INC     R2                  ;R2加1
        CJNE    R2  ,   #20 ,RETURN ;判断是否到达1s
        MOV     R2  ,   #00H        ;R2清0
        INC     R1                  ;显示值加1
        CJNE    R1  ,   #9, RETURN  ;如果R1的值为9,则置1
        MOV     R1  ,   #01H        
        RETI                                               
    RETURN:
        RETI
    DELAY50MS:			;@11.0592MHz
    	PUSH 30H
    	PUSH 31H
    	MOV 30H,#90
    	MOV 31H,#158
    NEXT50MS:
    	DJNZ 31H,NEXT50MS
    	DJNZ 30H,NEXT50MS
    	POP 31H
    	POP 30H
    	RET
    DELAY100US:			;@11.0592MHz
    	PUSH 30H
    	MOV 30H,#41
    NEXT100US:
    	DJNZ 30H,NEXT100US
    	POP 30H
    	RET
    TAB1:
        DB      03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH; 0 - 9共阳极字形码
        END
    
    

    查表法

        ORG     0000H
        LJMP    START
        ORG     000BH
        LJMP    TM0_ISR             ;定时器0中断程序入口
        ORG     0030H
    START:
        ACALL   TM0_INIT
        MOV     DPTR,   #TAB1
        MOV     R1  ,   #01H        ;用于选择显示的表
        SETB    EA
    MAIN:
        ACALL   XZTAB               ;选择显示的字形码表
        ACALL   DTSEG               ;动态数码管显示
        AJMP    MAIN
    TM0_INIT:
        ANL     TMOD,   #0F0H       ;初始化定时器0
        ORL     TMOD,   #01H        ;设置定时器0工作方式1
        MOV     TL0 ,   #00H        ;设置定时器初值 50ms
        MOV     TH0 ,   #4CH        ;设置定时器初值
        CLR     TF0                 ;清除TF0标志
        SETB    TR0                 ;定时器0开始计时
        SETB    ET0                 ;开启T0溢出中断
        RET
    XZTAB:
        XZTAB1:
            CJNE    R1  ,   #1  ,   XZTAB2  ;根据R1的值选择字形码表
            MOV     DPTR,   #TAB1          
            RET
        XZTAB2:
            CJNE    R1  ,   #2  ,   XZTAB3
            MOV     DPTR,   #TAB2
            RET
        XZTAB3:
            CJNE    R1  ,   #3  ,   XZTAB4
            MOV     DPTR,   #TAB3
            RET
        XZTAB4:
            CJNE    R1  ,   #4  ,   XZTAB5
            MOV     DPTR,   #TAB4
            RET
        XZTAB5:
            CJNE    R1  ,   #5  ,   XZTAB6
            MOV     DPTR,   #TAB5
            RET
        XZTAB6:
            CJNE    R1  ,   #6  ,   XZTAB7
            MOV     DPTR,   #TAB6
            RET
        XZTAB7:
            CJNE    R1  ,   #7  ,   XZTAB8
            MOV     DPTR,   #TAB7
            RET
        XZTAB8:
            CJNE    R1  ,   #8  ,   XZTAB_RET
            MOV     DPTR,   #TAB8
        XZTAB_RET:
            RET
    DTSEG:
        MOV     R2  ,   #0          ;R2清0
    EIGHT:
        ANL     P2  ,   #0E3H       ;P2.2 P2.3 P2.4置0
        ORL     P2  ,   #1CH        ;选择第8位数码管显示
        MOV     A   ,   R2 
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A           ;字形码输出到数码管
        LCALL   DELAY100US
        MOV     P0  ,   #00H        ;消影
    SEVEN:
        INC     R2
        ANL     P2  ,   #0E3H
        ORL     P2  ,   #18H
        MOV     A   ,   R2
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        LCALL   DELAY100US
        MOV     P0  ,   #00H;
    SIX:
        INC     R2
        ANL     P2  ,   #0E3H
        ORL     P2  ,   #14H
        MOV     A   ,   R2
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        LCALL   DELAY100US
        MOV     P0  ,   #00H;
    FIVE:
        INC     R2
        ANL     P2  ,   #0E3H
        ORL     P2  ,   #10H
        MOV     A   ,   R2
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        LCALL   DELAY100US
        MOV     P0  ,   #00H;
    FOUR:
        INC     R2
        ANL     P2  ,   #0E3H
        ORL     P2  ,   #0CH
        MOV     A   ,   R2
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        LCALL   DELAY100US
        MOV     P0  ,   #00H;
    THREE:
        INC     R2
        ANL     P2  ,   #0E3H
        ORL     P2  ,   #08H
        MOV     A   ,   R2
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        LCALL   DELAY100US
        MOV     P0  ,   #00H;
    TWO:
        INC     R2
        ANL     P2  ,   #0E3H
        ORL     P2  ,   #04H
        MOV     A   ,   R2
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        LCALL   DELAY100US
        MOV     P0  ,   #00H;
    ONE:
        INC     R2
        ANL     P2  ,   #0E3H
        ORL     P2  ,   #00H
        MOV     A   ,   R2
        MOVC    A   ,   @A+DPTR
        MOV     P0  ,   A
        LCALL   DELAY100US
        MOV     P0  ,   #00H;
        RET
    TM0_ISR:
        MOV     TL0 ,   #00H        ;重装定时器初值 50ms
        MOV     TH0 ,   #4CH        ;重装定时器初值 
        INC     R0
        CJNE    R0  ,   #20 ,RETURN ;
        MOV     R0  ,   #0
        INC     R1          
        CJNE    R1  ,   #9  ,RETURN ;1~8循环
        MOV     R1  ,   #1
    RETURN:
        RETI
    DELAY100US:			;@11.0592MHz
    	PUSH 30H
    	MOV 30H,#41
    NEXT100US:
    	DJNZ 30H,NEXT100US
    	POP 30H
    	RET
    TAB1:
        DB      06H,5BH,4FH,66H,6DH,7DH,07H,7FH; 12345678
    TAB2:
        DB      5BH,4FH,66H,6DH,7DH,07H,7FH,06H; 23456781
    TAB3:
        DB      4FH,66H,6DH,7DH,07H,7FH,06H,5BH; 34567812
    TAB4:
        DB      66H,6DH,7DH,07H,7FH,06H,5BH,4FH; 45678123
    TAB5:
        DB      6DH,7DH,07H,7FH,06H,5BH,4FH,66H; 56781234
    TAB6:
        DB      7DH,07H,7FH,06H,5BH,4FH,66H,6DH; 67812345
    TAB7:
        DB      07H,7FH,06H,5BH,4FH,66H,6DH,7DH; 78123456
    TAB8:
        DB      7FH,06H,5BH,4FH,66H,6DH,7DH,07H; 81234567
    
        END;
    

    六、程序分析

    1.逻辑法

    数码管动态显示

    在某一时刻,只让某一位的位选线处于选通状态,而其他各位的位选线处于关闭状态,同时,段码线上输出相应位要显示的字符段的段码。如此循环下去,就可以使各位轮流显示出将要显示的字符。

    字符移位

    首先观察每个时刻8个数码管显示的值之间的联系。观察到前一个数码管显示的值总是后一个数码管显示的值减一,只有1-8字符有效,即1-1之后不显示0而显示8。根据这层关系即可编写代码。

    切换方式

    字符切换有两种方式,第一种为每一秒钟自动移位,第二种为按键按下移位,在定时器0中断服务函数和外部中断0服务函数中实现。

    数码管位选

    查看原理图可知,数码管的位选由74HC138译码器控制,即需要控制P2.2,P2.3,P2.4的值来控制数码管位选。

    2.查表法

    通过R1的值来切换显示的字形码表,很简单,不多做解释了,查表法这里采用了另一种数码管位选的方式,以显示第8位数码管为例

        ANL     P2  ,   #0E3H       ;P2.2 P2.3 P2.4置0
        ORL     P2  ,   #1CH        ;选择第8位数码管显示
    

    通过ANL语句将P2.2 P2.3 P2.4置0,再采用ORL语句对P2.2 P2.3 P2.4置1。通过这种方式可以不影响P2其他端口的输出。

    七、测试报告

    —上电后,数码管按照实验要求显示。每一秒钟或按键按下字符移位。效果如下图所示

    总结

    第一次写博客,如有不足,请多多包含😊,如果对您有帮助的话记得点赞哦😍

    物联沃分享整理
    物联沃-IOTWORD物联网 » 微机原理-汇编语言-实验七:数码管动态显示实验详解

    发表评论