历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2021年04月07日 | Freescale MC9S08AW60汇编学习笔记

2021-04-07 来源:eefocus

能够实现用七段led数码管显示出数字和字母、让它们同时显示甚至于滚动显示,这些功能已经很不错了,但是这样还不够,我们还想实现更准确的控制,让数码管按照我们的想法来显示,而不是呆板的循环,这样我们引入中断的想法。也许其他人会从查询和中断的关系这些地方来引出中断,但是我还是倾向于从控制的观点来引出中断,毕竟中断也是实现更直观的人为控制的方法,程序的运行变得可以加入人的意愿来执行,如果我们要让程序进入某一个中断程序,那么给主程序发一个中断,让它跳到中断子程序中运行就行了;我们不发中断,中断子程序就不会执行。还是用七段led数码管来演示,我们没发一个中断信号,数码管就在0~9之间变化一下。代码如下:


 INCLUDE MC9S08AW60.inc

 org $0070
IRQ_Count ds.b 1


 org $1860
tab: dc.b $c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90,$88,$83,$a7,$a1,$86,$8e

io_init:
  mov #$00,PTBD
  mov #$00,PTDD
  mov #$ff,PTGD
  lda #%11111111
  sta PTBDD
  sta PTDDD
  sta PTGDD
  sta PTBDS
  sta PTDDS
  sta PTGDS
  rts


IRQ_init:                                  ;IRQ模块初始化
  mov #$00,IRQ_Count
  lda #%00010010
  sta IRQSC                          ;IRQ功能允许,仅下降沿触发,允许中断
  rts


IRQ_ISR:                                ;中断子程序
  inc IRQ_Count                   ;该中断子程序主要实现的功能:累加中断次数
  bset 2,IRQSC                    ; 向IRQACK位写1以清零IRQF
  rti                                     ;中断返回


main:clra
  clrx
  clrh

  jsr io_init
  sta SOPT                           ;禁止COP
  jsr IRQ_init
  cli                                      ;开总中断           
  mov #$00,IRQ_Count

again:
  clra
  clrx
  clrh

  ldx IRQ_Count
  lda tab,x

  sta PTBD
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  mov #$f7,PTGD

  cpx #$10
  bne next

  mov #$00,IRQ_Count

  next:jmp again


 org $fffa
 dc.w IRQ_ISR                             ;IRQ中断向量

 org $fffe
 dc.w main

  该程序就是加入了中断之后的,关于中断的一些说明可以参看下图:

  接着给出按16进制累加(255以内)显示的程序:

 INCLUDE MC9S08AW60.inc

 org $0070
IRQ_Count ds.b 1
num ds.b 1
count ds.b 1

org $1860
tab: dc.b $c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90,$88,$83,$a7,$a1,$86,$8e


re_cycle:
  mov #70t,num
  dbnz num,*
  rts
delay_1ms:
  mov #08t,count
re_call:
  bsr re_cycle
  dbnz count,re_call
  rts

  io_init:
  mov #$00,PTBD
  mov #$00,PTDD
  mov #$ff,PTGD
  lda #%11111111
  sta PTBDD
  sta PTDDD
  sta PTGDD
  sta PTBDS
  sta PTDDS
  sta PTGDS
  rts


IRQ_init:
  mov #$00,IRQ_Count
  lda #%00010010
  sta IRQSC
  rts


IRQ_ISR:
  inc IRQ_Count
  bset 2,IRQSC
  rti


main:clra
  clrx
  clrh

  sta $1802
  jsr io_init
  sta SOPT
  jsr IRQ_init
  cli
  mov #$00,IRQ_Count

again:
  clra
  clrx
  clrh

  lda IRQ_Count
  ldx #16t
  div
  pshh
  clrh
  clrx
  tax
  clra
  lda tab,x

  mov #$fb,PTGD
  sta PTBD
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  jsr delay_1ms
  mov #$ff,PTGD

  clrx
  clrh
  clra
  pula
  tax

  clrh
  lda tab,x


  sta PTBD
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  mov #$f7,PTGD
  jsr delay_1ms
  mov #$ff,PTGD

  jmp again


 org $fffa
 dc.w IRQ_ISR

 org $fffe
 dc.w main

  思路是这样的:我们要显示的是中断的次数,也就是将中断的次数用16进制显示出来,我们将中断的次数提取出来,用它除以16,得到商和余数,商就作为高位,我们找到其字形码显示到数码管中,余数作为低位,并做相同的处理。这样我们就实现了16进制显示中断次数。注意一点,我们先处理商后处理余数,因为如果扩大显示的范围,先处理余数时也要做除法,比如将上面的例子改为用10进制显示范围还是0~255,当然这里完全可以做到0~999,我们将中断次数除以100后商可以直接处理,而余数还得除以10之后分为商和余数来处理。代码如下:

 INCLUDE MC9S08AW60.inc

 org $0070
