您的位置:首页单片机51单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

51单片机数码管动态显示程序

[日期:2008-07-08 ] [来源:net 作者:佚名] [字体: (投递新闻)

// 单片机数码管动态显示程序实验,
  数码管显示一般分静态显示及动态显示两种驱动方式,静态显示占用口线比较多,本文介绍的是如何实现数码管动态显示,应该说数码管动态显示是单片机外部指令输出的重要途径,因此如何设计数码管以及数码管的工作原理、数码管显示的方法、数码管显示的抗干扰设计等在单片机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种数码管动态显示的工作原理与读取方式。  
 
        s1     bit  p0.0        ;数码管位定义
        s2     bit  p0.1
        s3     bit  p0.2
        s4     bit  p0.3
        s5     bit  p0.4
        s6     bit  p0.5
        s7     bit  p0.6
        s8     bit  p0.7

 led_data   equ  p2      ;数码管数据定义

 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:
 MOV b,#32                ;一共显示32个数字
 clr psw.3                ;重新设置寄存器组
 setb psw.4               ;

 MOV r0,#00h              ;数据显示从0开始
 MOV r1,#01h              ;数码管从第1个开始
   loop:MOV p0,r1                ;点亮当前数码管
    MOV a,r0                 ;准备第一个数据
 MOV dptr,#tab_nu         ;获得表头
 MOVc a,@a+dptr           ;得到第一个数据
 MOV led_data,a           ;输出到显示数据口
               
        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  

 

 
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告