久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機匯編版本,關于工作寄存器R1在程序運行過程中無緣無故被修改的問題
[打印本頁]
作者:
anyint
時間:
2017-11-14 17:27
標題:
51單片機匯編版本,關于工作寄存器R1在程序運行過程中無緣無故被修改的問題
附上軟件代碼:TEMP EQU 07H ;地址不要亂定 R7
硬件上:P3.0、P3.1口接了按鍵,P1口接了LED燈
問題:程序當中第一種模式ONE,里面的延時部分,有一個工作寄存器R1,在按鍵處理子程序KEYPRO中修改了之后,程序應該是一直保持修改之后的值的,但是顯示的子程序循環執行幾個來回后,R1發生了改變,好像恢復到初值了,顯示(流水燈)的速度又快了。請教大佬們,R1工作寄存器的值變化是什么原因造成的?小弟不才,希望是代碼錯了,求大佬們指點迷津,感激不盡
ORG 000H
AJMP MAIN
ORG 100H
;********;
;主程序;
;********;
MAIN: MOV R0,#000H ;初始化LED模式為0
MOV R1,#00AH ;初始化LED的速度
MOV R2,#0FEH ;LED初始狀態
MOV R5,#0FFH
WHILE: LCALL KEYSCAN ;按鍵掃描
S1: LCALL KEYPRO ;按鍵處理
S2: LCALL SHOW ;顯示函數
JMPEND: AJMP WHILE
;********;
;顯示子程序;
;********;
SHOW: MOV A,R0
RL A
MOV DPTR,#JMPTAB
JMP @A+DPTR
RET
;********;
;按鍵掃描子程序;
;********; ;03H = 0000 0011B
KEYSCAN: MOV P3,#03H ;給端口置高電平,讀取端口狀態必須先置端口為高電平
MOV A,P3 ;讀入P3的狀態也就是按鍵的狀態
ORL A,#0FCH ;0FCH = 1111 1100B
CPL A ;取反
JZ S2 ;如果A鍵態為00,則無按鍵填過直接做顯示部分
MOV TEMP,A ;保存臨時鍵值
LCALL DELAY10MS;消抖
MOV A,P3
ORL A,#0FCH
CPL A
CJNE A,TEMP,S2 ;判斷如果第二次讀取的按鍵值和第一次讀取的按鍵值不相等
MOV R5,A ;保存鍵值
RET
;********;
;按鍵處理子程序;
;********;
KEYPRO: MOV A,R5 ;把按鍵值給A
CJNE A,#001H,IFK2 ;如果鍵狀態為K1,則
CJNE R0,#002H,K1PRO ; R0 = 0000 0000B #0000 0010B
MOV R0,#000H
SJMP KEYPROEND
IFK2: CJNE A,#002H,KEYPROEND
CJNE R1,#0FAH,K2PRO
MOV R1,#00AH
SJMP KEYPROEND
K1PRO: INC R0
SJMP KEYPROEND
K2PRO: MOV A,R1
ADD A,#00AH
MOV R1,A
SJMP KEYPROEND
KEYPROEND: RET
;********;
;延時10ms子程序;
;********;
DELAY10MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#18
MOV 31H,#230
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
;********;
;分支1子程序;
;********;
ONE:
MOV A,R2 ;R2是P1初始狀態LED 1111 1110B = 0FEH
MOV P1,A
MOV A,R1
MOV R3,A
;MOV P1,A
L1: LCALL DELAY10MS
DJNZ R3,L1
MOV A,R2
RL A
MOV R2,A
AJMP JMPEND
;********;
;分支2子程序;
;********;
TWO: MOV P1,#00FH
SJMP $
AJMP JMPEND
;********;
;跳轉程序表;
;********;
JMPTAB: AJMP ONE
AJMP TWO
END
復制代碼
作者:
yzwzfyz
時間:
2017-11-15 13:35
請教一下,堆棧存從哪里開始?堆棧里的數據何時會發生變化?
作者:
anyint
時間:
2017-11-15 21:43
yzwzfyz 發表于 2017-11-15 13:35
請教一下,堆棧存從哪里開始?堆棧里的數據何時會發生變化?
查閱一下51匯編的書籍,堆棧的一開始初始化的地址我忘記,堆棧地址可以改的,給sp賦值即可。MOV SP,060H。堆棧的數據,當你調用子程序了就會壓棧,返回的時候就出棧。或者直接對堆棧進行操作PUSH或者POP
作者:
anyint
時間:
2017-11-15 21:56
問題已找到,謝謝老師和同學以及論壇的大佬們。這個代碼邏輯上應該對的,但是存在一個問題就是主程序明明調用了按鍵掃描子程序 LCALL KEYSCAN,但是在這個按鍵掃描的子程序里,我寫了一個判斷數據是否相等跳轉的命令 CJNE A,TEMP,S2,而這個跳轉的地址S2確實主程序里的,因此在按鍵子程序還沒有RET返回就已經跳轉到另外一個子程序里面了,此時堆棧就溢出,調用了卻沒有執行返回,調用的時候會壓棧的,那么返回就是出棧,如果沒有返回就會使得堆棧溢出,程序多跑幾次直接復位。總結就是:調用了子程序一定要返回,不能調用了子程序再跳轉到另外一個子程序,這樣返回那句命令就廢了。(如果調用了子程序,在自己的子程序里跳轉是可以的)哈哈開心解決了一個很不容易發現的問題。再一次感謝老師同學以及論壇的大佬們。
附上正確的代碼:
TEMP EQU 07H ;地址不要亂定 R7
ORG 000H
AJMP MAIN
ORG 100H
;********;
;主程序;
;********;
MAIN: MOV R0,#000H ;初始化LED模式為0
MOV R1,#00AH ;初始化LED的速度
MOV R2,#0FEH ;LED初始狀態
MOV R5,#0FFH ;初始化鍵代碼
MOV R6,#008H ;初始化計數器
WHILE: LCALL KEYSCAN ;按鍵掃描
LCALL KEYPRO ;按鍵處理
LCALL KEYAGIN ;按鍵彈起
AJMP SHOW ;顯示函數
JMPEND: AJMP WHILE
;********;
;顯示子程序;
;********;
SHOW: MOV A,R0
RL A
MOV DPTR,#JMPTAB
JMP @A+DPTR
;********;
;按鍵掃描子程序;
;********; ;03H = 0000 0011B
KEYSCAN: MOV P3,#03H ;給端口置高電平,讀取端口狀態必須先置端口為高電平
MOV A,P3 ;讀入P3的狀態也就是按鍵的狀態
ORL A,#0FCH ;0FCH = 1111 1100B
CPL A ;取反
JZ ONKEY ;如果A鍵態為00,則無按鍵填過直接做顯示部分
MOV TEMP,A ;保存臨時鍵值
LCALL DELAY10MS;消抖
MOV A,P3
ORL A,#0FCH
CPL A
CJNE A,TEMP,ONKEY ;判斷如果第二次讀取的按鍵值和第一次讀取的按鍵值不相等
MOV R5,A ;保存鍵值
AJMP KSEND
ONKEY: MOV R5,#000H
KSEND: RET
;********;
;按鍵處理子程序;
;********;
KEYPRO: MOV A,R5 ;把按鍵值給A
CJNE A,#000H,DOWNKEY
AJMP KEYPROEND
DOWNKEY: CJNE A,#001H,IFK2 ;如果鍵狀態為K1,則
CJNE R0,#003H,K1PRO ;
MOV R0,#000H
MOV R2,#0FEH
SJMP KEYPROEND
IFK2: CJNE A,#002H,KEYPROEND
CJNE R1,#0FAH,K2PRO
MOV R1,#00AH
SJMP KEYPROEND
K1PRO: INC R0
MOV R2,#0FEH
SJMP KEYPROEND
K2PRO: MOV A,R1
ADD A,#00AH
MOV R1,A
SJMP KEYPROEND
KEYPROEND: RET
;********;
;按鍵彈起子程序;
;********;
KEYAGIN: MOV A,R5
CJNE A,#000H,KEYTQ
AJMP NOKEYTQ
KEYTQ: MOV P3,#03H
KEYTA: MOV A,P3
ORL A,#0FCH
CPL A
CJNE A,TEMP,KEYCH
SJMP KEYTA
KEYCH: NOP
NOKEYTQ: RET
;********;
;延時10ms子程序;
;********;
DELAY10MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#18
MOV 31H,#230
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
;********;
;分支1子程序;
;********;
ONE:
MOV A,R2 ;R2是P1初始狀態LED 1111 1110B = 0FEH
MOV P1,A
MOV A,R1
MOV R3,A
L1: LCALL DELAY10MS
DJNZ R3,L1
MOV A,R2
RL A
MOV R2,A
AJMP JMPEND
;********;
;分支2子程序;
;********;
TWO: MOV A,R2
CLR C
MOV P1,A
MOV A,R1
MOV R3,A
L2: LCALL DELAY10MS
DJNZ R3,L2
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,TWOEND
MOV R6,#009H
MOV R2,#0FFH
TWOEND: AJMP JMPEND
;********;
;分支3子程序;
;********;
THREE: MOV P1,#00FH
MOV A,R1
MOV R3,A
L3: LCALL DELAY10MS
DJNZ R3,L3
MOV P1,#0F0H
MOV A,R1
MOV R3,A
L4: LCALL DELAY10MS
DJNZ R3,L4
AJMP JMPEND
;********;
;分支4子程序;
;********;
FOUR: MOV P1,#0C3H
MOV A,R1
MOV R3,A
L5: LCALL DELAY10MS
DJNZ R3,L5
MOV P1,#03CH
MOV A,R1
MOV R3,A
L6: LCALL DELAY10MS
DJNZ R3,L6
AJMP JMPEND
;********;
;跳轉程序表;
;********;
JMPTAB: AJMP ONE
AJMP TWO
AJMP THREE
AJMP FOUR
END
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
一区二区三区国产
|
亚洲精品日韩一区二区电影
|
亚洲天堂男人的天堂
|
一区二区精品在线
|
欧美精品一区三区
|
国产欧美一区二区在线观看
|
国产一级淫片免费视频
|
黄色欧美在线
|
91久久国产综合久久
|
在线只有精品
|
古装人性做爰av网站
|
日韩av网址在线观看
|
国产精品视频一
|
午夜欧美一区二区三区在线播放
|
国产精品99久久久久久宅男
|
一区二区在线免费观看视频
|
久久精品免费
|
视频二区
|
欧美日韩精品综合
|
成年人在线观看
|
精品久久久久久亚洲综合网
|
国产在线不卡
|
日本免费在线
|
国产精品18久久久久久白浆动漫
|
国产aa
|
天堂网中文字幕在线观看
|
日本在线一区二区
|
黄 色 毛片免费
|
黑人精品欧美一区二区蜜桃
|
中文字幕一区二区三区四区五区
|
亚洲精品一
|
欧美日韩一区二区在线观看
|
免费观看黄网站
|
国产亚洲欧美在线
|
亚洲国产一区二区在线
|
久久中文视频
|
免费看黄色小视频
|
亚洲高清在线播放
|
中文字幕精品视频
|
国产精品96久久久久久
|
91免费版在线观看
|