实验八 数码管LED实验报告

苏州大学实验报告
院、系        年级专业     姓名    学号     
课程名称                      成绩     
指导教师         同组实验者      实验日期     
实验名称:    数码管LED实验           
一.实验目的
  理解8段数码管的基本原理,理解8段数码管的显示和编程方法,理解4连排共阴极8段数码管LG5641AH与MCU的接线图。                                           
二.实验内容
  理解8段数码管原理,运行与理解各子程序,编制一个4连排8段数码管程序,MCU的PTA7-PTA4接各LED的位选线(自左到右),PTB7-PTB0接LED的数据线hgfedcba,在4连排8段数
码管显示MCU复位后的开始到现在的运行时间。由于只有四个数码管,所以只显示MCU运行到目前为止的分钟和秒,当计时达到一个小时,就重新从00:00开始计时。另外,也可以通过PC方的串口通信程序,指定计时的开始值。             
三.实验过程
(一)原理图
图8-2数码管外形
图8-1 数码管
(二)接线图
图8-3 MCU与4连排8段数码管的连接
(三)基本原理
  8段数码管一般由8个发光二极管(Llight-emitting diode,LED)组成,每一个位段就是一个发光二极管。一个8段数码管分别由a、b、c、d、e、f、g位段,外加上一个小数点的位段h(或记为dp)组成。根据公共端所接电平的高低,可分为共阳极和共阴极两种。有时数码管不需要小数点,只有7个位段,称7段数码管。共阴极8段数码管的信号端高电平有效,只要在各个位段上加上相应的信号即可使相应的位段发光,比如:要使a段发光,则在a段加上高电平即可。共阳极的8段数码管则相反,在相应的位段加上低电平即可使该位段发光。                                                                         
四.编程
(一)流程图
  图8-4 数码管LED显示流程图(及其中断子程序)
(二)所用寄存器名称及其各个位
程序中没有使用与LED显示相关的控制和状态寄存器,仅仅使用了通用I/O口A口和B口。
(三)主要代码段
1.汇编方式:
数码管LED显示的主程序部分代码
……
MainInit::                    //复位后程序从此开始执行
    //系统初始化
    SEI                      //关中断
    //1.堆栈初始化为RAM最高端
    LDHX #RAMEndAddr      //HX=#RAMEndAddr
    TXS                    //HX-1->SP
    //2.系统初始化
    JSR  MCUInit            //初学时跳过此处
    //3.串行口初始化
    JSR  SCIInit
    //4.定时器1初始化
    JSR  Timer1Init          //调定时器1初始化子程序
   
    BSET #5,SCC2            //设置接收中断允许
    CLI                    //开中断
    //LED口初始化
    LDA  #0xff
    STA  LEDdata_D          //数据口为输出到LED
    STA  LEDcs_D            //位选口为输出到LED
    //给Time[0-2]"时分秒"赋初值0、0、0        (?多一个0-1即可)
    LDA  #$0
    STA  Time
    STA  Time+1
    STA  Time+2
    //程序总循环入口
MainLoop:
    //LEDbuf[0-3]中放入要显示的数字
    //分
    LDA Time+1
    CLRH
    LDX #10
    DIV
    STA LEDbuf
    PSHH
    PULA
    STA LEDbuf+1
    //秒
    LDA Time+2
    CLRH
    LDX #10
    DIV
    STA LEDbuf+2
    PSHH
    PULA
    STA LEDbuf+3
    //在4位共阴极LED上显示LEDbuf中的4个数据(只允许0-9)
    MOV #%11111110,I1    //初始位选信号(共阴极情况)
    //MOV #4,I2            //显示个数
    AIS #-1
    LDA #4
    STA 1,SP
    LDHX #LEDbuf
LEDShow:
    PSHH                  //保护数据地址
    PSHX
    LDX ,X                //数据
    LDA I1                //位选信号
    JSR LEDShow1        //显示一个数据
    LDA I1                //变动位选信号
    SEC
    ROLA
    STA I1
    //延时
    LDHX #10
    JSR Delay_ms
    PULX                //恢复数据地址
    PULH
    AIX #1              //指向下一个数据
    DBNZ 1,SP,LEDShow
    AIS #1
    JMP  MainLoop
……
数码管LED显示的中断子程序部分代码
……
//Timer1Int:定时器1溢出中断子程序----------------------*
//功能:给内存单元Time[0-2](时分秒)赋值          *
//入口:无                                      *
//出口:无                                      *
//--------------------------------------------------------------------*
Timer1Int::
    SEI                  //关总中断
    PSHH                //保护H
    INC  Time+2          //秒数加1
    LDA  Time+2
    CMP  #60
    BNE  Timer1Int_1      //秒数未增加到60,转
    LDA  #0              //秒数增加到60,清0
    STA  Time+2
    INC  Time+1          //分钟数加1
    LDA  Time+1
    CMP  #60
    BNE  Timer1Int_1      //分钟数未增加到60,转
    LDA  #0              //分钟数增加到60,清0
    STA  Time+1
    INC  Time            //小时数加1
    LDA  Time
    CMP  #24
    BNE  Timer1Int_1    //小时数未增加到24,转
    LDA  #0            //小时数增加到24,清0
    STA  Time
Timer1Int_1:
    LDA  T1SC
    BCLR  #TOFBit,T1SC  //清除定时器溢出标志位
    PULH                //恢复H
    CLI                  //开总中断
喋血黑谷
体外诊断    RTI
//SCIRecINT:SCI接收中断子程序---------------------------*
//功能:接收3字节基准时分秒放入内存单元Time[0-2] *
//入口:无                                      *
//出口:Time[0-2]                                *
//---------------------------------------------------------------------*
SCIRecINT::
    SEI                  //关总中断
    PSHH                //保护H
    LDA  #$03
    LDHX #Time
    JSR  SCIReN          //接收3字节数据
    PULH                //恢复H
    CLI                  //开总中断
    RTI                  //中断返回
……
2.C语言方式:
数码管LED显示的主程序部分代码
……
//主函数
void main()
    INT8U i,j;
    DisMCUInt();      //禁止总中断
    MCUInit();        //芯片初始化
    SCIInit();        //串行口初始化
    Timer1Init();      //定时器初始化
    EnSCIReInt();      //开放SCI接收中断
    EnT1OverflowInt(); //开放Timer1溢出中断
    T1SC &= ~(1<<TSTOPBit);  //允许定时器1计数
    EnMCUInt();        //开放总中断
职高数学   
    LEDdata_D = 0xff;      //数据口为输出
    LEDcs_D = 0xff;        //位选口为输出
   
    //给时分秒赋值初始化
    time[0] = 0;                    //时
    time[1] = 0;                    //分
    time[2] = 0;                    //秒
雷锋精神伴我成长
    while(1)
    {
        //LED显示分和秒
winkie        LEDShowNum(0,time[1] / 10);
        for(j=0;j<250;j++);          //延时
        LEDShowNum(1,time[1] % 10);
听诊器古今谈        for(j=0;j<250;j++);          //延时
        LEDShowNum(2,time[2] / 10);
        for(j=0;j<250;j++);          //延时
        LEDShowNum(3,time[2] % 10);
        for(j=0;j<250;j++);          //延时
    } 
}

本文发布于:2024-09-23 10:15:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/173622.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数码管   显示   中断   位段   程序   数据   理解
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议