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

📄 file3.asm

📁 单片机学习系统附的实验源代码
💻 ASM
字号:
;这是数码显示程序
;实验现象:数码管从右边开始,从1(不带小数点)依次循环显示到F.(带小数点),总共32个字符
;着重介绍的是如何查表,如何制作数码管对应的段码等,以及如何扫描数码管!
;每个显示以后的延时是前面程序涉及到的,这里只是简单地调用了一下,如果这个调用很短,并且
;显示的数位刚好8位,会怎么样呢?======那就是动态扫描的概念了,那就不是一个一个的显示
;表现出来的我们就看到了一串数字76543210,其实还是一个一个地显示,只不过,我们眼睛
;由于视觉暂留的缘故,看到的是一串罢了!



        beep   bit  p3.7    ;定义蜂明器

		segdata equ p0      ;数据 输出
		sege    equ p2.7    ;显示 选中
		segb    equ p2.6    ;位 选
		segd    equ p2.5    ;段 选

	org 00h                 ;程序开始
	jmp main                ;主程序开始处 

	org 030h                ;主程序从30H开始
 main:mov sp,#30h           ;设置堆栈
      lcall rest            ;调用初始化程序
      lcall pro_8led        ;调用数码管显示程序
      jmp main              ;返回

;********* 初始化程序  **************
   
rest:mov a,#00h              ;清寄存器
     mov b,#00h              ;清寄存器
	 mov p0,#0               ;禁止数码管显示
	 mov p2,#255             ;
	 mov p1,0ffh             ;禁止LED显示
     clr beep                ;禁止蜂鸣器
     ret                     ;返回

;********  数码管显示程序  ***************
;显示程序对应的硬件部分请注意查看图纸,由于我们使用的数码管采用的是动态扫描
;并且,段选和位选是分别使用了缓冲处理,因此,每次送出数据都需要经过两个步骤
;首先把数据放在数据总线上,然后在相应的段或者位缓冲器输出时钟端给出一个
;时钟,数据立即送出,从而达到实现了数据段位码的显示
;以后的动态显示和这里的解释一样,就不做重复解释说明。只要看懂这个程序,
;在以后的程序中也是一样的
;在实际设计当中,也可以根据我们这个设计作为参考,采用这种动态扫描的方式
;一方面可以节约线路板空间,另一方面,软件编程实现简单

pro_8led:clr sege               ;显示选中,如果是clr sege表示选中存储器
		mov b,#32                ;一共显示32个数字
		clr psw.3                ;重新设置寄存器组
		setb psw.4               ;
	
		mov r0,#00h              ;数据显示从0开始
		mov r1,#01h              ;数码管从第1个开始
   loop:mov segdata,r1           ;送出需要显示数据对应的位
        setb segb
        nop
        clr segb                 ;这个操作就是让数据输出并得到锁存
        
	   	mov a,r0                 ;准备第一个数据
		mov dptr,#tab_nu         ;获得表头
		movc a,@a+dptr           ;得到第一个数据
		
		mov segdata,a            ;输出到显示数据的段
		setb segd
		nop
		clr segd                 ;这个操作就是让数据输出并得到锁存
                
        lcall delay              ; 500 ms 延时
        lcall delay              ; 1   s  延时
        inc r0                   ;准备下一个数据
        mov a,r1                 ;准备下一位数码管
        rlc a                    ;设置下一个数码管
        jc c1                    ;8位全部显示,转移
        mov r1,a                 ;否则,设置下一位
        djnz b,loop              ;32个数没有显示完,返回显示    
        ret                      ;否则返回主程序

c1:     mov r1,#1                  ;8位显示完,重新开始循环
        clr c                    ;设置显示位
        djnz b,loop              ;32位显示完则返回重新显示
        ret                      ;否则返回到主程序
;*************  数码管显示   *******************************

;*************  软件延时 500ms  *****************************
delay:  push psw              ; 保存原来的寄存器内容
        clr psw.3             ;
		clr psw.4             ; 设置新的寄存器组
		mov r0,#2             ; 延时参数1
		mov r1,#250           ; 延时参数2 
		mov r2,#2             ; 延时参数3
    dl1:djnz r0,dl1           ; 延时循环1
    	mov r0,#250           ;
    dl2:djnz r1,dl1           ; 延时循环2
        mov r0,#240           ;
        mov r1,#248           ;
    dl3:djnz r2,dl1           ; 延时循环3
		nop                   ; 定时精度调整
		pop psw               ;  恢复原来的寄存器
        ret                   ;   返回
;**********************************************************

;**********************************************************
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推

tab_nu: 
             db 0c0h,  0f9h, 0a4h,  0b0h,  99h ,  92h ,  82h, 0f8h ; 数字0-7 不带小数点代码
             db 80h ,  90h,  88h ,  83h ,  0c6h,  0a1h,  86h, 8eh  ; 数字8-f   不带小数点代码
             db 40h ,  79h,  24h ,  30h ,  19h ,  12h ,  02h, 78h  ; 数字0-7  带小数点代码
             db 00h ,  10h,  08h ,  03h ,  46h ,  21h ,  06h, 0eh  ; 数字8-f   带小数点代码

      end             ; 

⌨️ 快捷键说明

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