IRQ_Count ds.b 1
num ds.b 1
count ds.b 1

 org $1860
tab: dc.b $c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90,$88,$83,$a7,$a1,$86,$8e


re_cycle:
  mov #70t,num
  dbnz num,*
  rts
delay_1ms:
  mov #08t,count
re_call:
  bsr re_cycle
  dbnz count,re_call
  rts

io_init:
  mov #$00,PTBD
  mov #$00,PTDD
  mov #$ff,PTGD
  lda #%11111111
  sta PTBDD
  sta PTDDD
  sta PTGDD
  sta PTBDS
  sta PTDDS
  sta PTGDS
  rts


IRQ_init:
  mov #$00,IRQ_Count
  lda #%00010010
  sta IRQSC
  rts


IRQ_ISR:
  inc IRQ_Count
  bset 2,IRQSC
  rti


main:clra
  clrx
  clrh

  sta $1802
  jsr io_init
  sta SOPT
  jsr IRQ_init
  cli
  mov #$00,IRQ_Count

again:
  clra
  clrx
  clrh

  lda IRQ_Count
  ldx #100t
  div
  pshh
  clrh
  clrx
  tax
  clra
  lda tab,x

  mov #$fd,PTGD
  sta PTBD
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  jsr delay_1ms
  mov #$ff,PTGD

  clrx
  clrh
  clra
  pula
  ldx #10t
  div
  pshh
  clrh
  clrx
  tax
  clra
  lda tab,x

  mov #$fb,PTGD
  sta PTBD
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  jsr delay_1ms
  mov #$ff,PTGD

  clrx
  clrh
  clra
  pula
  tax
  lda tab,x


  sta PTBD
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  mov #$f7,PTGD
  jsr delay_1ms
  mov #$ff,PTGD

  jmp again


 org $fffa
 dc.w IRQ_ISR

 org $fffe
 dc.w main


推荐阅读

史海拾趣

Artaflex公司的发展小趣事

创新是Artaflex公司持续发展的核心动力。公司不断投入研发资金,加强技术创新和新产品开发。通过不断推出具有创新性和竞争力的产品,公司不仅满足了市场的多样化需求,也赢得了客户的信任和好评。同时,公司还注重人才培养和团队建设,为公司的长期发展奠定了坚实的基础。

BK Precision公司的发展小趣事

为了满足全球市场的需求,BK Precision开始实施全球化战略。公司不仅在美国本土设立了多个办事处和研发中心,还在欧洲和亚洲等地建立了分支机构。通过与国际授权分销商的合作,BK Precision成功地将产品推向全球市场,并赢得了众多国际客户的信赖。同时,公司还积极参与国际电子行业的展会和交流活动,提升品牌知名度和影响力。

Beck IPC GmbH公司的发展小趣事

随着技术的不断成熟和市场需求的扩大,Beck IPC开始寻求新的业务领域。公司凭借在嵌入式通讯领域的深厚积累,成功拓展至机器到机器(M2M)通讯和工业物联网(IIoT)解决方案领域。同时,公司积极开拓国际市场,与多个国家和地区的合作伙伴建立了紧密的合作关系。通过引进国际先进技术和理念,Beck IPC不断提升自身实力,逐渐在全球范围内树立起良好的品牌形象。

Blue Giga公司的发展小趣事

2015年,Silicon Labs(芯科科技有限公司)宣布收购Blue Giga。这一收购对于双方来说都是一个重要的里程碑。Silicon Labs通过收购获得了Blue Giga的先进技术和广泛的产品线,进一步增强了其在物联网和无线连接领域的竞争力。而Blue Giga则借助Silicon Labs的全球资源和市场渠道,实现了更快速的发展。

登丰微(GSTEK)公司的发展小趣事

