本人初學(xué)每一款CPU,首先都是要研究一下相應(yīng)的匯編指令,感覺(jué)這樣能夠很快的體驗(yàn)到該CPU的硬件原理,對(duì)后續(xù)的學(xué)習(xí)很有幫助.許多人認(rèn)為不然,感覺(jué)匯編繁瑣,難用。其實(shí)這樣不會(huì)對(duì)單片機(jī)內(nèi)部有深入的了解,會(huì)一些基本的匯編在單步調(diào)試中很有用,還有調(diào)度的編寫(xiě),操作系統(tǒng)的移植等。
下面是個(gè)led閃爍的匯編程序,注釋用C寫(xiě)的,一目了然
*****************************************************************
//CPU:mega32
//編譯器:iar #include <ioavr.h>
NAME main
PUBLIC main
ORG RESET_vect ;復(fù)位中斷向量
RJMP main
ORG INT0_vect ;外部中斷0中斷向量
rjmp eint0
main ldi r16,0x99
out DDRD,r16
lds r1,DDRD
cli
ldi r16,high(RAMEND) ;取內(nèi)部RAM最高地址的高位字節(jié)
out SPH,r16 ;放入SP的高位
ldi r16,low(RAMEND) ;取內(nèi)部RAM最低地址的低位字節(jié)
out SPL,r16 ;放入SP的低位
;DDRD |= (1 << 7);//PD7置為輸出
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中斷服務(wù)程序
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腳內(nèi)部上拉電阻有效
in r16,PORTD
sbr r16,1<<2
out PORTD,r16
;SFIOR &= ~(1<<PUD);//允許全部上拉
in r16,SFIOR
cbr r16,1<<PUD
out SFIOR,r16
;MCUCR |= (1 << ISC01) | (1 << ISC00);//INT0下降沿觸發(fā)
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
*********************************************************************
|