单片机学习之十二:按键控制跑马灯(中断)

发布者:tetsika最新更新时间:2016-09-09 来源: eefocus关键字:单片机  按键控制  跑马灯  中断 手机看文章 扫描二维码
随时随地手机看文章
一、实验现象:

 

     二极管作左右跑马灯,当按下外部按键K0时,8个二极管全部闪烁5次后从K0按下之前的位置继续作跑马灯。

 二、实验目的

 

           掌握堆栈在中断程序中的作用

           掌握让程序保护现场的方法

三、实验任务分析:

 

有了以前各个试验的经验,相信这个试验对我们来说,难度不是很大。我们唯一接触到的新的知识点是:让程序从返回中断之前的位置继续执行跑马灯,那么如何能够让程序在进入中断之前记住当时所处的位置,在执行中断之后,能够返回这个地方继续往下执行呢?

我们可以这样作:在进入中断之前,把该时刻的程序信息放到一个地方保存下来,在返回中断之前,再到这个地方把我们存放的程序信息取出来。这样不就可以从进入中断的位置开始重新执行程序了吗?那么,这个暂存数据的地方在哪里呢?

单片机给我们考虑的很周到,允许我们从内部RAM中指定一个空间专门来作这个工作,这个空间就是堆栈。并且单片机还专门给了我们一个8位的堆栈指针,让我们用它来开辟堆栈空间。(为什么是8位呢?因为内部RAM的地址空间是256字节,所以8位就足够拉。)

例如:假如我们给堆栈指针赋值:mov sp,#70h,就表示我们把内部数据RAM的地址为70h开始的单元设为堆栈啦。

那么,我们一般把内部数据RAM的那些地方作为堆栈呢?让我们来复习一下内部RAM的结构吧。

前面我们已经说过,内部RAM共有256字节,分为两组。还记得它们各自的功能吗?高128字节是特殊功能寄存器区,我们没有办法利用,那就打低128字节的主意吧。我们再来看看低128字节的RAM空间分配。

              单片机学习之十二:按键控制跑马灯(中断) - 北极星 - 要做一粒好的种子

我们发现在低128字节中,工作寄存器区和位寻址区的地址已经分配好了,我们可以利用的只有30h~7fh的数据缓冲区了。所以我们的堆栈指针只能设在这个区域,从30h以后的范围为宜。在该程序中,我们把堆栈设在70h的位置。

好啦,知道堆栈设在哪里,下面我们就要考虑如何把程序运行的相关信息放入堆栈拉。那么,程序运行的相关信息在哪里呢?

由于在主程序中,我们让程序作左右跑马灯。还记得试验三吗,我们的左右跑马灯是通过把寄存器a中的数,通过进位标志CY(程序状态字PSW的最高位),进行左右环移来实现的。同时,由于寄存器a是单片机中最最常用的寄存器,我们在中断程序中也要用到它。为了避免中断程序改变寄存器a的值,所以我们在中断服务程序开始之前,把a的值放到堆栈中保存起来。同样我们也要把psw的值也保存起来。在返回主程序之前,再把它们取出来,这样就可以使得程序从进入中断之前的位置开始,继续作跑马灯。

把数据存入堆栈和从堆栈中取出,是通过堆栈操作指令完成的。

例如:如果想把a中的数据存入堆栈,就:push acc;如果想把a的内容从堆栈中取出,就:pop acc。(一般称之为:压入,弹出)。

还需要说明一点的是:堆栈中的数据是采用“后进先出”的结构方式处理的。就像我们摞盘子一样,最后摞进去的盘子,取得时候是最先取出的。所以我们压入数据后,再弹出的时候要特别注意顺序,后压入的要先弹出,不要弄错啦。

现在来看看这个试验的程序吧。

 四、实验程序如下:

 

  org 0000h

  ljmp start

      

  org 0013h

  ljmp ext1

      

  org 0020h

start:  clr p1.5          ;避免蜂鸣器响

  setb ea           ;CPU开中断

  setb ex1          ;允许外部中断1申请中断

  setb it1           ;设置外部中断1跳变方式触发

  mov sp,#70h       ;设置堆栈入口

      

loop1: lcall light1       ;调用左右跑马灯子程序

   ljmp loop1

 

;以下是中断服务程序

ext1: clr ea           ;关闭CPU中断

   push acc        ;把寄存器a的内容压入堆栈

   push psw        ;把程序状态字压入堆栈

   lcall keyreader    ;调用键识别子程序

pass: pop psw         ;恢复现场,注意顺序,要先弹出程序状态字

 pop acc         ;弹出寄存器a的内容,

   setb ea          ;CPU开中断

   reti             ;中断返回

 

