Freescale MC9S08AW60汇编学习笔记(八)

  能够实现用七段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

时间: 2024-10-05 04:45:08

Freescale MC9S08AW60汇编学习笔记(八)的相关文章

Freescale MC9S08AW60汇编学习笔记(整理)

MC9S08AW60是HCS08系列的MCU,它是8位的MCU,由HCS08核加上存储器和外围模块构成.HCS08系列的MCU除了MC9S08AW系列之外还有MC9S08GB系列.MC9S08GT系列.MC9S08AC系列等.不同型号的MCU应用领域的侧重点不同. HCS08系列的MCU就只有5个寄存器:A.H:X.SP.PC.CCR.分别是8位.16位.16位.16位.8位.具体功能要在使用中掌握.MC9S08AW60的主频为4MHz,一个总线周期为T=0.25us.MC9S08AW60存放数

Freescale MC9S08AW60汇编学习笔记(五)

前面学习了查表的功能,可以用查表的功能实现不少强大的功能,如查立方表.平方表.函数表.数码管显示的段码表等.这里还有一种由查表和转移指令配合使用而实现的一种强大的功能:散转.散转是指根据输入数据的不同来跳转到不同的程序入口进行处理,也就是说如果有多个子程序,我们不仅可以让它们按顺序一个个执行,还可以根据做判断用的数据的值来决定跳转到哪一个子程序.实现散转的具体做法是:在程序中定义一块连续存储单元作为跳转表,表中顺序存放各分支处理程序的跳转地址.各跳转地址在表中的偏移地址等于跳转表首地址加上它们各

Freescale MC9S08AW60汇编学习笔记(四)

面对复杂的程序,我们不能都放入main主程序之中,那样会让人思路不够清晰,于是我们加入了子程序,这样程序就有了条理.主程序决定我们的思路,子程序则实现具体的功能.如果程序没有达到预想中的效果,就可以有条有理的进行分析,这在编写汇编程序时是很重要的,毕竟汇编语言不像c语言.c++.java等高级语言贴近人类语言.汇编语言的优势在于执行效率,可以用于程序的优化.为了让程序更加强大,我们给程序加入查表的功能,利用查表可以实现转换.计算等各种功能. 例子:将单字节变量Hex_Byte中存放的十六进制数转

Freescale MC9S08AW60汇编学习笔记(七)

之前我们写了延时的子程序,但是仅仅在电脑上运行,在CodeWarrior中调试根本给不了延时所实现的直观效果,也就是说程序运行到哪里但我们却无法直观地得出发生了延时的效果,所以我们要把这个延时的程序用出去,比如点亮一盏led灯,让它延时我们规定的时间后熄灭,然后再点亮再熄灭......这里我们使用清华版的MC9S08AW60开发板来验证延时的效果.对于开发板的使用和烧写请多看看数据手册和使用说明.我们直接给出验证延时的代码: org $0070num ds.b 1count1 ds.b 1cou

Freescale MC9S08AW60汇编学习笔记(六)

延时,汇编中经常要用到的功能,也就是MCU什么也不做,仅仅是拖延一段时间而已.MCU本身就有定时器.计数器,用来实现延时当然不在话下,但是一个编程的人自然更希望要实现的功能更加易于掌控,我们就用代码.用程序来实现延时,也就是采用软件进行延时.具体做法是:通过A.H:X增减指令.空操作指令nop和brn以及相应的转移指令,再利用循环结构就可以实现延时功能.既然是延时,能知道延时多长时间最好了,我们知道的是:MCU总线时钟频率为4MHz,所以一个总线周期占用的时间为0.25us,这样,只要知道每条指

Freescale MC9S08AW60汇编学习笔记(三)

前面给出了一个实现加法的小程序,但是如果要求变得更复杂.步骤变得更繁琐,这时又该怎么办呢??我们可以使用子程序来解决这个问题,这里给个例子:若字变量Data1和Data2分别存放着两个16位无符号数,编写求两个数之和的子程序,并将和存放到Sum字节存储空间中.代码如下: org $0070data1 ds.b 2data2 ds.b 2sum ds.b 3 org $1860Add_Pro: clc        ;清空进位标志位 clrx clrh clra mov #$00,data1 mo

Freescale MC9S08AW60汇编学习笔记(一)

MC9S08AW60是HCS08系列的MCU,它是8位的MCU,由HCS08核加上存储器和外围模块构成.HCS08系列的MCU除了MC9S08AW系列之外还有MC9S08GB系列.MC9S08GT系列.MC9S08AC系列等.不同型号的MCU应用领域的侧重点不同. HCS08系列的MCU就只有5个寄存器:A.H:X.SP.PC.CCR.分别是8位.16位.16位.16位.8位.具体功能要在使用中掌握.MC9S08AW60的主频为4MHz,一个总线周期为T=0.25us.MC9S08AW60存放数

angular学习笔记(八)

本篇介绍angular控制视图的显示和隐藏: 通过给元素添加ng-show属性或者ng-hide属性来控制视图的显示或隐藏: ng-show: 绑定的数据值为true时,显示元素,值为false时,隐藏元素 ng-hide: 绑定的数据值为true时,隐藏元素,值为false时,显示元素 (其实只要用到其中一个就可以了) 下面来看个简单的例子,点击按钮可以显示/隐藏元素: <!DOCTYPE html> <html ng-app> <head> <title>

AT&amp;T汇编学习笔记

AT&T汇编和intel汇编的区别 (1)在Intel格式中大多使用大写字母,而在AT&T格式中都是用小写字母. (2)在AT&T格式中,寄存器名要加上"%"作为前缀,而在intel格式中则不带前缀. (3)在AT&T的386汇编语言中,指令的源操作数与目标操作数的顺序与在intel的386汇编语言中正好相反.在intel格式中是目标在前,源在后:而在AT&T格式中则是源在前,目标在后.例如,将寄存器eax的内容送入ebx,在intel格式中为&