歌普电子深知技术创新的重要性,因此不断加大在研发方面的投入。公司拥有一支卓越的研发团队,能够设计出先进而成熟的产品方案,并配备了精密模具制造、高速连续冲压等先进生产设备。这些努力使得歌普的产品不仅获得了多项国际安全认证及外观设计专利,还成功与国际品牌连接器相兼容。随着产品的不断优化和升级,歌普的产品远销全球多个工业国家及地区,赢得了良好的国际声誉。

Heimann Optoelectronics Gmbh公司的发展小趣事

Hei Inc Optoelectronic Division的崛起始于一次关键的技术创新。在2010年代初,随着光纤通信技术的快速发展,公司对光电子器件的研发投入不断加大。经过数年的努力,研发团队成功开发出了一种新型的高速光探测器,该探测器在灵敏度和响应速度上均远超市场同类产品。这一技术创新不仅为公司赢得了多项国际专利,还迅速吸引了全球通信巨头的关注,成为公司迅速发展的转折点。随着订单量的激增,Hei Inc Optoelectronic Division迅速扩大了生产规模,并在行业内建立了领先地位。

问答坊 | AI 解惑

PCB设计中可能遇到的问题及解答

问题: Query:在从原理图更新到PCB的时候,如何保持原有器件的布局? 在Protel中,通常都会遇到需要修改原理图时,如何保持原有PCB板中器件的布局的问题。下面讲述一种有效的方式就是在PCB编辑窗口中使用菜单命令Project » Component Links来完成 ...…

查看全部问答>

创建Windows CE操作系统(二)

之前介绍过如何创建一个基本的Windows CE的平台,现在咱就上一次没有提到的部分进行一下补充定制并build OS。 首先,在VS2005 IDE中的View -> Other Windows -> Catalog Items中,添加或者删除相应的模块来完成OS定制,选项如下: 然后配置buil ...…

查看全部问答>

模拟乘法器(checked)

本帖最后由 辛昕 于 2018-4-8 22:59 编辑 关于这个东西,我后来其实从来没捡起过。 但是,也就没有必要惦记着了。 当然了,每次说到这个东西,都会想起,故人已去~ 在做运放的过程中,知道了一个叫做模拟乘法器的东西。 但是想上网看看这个东 ...…

查看全部问答>

calibrate_delay 的头文件是什么

嵌入式开发,Linux系统,是可以在驱动里面调用calibrate_delay 这个函数的吧 不知道需要包含什么头文件…

查看全部问答>

我的移动硬盘使用时,怎么显示:"本地磁盘"啊?

求救:     我的移动硬盘使用时,怎么显示:\"本地磁盘\"啊?     而且打不开! 谁知道 怎么解决? 谢谢!!!…

查看全部问答>

Windows CE 5.0的ARMV4I补丁求种

Windows CE 5.0的ARMV4I补丁,名称如下:    WinCEPB50-051231-Product-Update-Rollup-Armv4I.msi    WinCEPB50-060131-2006M01-Armv4I.msi    WinCEPB50-060228-2006M02-Armv4I.msi    WinCEPB50-06 ...…

查看全部问答>

wince下的CMMB播放程序

谁有这样的程序,急求,可以和我联系. email:gcgaoxj@yahoo.com [ 本帖最后由 dreaming123 于 2011-3-16 21:42 编辑 ]…

查看全部问答>

刚刚看到可以用:用社区芯币兑换51开发板PCB板!

刚刚看到可以用:用社区芯币兑换51开发板PCB板!早知道在这里换了,自己花了150快大洋买了一个 能不能用社区芯币兑换ARM的开发板呢…

查看全部问答>

microblaze的一些问题探讨下

请问有没有建立工程的教程,我按照官方网站的教程建立,(用的是ise13.1), 各种无奈啊,遇到的问题: 1、头文件的处理,我把用到的头文件拷到板级包的include文件夹,开始时可以,但是后面工程关闭,又出现 没找到头文件,那不是又得拷贝一次, ...…

查看全部问答>

【信号处理】一种雷达通用信号处理系统的实现与应用

摘要:鉴于FPGA和DSP各自的优势,FPGA+DSP信号处理架构,已成为信号处理系统的常用结构。但目前此结构处理平台功能固定、通用性差,或对平台的介绍缺乏具体实现。文中针对以上两点提出一种通用信号处理系统。该系统不仅将两种处理器的优点集于一身 ...…

查看全部问答>