light1:  mov a,#0ffh    ;light1是左右跑马灯子程序,大家可以参考试验三的内容 

       clr c

       mov r7,#08h

lloop:  rlc a

      mov p0,a

      lcall del100ms

      djnz r7,lloop

      

      mov r6,#06h 

rloop:  rrc a      

      mov p0,a  

      lcall del100ms 

      djnz r6,rloop

      ret

      

keyreader:  mov a,p1   ;keyreader是键识别子程序,大家可以参考试验7

          anl a,#0fh

          cjne a,#0dh,pass

          lcall del10ms

          mov a,p1

          anl a,#0fh

          cjne a,#0dh,pass

          lcall light2   ;如果确定K0按键按下,调用灯光闪烁子程序

          ret 

 

light2:   mov a,#00h    ;light2是让灯光闪烁5次的子程序

        mov r5,#10  

loop2:   mov p0,a 

        call del10ms

        cpl a         ;把a寄存器中的数据取反 

        djnz r5,loop2;

        ret

 

del10ms: mov r4,#15h   ;延时10ms子程序

del1:    mov r3,#0ffh

del2:    djnz r3,del3

         djnz r4,del1

         ret;

 

del100ms:mov r2,#0c8h ;延时100ms子程序

del3:    mov r1,#0ffh

del4:    djnz r1,del4

        djnz r2,del3

        ret

        end     

 

大家把这个程序下载到学习板上看看,会发现每次按下按键的时候,程序进入中断后,在返回的时候,会回到那个位置继续开始左右循环。这就是由于我们在进入中断的时候保护了现场的缘故。

 五、几点说明

 

主程序是左右跑马灯,其中用到了r7,r6寄存器,还调用了100ms延时,所以也用到了r2,r1寄存器。所以我们要特别注意,在中断服务程序中,要避免使用这几个寄存器。否则,就会导致在中断程序中,修改了r寄存器的内容,导致返回主程序的时候出现问题。

在中断服务程序中,用到了10ms延时程序,这个延时程序使用的寄存器是r4,r3。另外,还调用了light2子程序,其中用到了r5寄存器。所以。主程序和中断服务程序用到的寄存器r就没有冲突。

那么如果由于条件的限制,使得主程序和中断程序的寄存器的数量较多,一组8个寄存器不够,该怎么办呢?

我们也可以象保护a寄存器一样,在进入中断之后,首先把某一个在中断服务程序中也要用到的r寄存器的内容压入堆栈,在退出中断之前再弹出来。

或者我们就重新选择寄存器区吧,由于我们缺省使用的是0区的寄存器组,所以我们就改变psw程序状态字中的rs1和rs0,就可以换另外的一组寄存器区了。例如,我们在进入中断服务程序之后,写这样的两条指令:

clr rs1

setb rs0

这样,我们就用了1区的8个寄存器,这样就没有问题啦。

关键字:单片机  按键控制  跑马灯  中断 引用地址:单片机学习之十二:按键控制跑马灯(中断)

上一篇:单片机学习之十三:流水灯花样变换(中断)
下一篇:单片机学习之十一:中断方式按键

推荐阅读最新更新时间:2024-03-16 15:09

