历史上的今天
返回首页

历史上的今天

今天是:2025年08月13日(星期三)

正在发生

2021年08月13日 | Freescale MC9S08AW60汇编学习笔记(七)

2021-08-13 来源:eefocus

  之前我们写了延时的子程序,但是仅仅在电脑上运行,在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个数码管之间循环,而点亮数码管的字形码则在加了一个不显示选项的段码表之间循环,由此形成的错位打到滚动显示的效果。

推荐阅读

史海拾趣

DCCOM [ DC COMPONENTS ]公司的发展小趣事

在快速发展的过程中,DCCOM公司始终坚持品质至上的原则。公司建立了一套严格的质量控制体系,从原材料采购到产品生产的每一个环节都严格把关。这种对品质的执着追求,使得DCCOM的产品在市场上赢得了良好的口碑,客户回头率逐年攀升。

EECO Switch公司的发展小趣事

为了满足全球客户的需求,EECO Switch公司积极实施全球化战略。公司在墨西哥、台湾和中国等地设立了制造工厂,并在英国剑桥设立了销售办事处。这些海外机构不仅为公司提供了更广阔的市场空间,还帮助公司更好地了解当地市场的需求和趋势。展望未来,EECO Switch将继续秉承创新、质量、服务的核心价值观,致力于成为全球领先的人机界面产品提供商。

Analogix Semiconductor公司的发展小趣事

EECO Switch公司成立于1947年,最初作为加利福尼亚州的一家电子工程公司,致力于电子产品的设计与制造。随着技术的不断进步和市场需求的变化,公司逐渐将业务重心转向人机界面产品的设计与开发。在这个过程中,EECO Switch凭借其深厚的技术积累和创新精神,成功开发出了一系列具有领先技术的人机界面产品,从而确立了其在该领域的领先地位。

Bombardier Inc公司的发展小趣事

庞巴迪公司的起源可以追溯到蒙特利尔的一家机械厂,该公司在第一次世界大战期间开始涉足军工制造,为英国组装H级潜艇。随着战争的结束,庞巴迪逐渐将业务转向了航空领域。1923年,公司开始设计并生产水上飞机,这些飞机被装备于1924年成立的加拿大皇家空军。这一时期,庞巴迪在航空电子设备的设计和制造上取得了显著的进步,为其后续的航空业务发展奠定了坚实的基础。

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

1976年,庞巴迪公司的航空业务经历了重大变革。其加拿大航空子公司被加拿大政府收购,成为加拿大主要的航空企业。在此期间,庞巴迪在电子系统方面的研发能力得到了进一步提升。公司开始涉足更先进的航空电子技术,如自动驾驶系统、导航系统等,为现代航空业的发展做出了重要贡献。

Continental Industries公司的发展小趣事

在电子行业的初期,Continental Industries凭借其深厚的技术积累,成功研发出了一款固态继电器。这款继电器以其高度可靠性、长寿命和减少电磁干扰的特性,迅速在市场中占据了重要地位。公司不断投入研发资源,优化产品性能,逐渐在工业自动化和建筑环境控制领域树立起了技术领先的形象。

问答坊 | AI 解惑

用ATmega16驱动的LCD2004的源程序

*======================================================= 20x4字符液晶主程序,编译软件(ICCAVR_6.31) CPU内部晶振8M 数据线B0~B7接PORTB, E=D7 RW=D6 RS=D5 ========================================================= 接线图如 ...…

查看全部问答>

最后的贵族领地,伺服市场

伺服系统的学名或前身应该是“随动系统”。顾名思义,就是指输出随输入快速变化的系统。如同曼哈顿计划催生计算机技术一样,随动系统也是战争的产物。它的出现最初是为解决自行火炮行进射击的精确度而研发的。所幸的是,那些研发的工程师们是在炮身 ...…

查看全部问答>

在CEPB中,以下这些宏表示一些特定的目录,它们是在什么地方定义的?

在CEPB中,以下这些宏表示一些特定的目录,它们是在什么地方定义的?如何得知这些目录是什么目录?     $(_COMMONOAKROOT)\\lib\\$(_CPUINDPATH)\\sdcardlib.lib \\      $(_COMMONOAKROOT)\\lib\\$(_CPUINDPATH)\\ ...…

查看全部问答>

有没有这样的模拟器可以让在WINCE平台上编写的程序直接访问PC机上的磁盘目录?

如题。 我用WINCE5平台编写的程序, 能不能用一种模拟器,让它在PC机上运行,并且访问的不是智能设备的目录, 而是直接访问PC机的目录, 比如C盘,D盘这些。 另外,程序还依赖很多DLL。 …

查看全部问答>

eboot.nb0开始4k全是0x00的问题

用platform builder编译了一个wince5.0自带的EBOOT,但生成的文件前4K除了第一个跳转指令外全都是0x00,并且直接跳到了4k外了,我要怎么设置才能避免这种情况呀??我是新手,请高手们帮忙解答一下…

查看全部问答>

wince和pc通信很慢(用tcp传,只有10kb/s左右)

背景:我用evc编的一个tcp服务器端在pxa270, wince4.2的板子上跑,用c++编的客户端在pc上跑。之间就直接用网线相连,网卡是lan91c111 问题:但是互相传文件的时候很慢(10kb/s左右) 我做了什么:我在wince中向pc ping, 响应很慢(100ms), 向板子 ...…

查看全部问答>

嵌入式技术

   嵌入式的主流技术是?----------------------------------------------------------------?…

查看全部问答>

Wince依据编译根据据BSP定制的工程时怎样区分编译BSP和Wince自带的同名函数?

WinCE本身自带了很多函数和不同厂家所BSP里函数同名,那么WinCE在编译连接时,怎么样区分的到底上应该编译自带的函数还是BSP当中函数了。先上一网址http://space.itpub.net/?uid-16803921-action-viewspace-itemid-510085。 …

查看全部问答>

请教串口注册表的问题

有些串口注册表的问题不是很明白 请帮忙指点一下。 \"DevConfig\"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00 \"IClass\"=\"{A32942B7-920C-486b-B0E6-92A702A99B35}\" --------这两个个是 ...…

查看全部问答>