久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7010|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

STC8G單片機(jī)MDU16位乘除法器C語言改匯編程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:283954 發(fā)表于 2021-4-10 01:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近需要用到16位乘16位,記得STC有硬件的16位乘除法器,看了說明書,找到了例程,卻只有C語言的,看來匯編已經(jīng)快被拋棄了,只好自己改寫,C語言就是一堆難懂的符號,像這句“ARCON = 4 << 5;    //16位*16位,乘法模式"就看不懂,但只要看原理說明就知道,這乘除法器就設(shè)在傳統(tǒng)51單片結(jié)構(gòu)外,利用一個P_SW2的寄存器做開關(guān),開關(guān)打開后,就可以用DPTR指針往外面的寄存器(MD0-MD5)賦值,再打開一個外面的開關(guān)OPCON,就會開始運(yùn)算,等若干時鐘后把運(yùn)算結(jié)果讀進(jìn)來,再把P_SW2關(guān)閉就可以了。明白了原理后寫匯編就很簡單了。為了驗證寄存器沒有搞錯,將結(jié)果通過UART1顯示出來,網(wǎng)上有不少HEX的運(yùn)算器,我把數(shù)字放上去計算,出來的結(jié)果都看不懂,最后是把16位的乘數(shù)和被乘數(shù)都轉(zhuǎn)換成是進(jìn)制,再用五元的家用計算器算出結(jié)果,再把結(jié)果轉(zhuǎn)為HEX,0107HX0208H=00021638H,答案正確吧?

;C語言:

;============================================
;16位乘以16位乘法:被乘數(shù):{MD1,MD0} 乘數(shù):{MD5,MD4} 積:{MD3,MD2,MD1,MD0}

;define MD3 (*(unsigned char volatile xdata *)0xfcf0)
;#define MD2 (*(unsigned char volatile xdata *)0xfcf1)
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2)
;#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
;#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6)
;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)
;sfr              P_SW2                =              0xBA;            
;////////////////////////////////////////////////////////////////////////////////
;//16位乘16位//////////////////////////////////////////////////////////////////////////////
;// unsigned long res; unsigned int dat1, dat2;
;P_SW2 |= 0x80;     //訪問擴(kuò)展寄存器xsfr
;MD1U16 = dat1;     //dat1用戶給定MD5U16 = dat2; //dat2用戶給定
;ARCON = 4 << 5;    //16位*16位,乘法模式
;OPCON = 1;         //啟動計算
;while((OPCON & 1) != 0); //等待計算完成
;res = MD3U32; //32位結(jié)

;匯編:
HEADBUFFER1 EQU 0A0H
LASTBUFFER1 EQU 0FFH   ;第一組緩沖區(qū)
AUXR EQU 8EH
AUXR2 EQU 0A2H
WAKE_CLKO EQU 08FH   

MD0 EQU 0FCF3H
MD1 EQU 0FCF2H
MD2 EQU 0FCF1H
MD3 EQU 0FCF0H
MD4 EQU 0FCF5H
MD5 EQU 0FCF4H
ARCON EQU 0FCF6H
OPCON EQU 0FCF7H
P_SW2 EQU 0BAH            ;當(dāng)需要訪問 XFR 時,必須先將 EAXFR 置 1,才能對 XFR 進(jìn)行正常的讀寫

ORG 0000H
LJMP MAIN
ORG 0023H
LJMP UART1    ;UART1 RECEIVED INTERRUPT
ORG 0100H

MAIN:
LCALL DELAY1  ;用STC-ISP的串口助手,必須給點時間切換,否則上載后來不及接收結(jié)果(00 02 16 38)接收口波特率為115200 晶振:11.0592 STC8G2K32S4
LCALL DELAY1
LCALL DELAY1

LCALL IOSET

CLR P1.0

MOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4
MOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS
MOV AUXR2, #00000000B        ;#00010000B=SHIFT UART2
MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0)
MOV PCON, #00000000B         ;THIS DOUBLE THE BRT AND T0 T1 RATE; SMOD IS AT PCON.7 249(3.64=32US) 219(18M= 2USX16=32US MIDI VIEW AT P3.5)

LCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
CLR RI
CLR TI
SETB  EA                  ;ENABLE ALL INTERRUPT

MOV P_SW2,#80H            ;訪問X寄存器打開

MOV DPTR,#MD1             ;
MOV A, #01H               ;必須通過A才能送到
MOVX @DPTR,A

MOV DPTR,#MD0             ;
MOV A, #07H               ;必須通過A才能送到
MOVX @DPTR,A

MOV DPTR,#MD5             ;
MOV A, #02H               ;必須通過A才能送到
MOVX @DPTR,A

MOV DPTR,#MD4             ;
MOV A, #08H               ;必須通過A才能送到
MOVX @DPTR,A

MOV DPTR,#ARCON           ;
MOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16
MOVX @DPTR,A

MOV DPTR,#OPCON           ;啟動運(yùn)算
MOV A, #00000001B            
MOVX @DPTR,A

WAIT:
MOVX A, @DPTR
ANL A, #00000001B
JNZ  WAIT

MOV DPTR, #MD3            
MOVX A, @DPTR

LCALL SENTONEBYTE1

MOV DPTR,#MD2           
MOVX A, @DPTR

LCALL SENTONEBYTE1

MOV DPTR, #MD1            
MOVX A, @DPTR

LCALL SENTONEBYTE1

MOV DPTR,#MD0         
MOVX A, @DPTR

LCALL SENTONEBYTE1

MOV P_SW2,#00H            ;訪問完畢要關(guān)閉

LED:                      ;停機(jī)

JMP LED

NEXTBUFFER:
CJNE R0, #LASTBUFFER1, NEXTBUFFER2
MOV R0, #HEADBUFFER1
JMP NEXTBUFFEREXIT
NEXTBUFFER2:
INC R0  ;POINT TO NEXT BYTE
NEXTBUFFEREXIT:
RET

SENTONEBYTE1:                ;SENT OUT A
CHECKBUSY1:
JB 40H, CHECKBUSY1
SETB 40H
MOV SBUF, A
RET

UART1:      ;RECEIVED DATA FROM AIR
PUSH ACC
PUSH PSW
JNB RI, UART1CHECKTI
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
CLR RI      ;CLEAR RECEICED FLAG
MOV @R1, A  ;SAVE TO BUFFER
CJNE R1, #LASTBUFFER1, NEXTREADBUFFER
MOV R1, #HEADBUFFER1
JMP UART1EXIT
NEXTREADBUFFER:
INC R1  ;POINT TO NEXT BUFFER
JMP UART1EXIT
UART1CHECKTI:
CLR TI
CLR 40H      
UART1EXIT:
POP PSW
POP ACC
RETI

INITIAL_UART1:           ;115200
MOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
MOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0   
MOV TL1, #253
SETB PS                  ;SERIAL PORT PRORITY HIGH
SETB TR1                 ;RUN TIMER_1
SETB ES                  ;ENABLE UART1 INTERRUPT
RET

IOSET:
;-----------I/O CONFIGUE
MOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT
MOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)
MOV 91H, #00000000B      ;SET P1
MOV 92H, #00000000B      ;SET P1
MOV 95H, #00000000B      ;SET P2
MOV 96H, #00000000B      ;SET P2
MOV 0B1H, #00000000B     ;SET P3
MOV 0B2H, #00000000B     ;SET P3
MOV 0B3H, #00000000B     ;SET P4
MOV 0B4H, #00000000B     ;SET P4
MOV 0C9H, #00000000B     ;SET P5
MOV 0CAH, #00000000B     ;SET P5
;MOV 0CBH, #00000000B     ;SET P6
;MOV 0CCH, #00000000B     ;SET P6
;MOV 0E1H, #00000000B     ;SET P7
;MOV 0E2H, #00000000B     ;SET P7
RET

DELAY1:
LCALL DELAY2
LCALL DELAY2
SETB P1.0
LCALL DELAY2
LCALL DELAY2
CLR P1.0
RET

DELAY2:
MOV 35H, #255
SLOWDOWN0:
MOV 34H, #170
SLOWDOWN:
MOV 36H, #2
SLOWDOWN2:
DJNZ 36H, SLOWDOWN2
DJNZ 34H, SLOWDOWN
DJNZ 35H, SLOWDOWN0
RET

END


評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:983641 發(fā)表于 2022-3-9 21:59 | 只看該作者
感謝朋友的代碼
回復(fù)

使用道具 舉報

板凳
ID:1001475 發(fā)表于 2022-4-26 09:53 來自手機(jī) | 只看該作者
感謝朋友的乘除法代碼
回復(fù)

使用道具 舉報

地板
ID:283954 發(fā)表于 2022-5-28 00:46 | 只看該作者
用“逼”作匯編位運(yùn)算的思考:

ANL:
11001100   原值
11010000   逼值
11000000   結(jié)果   

ANL是用來逼0的,逼值放0的位結(jié)果全變?yōu)?,放1的結(jié)果保留原值,用來保留你要的有效位。

ORL:
11001100   原值
11010000   逼值
11011100   結(jié)果
   
ORL是用來逼1的,逼值放1的位結(jié)果全變?yōu)?,放0的結(jié)果保留原值,用來打開你要的某個位,而而其他位維持不變。

XOL:
11001100   原值
11010000   逼值
00011100   結(jié)果   

XOL是用來比較每個位的,相等的位就變0,不等的位就變1

回復(fù)

使用道具 舉報

5#
ID:491577 發(fā)表于 2022-6-3 01:16 | 只看該作者
這么復(fù)雜誰用?直接計算就好,慢不了多少,單片機(jī)主要是控制IO,復(fù)雜計算留給上位機(jī)。
回復(fù)

使用道具 舉報

6#
ID:126422 發(fā)表于 2022-6-6 11:27 | 只看該作者
感謝樓主的解析,請教  UART1是常用的串口軟件嗎?
回復(fù)

使用道具 舉報

7#
ID:283954 發(fā)表于 2022-6-6 16:06 | 只看該作者
lijn 發(fā)表于 2022-6-6 11:27
感謝樓主的解析,請教  UART1是常用的串口軟件嗎?

UART不是常用,而是必不可少(除非只是想點亮一個LED而已),開發(fā)過程中可以用來輸出結(jié)果,在PC上查看,STC的燒錄軟件可以在燒錄后即可打開UART接收來自單片機(jī)UART1的數(shù)值,非常方便。
回復(fù)

使用道具 舉報

8#
ID:126422 發(fā)表于 2022-6-30 17:04 | 只看該作者
請教樓主,目前STC已經(jīng)有32位單片機(jī),用匯編程序也行嗎?
回復(fù)

使用道具 舉報

9#
ID:283954 發(fā)表于 2022-6-30 17:28 | 只看該作者
lijn 發(fā)表于 2022-6-30 17:04
請教樓主,目前STC已經(jīng)有32位單片機(jī),用匯編程序也行嗎?

我還沒有玩STC32,因為還沒有必要用到32位,估計也不算難,學(xué)會匯編底子好,你先玩玩看。
回復(fù)

使用道具 舉報

10#
ID:378108 發(fā)表于 2022-6-30 18:09 | 只看該作者
說C看不懂的,就是給自己找理由,C有的概念,匯編都有,
你要愿意,完全可以把C寫成匯編
回復(fù)

使用道具 舉報

11#
ID:283954 發(fā)表于 2022-7-29 03:12 | 只看該作者
近日有所發(fā)現(xiàn),KEIL4在編譯匯編語言的時候,無法發(fā)現(xiàn)偽指令ORG所指定的位置會覆蓋生成的代碼部分,比如:

ORG 0000H ;開頭部分
LJMP MAIN
ORG 0003H
LJMP EXT_INT0 ;EXTERNAL INTERRUPT0
ORG 000BH
LJMP TIMER_0  ;TIMER0 INTERRUPT
ORG 0013H
LJMP EXT_INT1 ;EXTERNAL INTERRUPT1
ORG 001BH
LJMP TIMER_1  ;TIMER1 INTERRUPT
ORG 0023H
LJMP UART1    ;UART1 RECEIVED INTERRUPT
ORG 002BH
LJMP ADC      ;T2
ORG 0033H
LJMP LVD
ORG 003BH
LJMP PCA
ORG 0043H
LJMP UART2    ;UART2 RECEIVED INTERRUPT
ORG 004BH
LJMP SPI
ORG 0100H     

