You are on page 1of 7

Lab_2: Project_2a

• Demo1: 請修改之前用到的程式碼 LED0.asm (如下),


讓LED燈 閃爍的時間拉長為大約1秒交換一次

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; LED0.asm ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
ORG 0000h ;程式開始
MOV A, #01h
Loop:
MOV P1, A
CPL A
ACALL Delay ;呼叫 副程式 注意!
SJMP Loop
RAM 每一個byte 最大值為255!
Delay: ; *8051晶片袋瓜一直轉, 發展板沒有動作
MOV R4, #10
Delay10: MOV R5, #24
Delay1: MOV R6, #100
Delay2: MOV R7, #100
Delay0: DJNZ R7, Delay0
DJNZ R6, Delay2
DJNZ R5, Delay1
DJNZ R4, Delay10
RET ; 返回 主程式
;-------------------------------------------
END ;程式結束
Lab_2: Project_2b
• Demo2: 2顆 LED燈 靠近又分開, 來來回回閃

• 注意! 影片是去年的,影片與本講義不同的時候! 請以本講義的內容為準!

• Note: 指令說明 (見下一頁)


ORL A, R0
Lab_2: Project_2b
• ORL A, R0 ; 將A跟R0 裡面的字條數字做 OR, 結果放進A

MOV A, #00110011b
MOV R0, #10100001b ANL A, R0
ORL A, R0 • Note:
• (雖然這次不會用到, 但是ORL跟AND類似)
0011 0011b • 將A跟R0 裡面的Data做 AND,
A 0011 0011b
0011b
1010 0001b • 結果放進A
1011
 1011 0011b

R0 1010 0001b

注意: ORL R1, #53h


1_82G516_Datasheet.pdf , p.123 的表格
不能這樣用!
Lab_2: Project_2b (修改說明)
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; LED0.asm ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
ORG 0000h ;程式開始 程式開始
MOV A, #01h
Loop: P1  11111110B
MOV
CPL
P1, A
A
設定A初始值 R0  00000001B
ACALL Delay ;呼叫 副程式
SJMP Loop Loop:

Delay: ; *8051晶片袋瓜一直轉, 發展板沒有動作 P1  01111111B


MOV R4, #10 將A值傳到Port1 R1  10000000B
Delay10: MOV R5, #24
或 Port1  A
Delay1: MOV R6, #100
Delay2: MOV R7, #100
Delay0: DJNZ R7, Delay0
DJNZ R6, Delay2 將A值取互補
DJNZ R5, Delay1
DJNZ R4, Delay10
RET ; 返回 主程式
;------------------------------------------- 呼叫Delay副程式
END ;程式結束 P1  11111101B
R0 00000010B

程式結束
P1  10111111B
R1  01000000B
Lab_2: Project_2b (修改說明)
程式開始

初始值設定: P1  11111110B
R0  01H R0  00000001B
R1  80H
Loop:

A = R0 OR R1
P1  01111111B
R1  10000000B
將A值取互補

P1 A

R0 內資料向左旋
R1 內資料向右璇 P1  11111101B
R0 00000010B
呼叫Delay副程式

P1  10111111B
程式結束
R1  01000000B
Lab_2: Project_2c
• Demo3: 讓LED燈 向右旋, 一下亮1顆, 一下亮2顆
• 注意! 影片是去年的,影片與本講義不同的時候! 請以本講義的內容為準!

• 指令限制: 程式碼中 ACALL Delay 最多只能使用2次!!


(下頁流程圖只使用一次)

Note: 如果只用一次 ACALL Delay, 可參考使用下面3個指令


CLR C ; 將 C 這個bit 設為 0
SETB C ; 將C這個 bit 設為1
JC Loop ; 如果 C =1, 跳到 Loop

Note: C 是 微電腦系統 RAM 的某一個 bit


Note: 有兩個相關的指令專門為 C 而設計 : JC 和 JNC
Note: 本demo 還會用到 CPL C ;將C 取互補

1_82G516_Datasheet.pdf , p.123 附近那幾頁 的表格


Lab_2: Project_2c
程式開始

初始值設定:
R0  ??H ; 用於一顆LED亮
R1  ??H ;用於兩顆 LED 亮
C  0 ; C=0 一個燈亮, C=1 兩個燈亮
Loop:

No, 兩顆LED亮
C = #0 ?
One_LED: Yes, 一顆LED亮

P1  R0亮暗設定

使用RR 或RL, 變更R0值

Two_LED:

P1  R1亮暗設定 影片中口誤:
 R0 是每丟出去一次,才RR或RL一次,
並非每次Loop 就RR或RL一次
使用RR 或RL, 變更R1值
 R1 是每丟出去一次,才RR或RL一次,
All_Do: 並非每次Loop 就RR或RL一次

CPL C

呼叫Delay副程式

程式結束

You might also like