?? ledcontrol.asm
字號:
;按鍵為常開按鍵,按鍵抬起時,單片機管腳為高電平;按鍵按下,單片機管腳為低電平
;低電平所對應的LED將被點亮,由硬件連接方式決定
.include "m16def.inc" ;文件頭,其中包含ATmega16芯片的硬件資源定義,針對ATmega16的
;程序一般需要有此指令。
.org $0000 ;org是一條偽指令,表示隨后程序的起始位置。即表示下條指令
;"rjmp RESET"位于程序存儲器的$0000地址
rjmp RESET ;單片機復位后從$0000開始執行程序,在這里放一條跳轉指令,
;跳轉到主程序開始的地址
.org $0020 ;$0000地址之后是中斷向量區,跳過中斷區。中斷與中斷向量將在
;以后解釋,可以參考光盤中ATmega16的數據手冊。
RESET:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND) ;設置堆棧,一般將堆棧設置到RAM的結尾。
out SPL,r16 ;在自己編寫程序時,可以使用以上代碼
ldi r16,0b11111111 ;
out DDRA,r16
out DDRC,r16
out DDRD,r16 ;設置PA,PC,PD端口全部為輸出
ldi r16,0b11111110;
out DDRB,r16 ;設置PB0為輸入,PB0管腳連接按鍵
ldi r16,0b11111111;
out PORTA,r16 ;PA端口全部輸出高電平,LED熄滅
out PORTC,r16
out PORTD,r16 ;PC端口,PD端口輸出高電平
out PORTB,r16 ;PB1~PB7輸出高電平,PB0為輸入,且打開內部上拉
;端口的初始化完成。
sec ;置進位C為1,為LED移位做準備
MAIN:
ldi r16,0b11111111
out PORTA,r16 ;關閉所有的LED
ldi r20,0b11111110 ;低電平點亮LED;r20用來存儲輸出狀態
in r16,PINB
sbrc r16,0 ;判斷PB0是否為低電平,即按鍵是否按下
rjmp MAIN ;按鍵沒有被按下,繼續檢測PB0
LEDPLAY:
out PORTA,r20 ;按鍵被按下,點亮相應的LED
call DELAY ;點亮持續一段時間
rol r20 ;r20往左循環一位,即下一位LED亮的狀態
in r16,PINB ;繼續檢測開關狀態,
sbrc r16,0 ;判斷PB0是否為低電平,即按鍵是否按下
rjmp MAIN ;沒有按下,說明按鍵已經抬起,回到初始狀態
rjmp LEDPLAY ;按鍵按下,繼續循環點亮
;延時子程序
DELAY:
ldi r17,0x03 ;設置延時子程序參數
ldi r18,0xff
ldi r19,0xff
DELAY1:
dec r18 ;r18減去1
brne DELAY1 ;不為0轉DELAY1;為0按順序執行
dec r19 ;r19減去1
brne DELAY1 ;不為0轉DELAY1;為0按順序執行
dec r17 ;r17減去1
brne DELAY1 ;不為0轉DELAY1;為0按順序執行,延時程序結束,返回主程序
ret ;子程序返回
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -