历史上的今天
今天是:2024年11月27日(星期三)
2019年11月27日 | ATmega32单片机汇编程序
2019-11-27 来源:51hei
本人初学每一款CPU,首先都是要研究一下相应的汇编指令,感觉这样能够很快的体验到该CPU的硬件原理,对后续的学习很有帮助.许多人认为不然,感觉汇编繁琐,难用。其实这样不会对单片机内部有深入的了解,会一些基本的汇编在单步调试中很有用,还有调度的编写,操作系统的移植等。
下面是个led闪烁的汇编程序,注释用C写的,一目了然
*****************************************************************
//CPU:mega32
//编译器:iar
#include ldi r16,0x99 ;DDRD |= (1 << 7);//PD7置为输出
NAME main
PUBLIC main
ORG RESET_vect ;复位中断向量
RJMP main
ORG INT0_vect ;外部中断0中断向量
rjmp eint0
main
out DDRD,r16
lds r1,DDRD
cli
ldi r16,high(RAMEND) ;取内部RAM最高地址的高位字节
out SPH,r16 ;放入SP的高位
ldi r16,low(RAMEND) ;取内部RAM最低地址的低位字节
out SPL,r16 ;放入SP的低位
in r16,DDRD
sbr r16,1<<7
out DDRD,r16
;eint0_init();
call eint0_init
;sei();
sei
;while(1);
s: rjmp s
;#pragma vector = INT0_vect
;__interrupt void eint0(void) //INT0中断服务程序
eint0:
;PORTD ^= 1<<7;//PD7取反
in r16,PORTD
sbrs r16,7
ldi r17,1<<7
eor r16,r17
out PORTD,r16
reti
;void eint0_init(void)
eint0_init:
;DDRD &= ~(1 << 2);//INT0脚输入
in r16,DDRD
cbr r16,1<<2
out DDRD,r16
;PORTD |= (1 << 2);//INT0脚内部上拉电阻有效
in r16,PORTD
sbr r16,1<<2
out PORTD,r16
;SFIOR &= ~(1<
cbr r16,1<
;MCUCR |= (1 << ISC01) | (1 << ISC00);//INT0下降沿触发
in r16,MCUCR
sbr r16,(1 << ISC01) | (1 << ISC00)
out MCUCR,r16
;GICR |= (1 << INT0);//使能INT0
in r16,GICR
sbr r16,1 << INT0
out GICR,r16
ret
END main
*********************************************************************
史海拾趣
|
我用的是STM320VC5402. 由于没有仿真器,所以想直接将程序加载到芯片上运行。在网上搜了很多相关的资料得知有好几种加载方式。比如串行加载、并行加载、HPI加载等等,想请教一下一大虾们这几种加载具体是怎样的?(硬件上是怎样接?软 ...… 查看全部问答> |
|
wm_lbuttondblclk消息无法获取到,用SPY++也没有显示此消息,请指教。 准备处理WM_LBUTTONDBLCLK消息,发现并没有此消息,WM_LBUTTONDOWN则有。 用SPY++看也没有WM_LBUTTONDBLCLK消息,为什么呀。… 查看全部问答> |
|
ARM默认不是单字节对齐,必须要在结构体前加__packed修饰符才能将结构体设置为单字节对齐。但是结构体中包含了double就不能用__packed修饰符了,编译报错。请问各位高手如何解决?这个结构体是用来读库文件中的记录的,因为库文件中记录是单字节对 ...… 查看全部问答> |
|
430的SPI和UART使用同一个寄存器发送数据?能同时应用么/ 要同时应用SPI和UART,看了一下,好象是同一个寄存器发送数据啊,怎么SPI发送数据还要设置UART的拨特率啊?请高手\\解释~!谢谢!… 查看全部问答> |
|
TI 的 SensorTag http://www.ti.com.cn/ww/wireless_connectivity/sensortag/index.shtml?INTC=SensorTag-cn&HQS=sensortag-bhp-cn… 查看全部问答> |