------------程序部分-----------

ORG 1700H ;數(shù)據(jù)部分(共256字節(jié))
DB 00H,40H,41H,3EH,41H,40H,41H,3CH,41H,40H,41H,3EH,41H,40H,00H,3BH ;0 16 0F
DB 41H,40H,41H,3EH,41H,40H,41H,3CH,41H,40H,41H,3EH,41H,40H,41H,39H ;0 16 1F
DB 41H,40H,41H,3EH,41H,40H,41H,3CH,41H,40H,41H,3EH,41H,40H,41H,3BH ;0 16 2F
DB 41H,40H,41H,3EH,41H,40H,41H,3CH,41H,40H,41H,3EH,41H,40H,41H,37H ;0 16 3F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 4F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 5F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 6F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 7F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 8F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 9F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 AF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 BF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 CF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 DF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 EF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 FF

編譯之后,顯示CODE=6144 (1800H) ,如果將數(shù)值部分(ORG 1700H)部分COMMENT, 編譯后
CODE=5926 (1726H),  顯然如果包含ORG 1700H 的數(shù)值,CODE的后面26H字節(jié)會被覆蓋, 上載到單片機(jī)后會出現(xiàn)意想不到的錯誤,如果不能警覺這個問題,會DEBUG到暈倒,把 ORG 改為1800H后,一切就正常了,但為什么編譯器不會發(fā)現(xiàn)問題,沒有任何警告呢?
回復(fù)

使用道具 舉報

12#
ID:624769 發(fā)表于 2022-7-29 03:59 | 只看該作者
dalaoshi 發(fā)表于 2022-7-29 03:12
近日有所發(fā)現(xiàn),KEIL4在編譯匯編語言的時候,無法發(fā)現(xiàn)偽指令ORG所指定的位置會覆蓋生成的代碼部分,比如:
...

所以, 如果需要絕對定位的盡量用 CSEG AT 1700H  這樣的格式, 盡量不要用 ORG 1700H 這樣的格式。
假如不需要絕對定位,就盡量用 RSEG 讓KEIL來自動 分配。就不會出現(xiàn)你遇到的問題了。
回復(fù)

使用道具 舉報

13#
ID:401564 發(fā)表于 2022-7-29 06:44 | 只看該作者
dalaoshi 發(fā)表于 2022-7-29 03:12
近日有所發(fā)現(xiàn),KEIL4在編譯匯編語言的時候,無法發(fā)現(xiàn)偽指令ORG所指定的位置會覆蓋生成的代碼部分,比如:
...

STM32搞了個代碼生成軟件,引腳選好了,就生成代碼給你,復(fù)制就行,為什么呢?因為ST覺得直接用C語言去寫代碼太麻煩了,給你點幾下鼠標(biāo)就有代碼了
你倒好,覺得C看不明白,倒退回去用匯編
在單片機(jī)片上資源越來越豐富的今天,匯編只能不斷的放棄自己的江山
玩單片機(jī),會匯編是好事,但并不是說什么都是匯編
而且,不是我說你,你就算是用匯編,但也對匯編并不了解,竟然去懷疑編譯器
在你使用了ORG 1700H之后,1700H以前空間都會被使用,不管有沒有代碼,代碼長度都是以O(shè)RG 1700H+后面占用的空間為總長度,那么你這個代碼總長度就是1700H+所有的DB=1800H
如果你不用ORG 1700H,代碼總長度就是你其它代碼+DB占用的空間
可以計算出來,你匯編的代碼如果沒有DB這一部分,長度就是:5670
這么多的代碼,估計問題就出在別的地方,要么是這DB部分放在代碼中間了,查表的時候也許是指針指過頭了,程序就到處跑
回復(fù)

使用道具 舉報

