Freescale MC9S08AW60汇编学习笔记(七)

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

  

org $0070
num ds.b 1
count1 ds.b 1
count2 ds.b 1

org $1860
re_cycle:
  mov #70T,num
  dbnz num,*
  rts
delay_10ms:
  mov #78T,count1
re_call:
  bsr re_cycle
  dbnz count1,re_call
  mov #07T,count1
  dbnz count1,*
  rts

delay_500ms:
  mov #50T,count2
re:
  bsr delay_10ms
  dbnz count2,re
  rts

main:
  bset 5,PTFD                ;初始化PTF5
  bset 5,PTFDD              ;将PTF5设置为输出
again:
  bclr 5,PTFD                 ;点亮核心子板上的蓝色led
  bsr delay_500ms        ;延时
  bset 5,PTFD                ;熄灭核心子板上的蓝色led
  bsr delay_500ms
  jmp again

org $fffe
 dc.w main

  这个程序大部分我们都是了解过的,所不熟悉的就是对PTFD的操作,我们所需要记住的是:点亮开发板上的灯就是对MCU的端口发送相应的数据,因为led灯是共阳极的,所以数据为‘0’时点亮,为‘1’时熄灭。当然,在使用某个端口之前不要忘记对该端口进行初始化,也就是将其设为输出,并设置初始状态为熄灭。解释一下:bset即置‘1’,bclr即置‘0’。对方向来说:‘1’为输出,‘0’为输入;对小灯的点亮与否来说:‘1’为熄灭,‘0’为点亮。

  既然我们可以点亮一颗小灯,我们当然也能点亮许多小灯,如果我们点亮的是七段led数码管上的小灯,这是不是就意味着我们可以在七段led数码管上显示出1、2、3、4、5.......之类的数字或者a、b、c......之类的字母。例子如下:在4个数码管上同时显示0123。

INCLUDE MC9S08AW60.inc
 org $0070
seg ds.b 1
num ds.b 1
count ds.b 1

org $1860
table:                                      ;共阳极的七段数码管的段码表
  dc.b $c0,$f9,$a4,$b0        ;0123的字形码

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

main:
  clrx
  clrh
  clra
  sta $1802                          ;禁止掉COP,否则程序运行时间长了会发生COP复位
  jsr io_init
  mov #$fe,seg                    ;设置位选
again:
  clrh
  lda table,x                           ;查表得出字形码

  sta PTBD                             ;点亮七段led数码管
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  mov seg,PTGD

  jsr delay_1ms                      ;延时
  mov #$ff,PTGD                    ;熄灭led

  lda seg                                 ;改变位选
  sec                                       ;1-->C
  rola                                       ;将A中数据和标志位C一同左移一位
  sta seg

  incx
  cpx #$4                                ;判断是否结束并开启下一轮循环
  bne next
  clrx
  mov #$fe,seg
next:
  jmp again

org $fffe
 dc.w main

  为了实现1234同时显示在七段led数码管上,我们采用动态显示方式,即瞬间只点亮一个数码管,延时后再点亮下一个数码管,如此不停的循环显示,利用人眼视觉暂留效应,打到同时显示的效果。此外,我精心设计出了一个实现1234滚动显示的程序,如下:

INCLUDE MC9S08AW60.inc
 org $0070
seg ds.b 1
num ds.b 1
count ds.b 1
count2 ds.b 1
sum ds.b 1
sum1 ds.b 1

org $1860
table:
  dc.b $c0,$f9,$a4,$b0,$ff

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

delay_10ms:
  mov #78t,count
re: bsr re_cycle
  dbnz count,re
  mov #07t,count
  dbnz count,*
  rts

delay_500ms:
  mov #50t,count2
  re1:bsr delay_10ms
  dec count2
  ldx count2
  cpx #$00
  bne re1
  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

main:
  clrx
  clrh
  clra
  sta $1802
  jsr io_init
  mov #$00,sum
  mov #$00,sum1
  mov #$fe,seg
again:
  ldx sum
  cpx #$5
  bne ne
  mov #$00,sum

ne: clrh
  ldx sum
  lda table,x

  sta PTBD
  lsra
  lsra
  lsra
  lsra
  sta PTDD
  mov seg,PTGD

  jsr delay_500ms
  mov #$ff,PTGD

  lda seg
  sec
  rola
  sta seg

  inc sum

  inc sum1
  ldx sum1
  cpx #$4
  bne next
  mov #$00,sum1
  mov #$fe,seg
next:
  jmp again

org $fffe
 dc.w main

  实现这个程序的主要思路是:位选依然在4个数码管之间循环,而点亮数码管的字形码则在加了一个不显示选项的段码表之间循环,由此形成的错位打到滚动显示的效果。

时间: 2024-11-03 21:11:18

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汇编学习笔记(八)

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

Freescale MC9S08AW60汇编学习笔记(四)

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

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存放数

第十七篇:博采众长--初探WDDM驱动学习笔记(七)

基于WDDM驱动的DirectX视频加速重定向框架设计与实现 现在的研究生的论文, 真正质量高的, 少之又少, 开题开得特别大, 动不动就要搞个大课题, 从绪论开始到真正自己所做的内容之间, 是东拼西凑地抄概念, 抄公式, 达到字数篇幅的要求, 而自己正真做了什么, 有哪些实际感受, 做出的内容, 相比前面的东拼西凑就几点内容, 之后就草草结束, 步入感谢的段落. 原因不光只有学生自己, 所谓的读研, 如果没有一个环境, 学生有再大的愿望, 再强的毅力, 到头来也只是空无奈. 有些导师要写书,

马哥学习笔记七——LAMP编译安装之MYSQL

1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录. 2.新建用户以安全方式运行进程: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data 3.安装并初始化my