原创 STM8与汇编语言(5)

2010-5-18 15:23 4613 7 9 分类: MCU/ 嵌入式
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


                     STM8与汇编语言(5


 


上一次的实验程序,完成了LED指示灯的驱动,用到了GPIO的输出方式,这一次要用GPIO的输入方式,进行按键的输入。下面的代码是读入按键值,如果按键按下,则点亮LED,否则熄灭LED


利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。


编译通过后,下载到开发板,运行程序,可以看到当按下按键时,LED1点亮,当抬起按键时,LED1熄灭。


 


stm8/


 


       #include "mapping.inc"


 


; 涉及到的硬件资源


; LED1定义在PD3


; KEY1定义在PD7


 


; 下面定义端口D的寄存器地址


PD_ODR   EQU    $<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />500f                  


PD_IDR   EQU    $5010


PD_DDR   EQU    $5011


PD_CR1   EQU    $5012


PD_CR2   EQU    $5013


 


 


; 定义堆栈空间的起始位置和结束位置


stack_start.w  EQU    $stack_segment_start


stack_end.w    EQU    $stack_segment_end


 


 


               segment 'rom'         ; 下面开始定义一个段,该段位于ROM


main.l                           ; 定义复位后的第一条指令的标号(即入口地址)


;


; 首先要初始化堆栈指针


      LDW     X,#stack_end         


      LDW     SP,X


 


; 下面初始化IO端口


; PD3设置成推挽输出


; PD7设置成悬浮输入


        LD      A,#08


  LD      PD_DDR,A              ; PD3设置成输出,PD7设置成输入


        LD      A,#08


        LD      PD_CR1,A              ; PD3设置成推挽输出


        LD      A,#00


        LD      PD_CR2,A              ;


MAIN_LOOP.L


        LD      A,PD_IDR              ; 读入端口D的引脚输入寄存器


        AND     A,#$80                ; 测试最高位是否为1


        JRNE    MAIN_LOOP_1                                    ; 若最高位为1,则跳转


        LD      A,#$08                ; 否则说明按键按下,PD3<-1,点亮LED1


        LD      PD_ODR,A              ;


        JRA     MAIN_LOOP


MAIN_LOOP_1.L                           


        LD      A,#$00                ; 若按键没按下,PD3<-0,熄灭LED1


        LD      PD_ODR,A              ;


        JRA     MAIN_LOOP             ;


 


 


  interrupt NonHandledInterrupt


NonHandledInterrupt.l


                                   iret


 


; 下面定义中断向量表      


               segment 'vectit'


               dc.l {$82000000+main}                              ; reset


               dc.l {$82000000+NonHandledInterrupt}    ; trap


               dc.l {$82000000+NonHandledInterrupt}    ; irq0


               dc.l {$82000000+NonHandledInterrupt}    ; irq1


               dc.l {$82000000+NonHandledInterrupt}    ; irq2


               dc.l {$82000000+NonHandledInterrupt}    ; irq3


               dc.l {$82000000+NonHandledInterrupt}    ; irq4


               dc.l {$82000000+NonHandledInterrupt}    ; irq5


               dc.l {$82000000+NonHandledInterrupt}    ; irq6


               dc.l {$82000000+NonHandledInterrupt}    ; irq7


               dc.l {$82000000+NonHandledInterrupt}    ; irq8


               dc.l {$82000000+NonHandledInterrupt}    ; irq9


               dc.l {$82000000+NonHandledInterrupt}    ; irq10


               dc.l {$82000000+NonHandledInterrupt}    ; irq11


               dc.l {$82000000+NonHandledInterrupt}    ; irq12


               dc.l {$82000000+NonHandledInterrupt}    ; irq13


               dc.l {$82000000+NonHandledInterrupt}    ; irq14


               dc.l {$82000000+NonHandledInterrupt}    ; irq15


               dc.l {$82000000+NonHandledInterrupt}    ; irq16


               dc.l {$82000000+NonHandledInterrupt}    ; irq17


               dc.l {$82000000+NonHandledInterrupt}    ; irq18


               dc.l {$82000000+NonHandledInterrupt}    ; irq19


               dc.l {$82000000+NonHandledInterrupt}    ; irq20


               dc.l {$82000000+NonHandledInterrupt}    ; irq21


               dc.l {$82000000+NonHandledInterrupt}    ; irq22


               dc.l {$82000000+NonHandledInterrupt}    ; irq23


               dc.l {$82000000+NonHandledInterrupt}    ; irq24


               dc.l {$82000000+NonHandledInterrupt}    ; irq25


               dc.l {$82000000+NonHandledInterrupt}    ; irq26


               dc.l {$82000000+NonHandledInterrupt}    ; irq27


               dc.l {$82000000+NonHandledInterrupt}    ; irq28


               dc.l {$82000000+NonHandledInterrupt}    ; irq29


 


       end


 


                             201049


 

文章评论2条评论)

登录后参与讨论

用户202776 2011-7-14 17:13

我找到问题了。 1.#$80表示#128,我搞错了。 2.使用STVP软件以后要退出软件,芯片才能正常运行。

用户202776 2011-7-14 16:47

这个例子我试了一下不行。不知道问题在哪里。上一篇的例子我试了是可以的。我的芯片是STM8S105C4 编译通过,写到芯片里用示波器看不到结果。不知道是不是OPTION byte的原因。没有找到。 以下是程序。 stm8/ #include "mapping.inc" #include "stm8s105c_s.inc" segment 'rom' main.l ; initialize SP ldw X,#stack_end ldw SP,X #ifdef RAM0 ; clear RAM0 ram0_start.b EQU $ram0_segment_start ram0_end.b EQU $ram0_segment_end ldw X,#ram0_start clear_ram0.l clr (X) incw X cpw X,#ram0_end jrule clear_ram0 #endif #ifdef RAM1 ; clear RAM1 ram1_start.w EQU $ram1_segment_start ram1_end.w EQU $ram1_segment_end ldw X,#ram1_start clear_ram1.l clr (X) incw X cpw X,#ram1_end jrule clear_ram1 #endif ; clear stack stack_start.w EQU $stack_segment_start stack_end.w EQU $stack_segment_end ldw X,#stack_start clear_stack.l clr (X) incw X cpw X,#stack_end jrule clear_stack LD A,#08 LD PD_DDR,A LD A,#88 LD PD_CR1,A LD A,#00 LD PD_CR2,A MAIN_LOOP.L LD A,PD_IDR AND A,#80 JRNE MAIN_LOOP_1 LD A,#08 LD PD_ODR,A JRA MAIN_LOOP MAIN_LOOP_1.L LD A,#00 LD PD_ODR,A JRA MAIN_LOOP interrupt NonHandledInterrupt NonHandledInterrupt.l iret segment 'vectit' dc.l {$82000000+main} ; reset dc.l {$82000000+NonHandledInterrupt} ; trap dc.l {$82000000+NonHandledInterrupt} ; irq0 dc.l {$82000000+NonHandledInterrupt} ; irq1 dc.l {$82000000+NonHandledInterrupt} ; irq2 dc.l {$82000000+NonHandledInterrupt} ; irq3 dc.l {$82000000+NonHandledInterrupt} ; irq4 dc.l {$82000000+NonHandledInterrupt} ; irq5 dc.l {$82000000+NonHandledInterrupt} ; irq6 dc.l {$82000000+NonHandledInterrupt} ; irq7 dc.l {$82000000+NonHandledInterrupt} ; irq8 dc.l {$82000000+NonHandledInterrupt} ; irq9 dc.l {$82000000+NonHandledInterrupt} ; irq10 dc.l {$82000000+NonHandledInterrupt} ; irq11 dc.l {$82000000+NonHandledInterrupt} ; irq12 dc.l {$82000000+NonHandledInterrupt} ; irq13 dc.l {$82000000+NonHandledInterrupt} ; irq14 dc.l {$82000000+NonHandledInterrupt} ; irq15 dc.l {$82000000+NonHandledInterrupt} ; irq16 dc.l {$82000000+NonHandledInterrupt} ; irq17 dc.l {$82000000+NonHandledInterrupt} ; irq18 dc.l {$82000000+NonHandledInterrupt} ; irq19 dc.l {$82000000+NonHandledInterrupt} ; irq20 dc.l {$82000000+NonHandledInterrupt} ; irq21 dc.l {$82000000+NonHandledInterrupt} ; irq22 dc.l {$82000000+NonHandledInterrupt} ; irq23 dc.l {$82000000+NonHandledInterrupt} ; irq24 dc.l {$82000000+NonHandledInterrupt} ; irq25 dc.l {$82000000+NonHandledInterrupt} ; irq26 dc.l {$82000000+NonHandledInterrupt} ; irq27 dc.l {$82000000+NonHandledInterrupt} ; irq28 dc.l {$82000000+NonHandledInterrupt} ; irq29 end
相关推荐阅读
用户1203741 2012-04-24 12:00
STM32L开发经验之一
STM32L开发经验之一   这2天在调试单位的一个电路板,电路板的核心芯片是ST公司的STM32L152,在进行系统时钟源切换时发现一个问题:当选择系统时钟源为外接振荡器HSE时,有时对...
用户1203741 2011-09-01 22:32
液晶显示器FP71G+不亮的维修
液晶显示器FP71不亮的维修 有一台液晶显示器,型号是FP71G+,开机后不亮。上网查找了一些信息,据说此款显示器出现这种现象多半都是高压有问题,而且还指出了大部分问题都出现那对三极管上(型号为570...
用户1203741 2010-09-19 16:06
算法优化的重要性
                    算法优化的重要性 前些日子,在开发一个单片机的产品时,遇到这么一个问题,就是要将一个无符号的16位数,乘以1.2288后,再赋给另一个无符号的16位数。用C语言...
用户1203741 2010-08-19 16:56
STM8的C语言编程(14)-- PWM
                STM8的C语言编程(14)-- PWM 在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。现在很多高档的单片机也都集成了PWM功能模块,方便用户的应...
用户1203741 2010-08-16 10:02
STM8的C语言编程(13)-- 蜂鸣器
                 STM8的C语言编程(13)-- 蜂鸣器 蜂鸣器是现在单片机应用系统中很常见的,常用于实现报警功能。为此STM8特别集成了蜂鸣器模块,应用起来非常方便。在应用蜂鸣器模...
用户1203741 2010-08-13 09:10
STM8的C语言编程(12)-- AD转换
                                       STM8的C语言编程(12)-- AD转换 在许多的单片机应用系统中,都需要A/D转换器,将模拟量转换成数字量。在STM8...
我要评论
2
7
关闭 站长推荐上一条 /2 下一条