14#
ID:283954 發(fā)表于 2022-7-29 17:53 | 只看該作者
Y_G_G 發(fā)表于 2022-7-29 06:44
STM32搞了個代碼生成軟件,引腳選好了,就生成代碼給你,復(fù)制就行,為什么呢?因為ST覺得直接用C語言去寫代碼 ...

開始寫的時候,把表放在1700H就覺得很夠了,后來程序越寫也大,終于超過1700H的范圍,而編譯器編譯時沒有任何警告,上載后運(yùn)作就發(fā)生異常了,我之所以能比較快意識到這個問題是因為我貼了一段新代碼在最末尾,運(yùn)作時發(fā)現(xiàn)該代碼沒有運(yùn)作,將該段代碼轉(zhuǎn)到中間部分,再運(yùn)行時該代碼就有運(yùn)作了,這才發(fā)現(xiàn)問題所在,為了讓其他用匯編的網(wǎng)友警覺,就貼上來分享了。

C語言的確強(qiáng)大和省事,但只會用C語言永遠(yuǎn)不可能玩出D,F(xiàn),G。。語言的。
回復(fù)

使用道具 舉報

15#
ID:883242 發(fā)表于 2022-7-29 18:50 | 只看該作者
dalaoshi 發(fā)表于 2022-7-29 17:53
開始寫的時候,把表放在1700H就覺得很夠了,后來程序越寫也大,終于超過1700H的范圍,而編譯器編譯時沒有 ...

編譯的時候絕對不可能報錯或者警告的,如果你了解編譯連接過程的話。如果要警告,那也是BL51.exe連接器給出警告。
回復(fù)

使用道具 舉報

16#
ID:401564 發(fā)表于 2022-7-29 19:16 | 只看該作者
dalaoshi 發(fā)表于 2022-7-29 17:53
開始寫的時候,把表放在1700H就覺得很夠了,后來程序越寫也大,終于超過1700H的范圍,而編譯器編譯時沒有 ...

這本身就是你的問題呀
編譯器只會執(zhí)行你的代碼,它只會識別語法和硬件上的錯誤,比如RAM使用過頭了,或者是少了個逗號沒寫
至于代碼本身的邏輯問題,它是不會有什么警告的
匯編只有在個別極限要求下,比如時序嚴(yán)格到一個時鐘,或者是內(nèi)存實在太小的情況下,還有優(yōu)勢
其它的,什么所謂效率,了解硬件的.......一點優(yōu)勢都沒有
玩單片機(jī)的,只會C不會匯編的人,大有人在,你敢說他們的技術(shù)都是在你之下?
嚴(yán)格遵循C語言規(guī)范寫出來的程序,不見得比匯編差
不知道你玩不玩王者
匯編只作為一個BUFF,有BUFF你就打得過人家?
我之前就是用匯編的,現(xiàn)在基本就是只要能用C的,絕對不用匯編,連都不想看一眼
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费观看av| h视频免费在线观看 | 成人精品一区二区 | 欧美日韩在线精品 | 手机在线一区二区三区 | 丝袜美腿一区 | 成人深夜小视频 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲精品1| 激情六月丁香 | 91精品国产综合久久久久久丝袜 | 在线视频一区二区三区 | 久久久精品久久久 | 亚洲电影一区二区三区 | 日韩一区二区黄色片 | 亚洲国产成人久久综合一区,久久久国产99 | 91就要激情| 日本精品一区二区三区在线观看视频 | 999久久久免费精品国产 | 国产精品美女www | 日韩有码一区二区三区 | 久久免费视频在线 | 国产成人精品一区二区三区在线观看 | 日韩精品一区在线 | 九九在线视频 | 国产aⅴ| 激情欧美日韩一区二区 | 久久av一区二区三区 | 精品国模一区二区三区欧美 | 欧美亚洲视频在线观看 | 蜜桃在线一区二区三区 | 久久99精品久久久久久国产越南 | 超碰免费在 | 九九热国产精品视频 | 久久伊人精品 | 亚洲精品国产第一综合99久久 | 欧美在线一区二区视频 | 中文字幕一区在线 | 国产乱码精品一区二区三区中文 | 91久久久www播放日本观看 | 999久久久久久久久 国产欧美在线观看 |