历史上的今天
今天是:2024年10月11日(星期五)
2021年10月11日 | STM8与汇编语言(5)
2021-10-11 来源:eefocus
上一次的实验程序,完成了LED指示灯的驱动,用到了GPIO的输出方式,这一次要用GPIO的输入方式,进行按键的输入。下面的代码是读入按键值,如果按键按下,则点亮LED,否则熄灭LED。
利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。
编译通过后,下载到开发板,运行程序,可以看到当按下按键时,LED1点亮,当抬起按键时,LED1熄灭。
stm8/
#include "mapping.inc"
; 涉及到的硬件资源
; LED1定义在PD3
; KEY1定义在PD7
; 下面定义端口D的寄存器地址
PD_ODR EQU $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
上一篇:STM8与汇编语言(4)
史海拾趣
|
引 言 由于CPLD的可再编程性质,可以将同一装置用于不同的键盘和产品,而收到高产量、低成本的效果,同时也节约了单片机的资源以做它用。可再编程的特点辅之简便易用的设计工具,使设计可以进行晚期更改,提高了产品设计的灵活性,降低了风险。 ...… 查看全部问答> |
|
本公司位于广州市天河区软件园内,主要从事游戏机的软件,硬件的产品开发。 现在公司扩大开发范围,现急聘一名单片机开发人员(有效期15天)。 要求: 熟悉ARM9,ARM7内核及开发过程。 熟悉MCS51结构芯片,PIC,AVR等芯片 了解CPLD,FPGA 熟悉KE ...… 查看全部问答> |
|
大家都知道,cetk测试的时候是由tux调用测试dll来进行测试的,也就说具体的测试项都是在这些dll中一张表格中进行定义的。 本来我以为这些测试的dll是随着PB补丁进行更新,但是今天仔细看了看,不是这么回事。前两天, ...… 查看全部问答> |
|
Hive base register在CE5下使用硬盘已经成功了。 但是在CE6下,创建的文件目录始终在My Device下,而不是在硬盘中。(怀疑是Hive处理在hard disk driver加载之前) 加入hive base register组件,使用微软自带的硬盘驱动。 ; HIVE BOOT SECTION ...… 查看全部问答> |
|
渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...… 查看全部问答> |




