![]() |
發布時間: 2024-11-22 09:37
正文摘要:要求是:采用匯編語言設計程序,用定時器中斷方式,循環顯示0-99。目前寫的,但是只有十位能正確顯示,后面都是亂碼,新手小白求助各位大佬(接線圖在下面) ORG 0000H LJMP MAIN ORG 000B ... |
55236 發表于 2024-11-24 17:05 感謝感謝 |
55236 發表于 2024-11-24 17:18 感謝感謝 |
lxm41577 發表于 2024-11-23 09:59 謝謝謝謝 |
188610329 發表于 2024-11-22 22:21 感謝感謝,接線是老師規定好的 |
A_Bit EQU 20H B_Bit EQU 21h ;十位數存放處 TEMP EQU 22h STAR: MOV TEMP, #0 ;初始化計數器 STLOP: ACALL DISPLAY INC TEMP MOV A,TEMP CJNE A,#100,NEXT ;=100重來 MOV TEMP,#0 NEXT: LJMP STLOP ;顯示子程序 DISPLAY: MOV A, TEMP ;將temp中 的數轉換成10進制 MOV B,#10; DIV AB; MOV B_Bit,A ;十位在A MOV A_Bit,B;個位在B MOV DPTR,#TAB;指定查表啟始地址 MOV R0,#2;4 DPL1: MOV R1,#100;250 ;顯示1000次 DPLOP: MOV A,A_Bit;取個位數 MOVC A,@A+DPTR;查個位數的7段代碼 ;CPL A; MOV P1 ,A;送出個位的7段代碼 CLR P2.7; ACALL D1MS;延時顯示1ms SETB P2.7; MOV A,B_Bit ;取十位數 MOVC A, @A+DPTR ;查十位數的7 段代碼 ;CPL A; MOV P1 ,A;送出十位的7段代碼 CLR P2.6; ACALL D1MS; SETB P2.6; DJNZ R1,DPLOP ;100次沒完循環 DJNZ R0,DPL1 ;2個100次沒完循環RET ;延時4毫秒即2微秒* R7*R6(按12MHZ算) D1MS: MOV R7 ,#5;10 D1: MOV R6,#50; DJNZ R6,$; DJNZ R7,D1; RET; ;7段數碼管各劃的數字排列表,共陽的七段花數 TAB: DB 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h; END; |
A_Bit EQU 20H B_Bit EQU 21h ;十位數存放處 TEMP EQU 22h STAR: MOV TEMP, #0 ;初始化計數器 STLOP: ACALL DISPLAY INC TEMP MOV A,TEMP CJNE A,#100,NEXT ;=100重來 MOV TEMP,#0 NEXT: LJMP STLOP ;顯示子程序 DISPLAY: MOV A, TEMP ;將temp中 的數轉換成10進制 MOV B,#10; DIV AB; MOV B_Bit,A ;十位在A MOV A_Bit,B;個位在B MOV DPTR,#TAB;指定查表啟始地址 MOV R0,#2;4 DPL1: MOV R1,#100;250 ;顯示1000次 DPLOP: MOV A,A_Bit;取個位數 MOVC A,@A+DPTR;查個位數的7段代碼 ;CPL A; MOV P1 ,A;送出個位的7段代碼 CLR P2.7; ACALL D1MS;延時顯示1ms SETB P2.7; MOV A,B_Bit ;取十位數 MOVC A, @A+DPTR ;查十位數的7 段代碼 ;CPL A; MOV P1 ,A;送出十位的7段代碼 CLR P2.6; ACALL D1MS; SETB P2.6; DJNZ R1,DPLOP ;100次沒完循環 DJNZ R0,DPL1 ;2個100次沒完循環RET ;延時4毫秒即2微秒* R7*R6(按12MHZ算) D1MS: MOV R7 ,#5;10 D1: MOV R6,#50; DJNZ R6,$; DJNZ R7,D1; RET; ;7段數碼管各劃的數字排列表,共陽的七段花數 TAB: DB 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h; END;就不知道對不對,我們學校給的 |
5樓的似乎沒問題,你的原本的顯示部分寫的有點臃腫 |
顯示部分改了下,看看能不能用 DIS: ;顯示程序 MOV A, R0 ;取計數器R0的值 MOV B, #10 ;除以10,B寄存器為10 DIV AB ;A/B,商在A,余數在B MOVC A, @A+DPTR MOV P1, A SETB P0.0 ;十位的位選 CALL DLY CLR P0.0. MOV A, B ;顯示個位 MOVC A, @A+DPTR MOV P1, A SETB P0.1 ;個位的位選 CALL DLY CLR P0.1 RET |
MOV A, R2 ;顯示十位 MOVC A, @A+DPTR CLR P1.0 MOV P0, A SETB P0.0 ;十位的位選 CALL DLY MOV A, R3 ;顯示個位 MOVC A, @A+DPTR CLR P0.0 MOV P1, A SETB P1.0 ;個位的位選 CALL DLY RET 你這板子什么情況? 個位,和十位 段選 用的不是 同一個總線? 那你 到了十萬位,百萬位,千萬位, 還要用 P5,P6, P7 ? 你單片機有那么多口子么? |
計數到100了,清零,返回主程序加LJMAP MAIN |
這么復雜的板子,干嘛用匯編啊 |