STM32中断设置相关寄存器的分析
1.中断设置使能和清除寄存器器的分析 地址 名称 描述 0xE000 E100 SETENA 设置使能中断0到31,写1将位置1,写0无作用 0xE000 E180 CLRENA 写1将位置0,禁能中断,写0无作用 __ASM void SET_CLEAR_IRQ(void) { LDR R0, =0xE000E100 MOVS R1, #0x4 STR R1, LDR R0, =0xE000E180 MOVS R1, #0x4 STR R1,
[单片机]
大学生赛车手齐聚奥运馆 智取瑞萨MCU车王桂冠
比赛赛道不到决赛最后一刻亮相,都是“最高机密”;参赛选手不仅是能修车的组装高手,还是擅长编程的万能程序员;比赛现场的惊险程度不亚于真实的山地竞技、沙漠越野。11月14日,这场针对大学生的高水平“极品飞车”——2010瑞萨超级MCU模型车大赛在中国农业大学奥运馆开赛,170支参赛队激烈角逐后,来自华中科技大学的华中科技大学一队以23秒01的成绩蝉联冠军,摘得了本年度的“车王”桂冠。 作为我国规模最大的大学生技能活动——“全国大学生IT&AT技能大赛”的系列赛事之一,瑞萨超级MCU模型车大赛由教育部教育管理信息中心主办,赛迪顾问承办,整个大赛得到了全球领先的半导体供应商日本瑞萨电子株式会社及在华全资子公司瑞萨电子(中国
[单片机]
单片机智能集群控制消防应急指示灯设计
  传统的消防应急标志灯有一个致命缺陷,就是它只能指示一个固定的逃跑方向,一般是指向最近的安全门,但是这样会出现很多不利情况:如果指示的前方发生火灾或正是烟雾蔓延过来的方向,或安全门由于故障而不能自动开启,或建筑内的消防应急灯在平时没能实时维护,在危机情况出现故障时,消防应急标志灯失去了应有的作用,所以目前应用的传统消防应急灯有很大的局限性。对此我们设计出一种新型的智能应急逃生指示终端,能够实时报告设备状况,在险情发生时自动将危险信息传送到各个终端,照明终端自动打开,指示智能终端根据险情自动计算出合理的逃生方向。   1 智能消防应急逃生指示与管理维护系统的组成   智能应急逃生指示系统包括智能终端(智能应急照明灯、智能应急指
[单片机]
<font color='red'>单片机</font>智能集群<font color='red'>控制</font>消防应急指示灯设计
GPS精密授时功能的应用
1 引言   电力系统中的功角稳定性、电压稳定性、频率动态变化及其稳定性是相互诱发、相互关联的,其中,发电机功角状况是电力系统运行的主要状态变量.也是系统稳定运行的标志。因此,实时测量发电机的功角是电力系统稳定监视和控制的关键。   电力系统内部各送端、受端的分布广泛而分散,若在各端安装一台GPS接收机,则GPS的全球性和高精度就能保证各地时间信号与UTC的相对误差都不超过lμs。这种全球范围内的高精度时间同步在电力系统检测和测量中具有极高的利用价值。文中设计了基于GPS的功角测量装置,可通过GPS接收板提供的秒脉冲和其时间标记来进行异地同步数据采集,实践证明其效果很理想。 2 GPSOEM接收GPS标准时间 2.1 GPS O
[网络通信]
自制AVR单片机解锁器
用AVR单片机的2MHz的无源石英晶体和6反相器74HC04,加上几个1/4W色环电阻就可以做成矩形波发生器。下图是74HC04的引脚分布图。 如上下图所示。74HC04的14脚为电源引脚,接正5V直流电源,第7脚接5V直流电源负极。在本设计中利用74HC04的头三个反相器构成矩形波发生器。 下图解锁器电路原理图。 下图中,标号为U1A的74HC04的第1个反相器输入输出端并联上一个1MQ的1/4W电阻和一个2M的2脚石英晶体。2个22pF的瓷片电容C1和C2用来微调石英晶体的频率。U1C是输出反相器,为了保证波形比较完整,在输出端接一个2K欧姆的上拉电阻。 如果碰到AVR单片机自己锁死的情况。只要将该电路接5V直
[单片机]
自制AVR<font color='red'>单片机</font>解锁器
TI 超低功耗MCU与RF芯片组助力InnerWireless实现精确至房间的实时定位
定位系统帮助医疗机构通过高效使用设备节省时间,降低成本,提高安全性 2007 年 12 月 3 日,北京讯 日前,InnerWireless 公司宣布其将在实时定位系统 (RTLS) 中采用基于德州仪器 (TI) MSP430 MCU 的无线芯片组,从而突现了超低功耗控制与 RF 技术在资产管理中的高效性。InnerWireless Vision Platform 建立在 802.15.4 RF 传输与 ZigbeeTM 协议的基础之上,可广泛应用于各种建筑物的网络建设中,其中包括医院、旅馆、工厂及其它目标行业,实现了 RTLS 的低成本与易用性的完美结合。该系统使医疗机构(如医院)能够立即识别设备所在房间,缩短搜索与响应时间
[焦点新闻]
AT89C51单片机与74LS164动态显示接口
AT89C51介绍 AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。 AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。 单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了
[单片机]
AT89C51<font color='red'>单片机</font>与74LS164动态显示接口
一文读懂汽车控制芯片(MCU
本文从工作要求,性能要求,产业格局,行业壁垒四个维度,分别介绍车身、底盘、动力、座舱四个域的 MCU 芯片 。并整理了国产MCU芯片的应用现状,供从业者参考。 1.控制类芯片介绍 控制类芯片主要就是指MCU(Microcontroller Unit),即微控制器,又叫单片机,是把CPU的主频与规格做适当缩减,并将存储器、定时器、A/D转换、时钟、I/O端口及串行通讯等多种功能模块和接口集成在单个芯片上,实现终端控制的功能,具有性能高、功耗低、可编程、灵活度高等优点。 车规级MCU示意图 汽车是MCU的一个非常重要的应用领域,据 IC Insights数据,2019年全球MCU应用于 汽车电子 的占比约为33%。高端车
[汽车电子]
一文读懂汽车<font color='red'>控制</font>芯片(<font color='red'>MCU</font>)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved