找回密码
 注册
关于网站域名变更的通知
查看: 263|回复: 3
打印 上一主题 下一主题

STC8G单片机MDU16位乘除法器C语言改汇编程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-9 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
最近需要用到16位乘16位,记得STC有硬件的16位乘除法器,看了说明书,找到了例程,却只有C语言的,看来汇编已经快被抛弃了,只好自己改写,C语言就是一堆难懂的符号,像这句“ARCON = 4 << 5;    //16位*16位,乘法模式"就看不懂,但只要看原理说明就知道,这乘除法器就设在传统51单片结构外,利用一个P_SW2的寄存器做开关,开关打开后,就可以用DPTR指针往外面的寄存器(MD0-MD5)赋值,再打开一个外面的开关OPCON,就会开始运算,等若干时钟后把运算结果读进来,再把P_SW2关闭就可以了。明白了原理后写汇编就很简单了。为了验证寄存器没有搞错,将结果通过UART1显示出来,网上有不少HEX的运算器,我把数字放上去计算,出来的结果都看不懂,最后是把16位的乘数和被乘数都转换成是进制,再用五元的家用计算器算出结果,再把结果转为HEX,0107HX0208H=00021638H,答案正确吧?
- g4 s9 b! Y( c" B9 K2 |/ P9 S9 b1 j/ z; p
;C语言:2 r& B/ H. `5 n/ J( ~! `9 m* B

& G8 i4 O2 m2 F. y$ [# c( `* Z;============================================& d5 s. }) l4 s& `6 l
;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0}
7 X! \) W/ T- q6 c' X; {2 ~- U# S. `9 V5 i) ^1 A
;define MD3 (*(unsigned char volatile xdata *)0xfcf0) 0 F! X7 P) B! h
;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) $ R7 t: V3 W/ U2 P, z
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2)
# @, _6 x, |& q8 }$ L;#define MD0 (*(unsigned char volatile xdata *)0xfcf3) : `) `6 f. X. Y* f7 p2 b
;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
' n7 z3 I8 F  A: R" i/ d+ n5 x;#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
% [1 T8 u, l: V2 ?9 `;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6)
# x) C$ I5 r/ {- W5 g; d/ {" ];#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)- Z" T1 t* @  R
;sfr              P_SW2                =              0xBA;             : ]4 _: M% d, @. D
;////////////////////////////////////////////////////////////////////////////////
. T6 E) n' n8 B+ B;//16位乘16位//////////////////////////////////////////////////////////////////////////////, @9 Y) H# L, e1 A2 Z( |
;// unsigned long res; unsigned int dat1, dat2;
- q/ O! d4 p* c% a7 m' g_SW2 |= 0x80;     //访问扩展寄存器xsfr
1 n+ I- k9 W% ?1 P;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定7 ^4 N- f( |  v3 o" |# T1 L5 [+ S
;ARCON = 4 << 5;    //16位*16位,乘法模式7 V3 T+ N3 W! J9 ?1 g# N
;OPCON = 1;         //启动计算" H5 `( Y! l& ~
;while((OPCON & 1) != 0); //等待计算完成4 k6 m4 @6 c! q0 i
;res = MD3U32; //32位结4 F) O! b& Y: ]* V% I" W
2 t- Z* x) D- i
;汇编:8 A: D/ n" y# X+ a) [
HEADBUFFER1 EQU 0A0H2 o; {1 W9 _- k' _
LASTBUFFER1 EQU 0FFH   ;第一组缓冲区
" N, n+ a3 P6 u  I3 J3 V/ W* H7 MAUXR EQU 8EH5 Q+ f- @  n; ?2 L- b
AUXR2 EQU 0A2H/ Q% y! |2 D3 B+ I
WAKE_CLKO EQU 08FH   
% _8 Z+ L8 U) y& q: d4 ?( a' c$ A3 K( n9 o- s' G: ~1 j( D7 }
MD0 EQU 0FCF3H
# E& T- ?  k. d! \( f7 M5 v$ H3 i$ vMD1 EQU 0FCF2H
$ }+ B( {# _5 O$ Y! C2 Y- J: QMD2 EQU 0FCF1H0 h: Y( R( X4 J, t. Z
MD3 EQU 0FCF0H- M* a' @( B) F/ M/ k% |9 j
MD4 EQU 0FCF5H, P( f3 i! N2 m: U' D( e7 g1 ?& b
MD5 EQU 0FCF4H/ u6 _% N7 `: H: @* {8 C
ARCON EQU 0FCF6H' D  l/ G0 n; }  G- E
OPCON EQU 0FCF7H7 v8 I" `9 L- I/ B, n5 f0 P
P_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写
+ M4 M, n7 \. x8 i' |9 B9 C9 C' e2 o4 U$ @* r
ORG 0000H5 P. m" _8 g  p
LJMP MAIN
  g0 q, B- K8 R$ [ORG 0023H
# c3 h4 h, X" YLJMP UART1    ;UART1 RECEIVED INTERRUPT7 R( l' g% R3 V: y. Q  _9 u: q3 \
ORG 0100H" s# Y; R  N' ^4 e

4 K' i, t3 G+ D. A+ K2 v/ PMAIN:
, c4 N# d8 N; b$ b3 G& D, \LCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4+ b2 V/ B! {( a% U6 v
LCALL DELAY1- {+ r, ?0 d+ k0 ?% R
LCALL DELAY10 y# Y; N! p! n( D& a& [+ a# \

% \0 U$ u" t# z0 DLCALL IOSET" l$ X/ Q) `# p. c/ d: K! y
1 z3 V- R& J6 d9 t8 j0 `
CLR P1.0
9 A' N* j) @! o/ t) M! i, R
& ?7 v- b6 y8 A0 A& u1 a5 zMOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4) B. X$ C9 q5 k0 k: s
MOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS   \& y4 Z) M# m. G6 [) z4 F
MOV AUXR2, #00000000B        ;#00010000B=SHIFT UART2
- b4 R& b+ ]! X5 a; S8 WMOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)0 V) ~( _; J1 R/ W8 S
                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) , b. y9 l6 u+ g7 R
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)- g+ B* C2 n0 W% C# s$ J
. K6 j! {5 J7 M0 L, m7 ~
LCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
' G- @7 l( n0 I: X  |( v1 N1 qCLR RI# [2 `7 q8 \( [: W( g* k
CLR TI; w# Q& {0 {0 T" t4 U
SETB  EA                  ;ENABLE ALL INTERRUPT
0 e. j$ p- e" E- j! I5 }2 g/ p
; K1 C7 M, L+ Y/ S/ dMOV P_SW2,#80H            ;访问X寄存器打开
. P3 k- Y. C( X3 R2 ~" X' L
7 M, j4 {. N& @% qMOV DPTR,#MD1             ;; w" x* X& Y( V4 s
MOV A, #01H               ;必须通过A才能送到2 f! E5 j1 m5 |
MOVX @DPTR,A3 v: J0 |" Y& b: M7 _
$ B% b6 {, a' ^) F
MOV DPTR,#MD0             ;
5 B( p! u  J4 e5 X. ^MOV A, #07H               ;必须通过A才能送到
" K8 M3 v9 m/ G% d+ x1 U+ Q$ CMOVX @DPTR,A
; u2 k+ t6 [% f* ?3 q# \% D! L/ j* Y, Z+ N3 \/ {' X
MOV DPTR,#MD5             ;
+ a- t$ ^$ q4 N& L% c0 c. |MOV A, #02H               ;必须通过A才能送到8 [$ S* R+ {+ b/ @: d4 B  p" W, b
MOVX @DPTR,A+ c  n# N* }+ R6 ^' S. m. e. ?; C

" \. b! y8 l" Q! Z& zMOV DPTR,#MD4             ;
9 Q" D9 K9 o5 W2 o, X, YMOV A, #08H               ;必须通过A才能送到
4 k3 d# \4 a" U4 F' i4 IMOVX @DPTR,A
( v' ~6 d8 H5 n/ ?& t& i# X0 @  }( w! p3 F, b
MOV DPTR,#ARCON           ;
# @5 T; `0 v) D# s6 T- {0 MMOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16 6 I3 A9 M; j0 l; _7 o. m
MOVX @DPTR,A8 u  X. T* I) @# p0 J1 k, j

* C& |. O* b! E; m9 dMOV DPTR,#OPCON           ;启动运算
9 Y2 U: c  |( ?1 ?, O+ W6 I. F& _0 \MOV A, #00000001B             ! t$ Z7 p: R3 ]7 `% _
MOVX @DPTR,A2 K( B4 C: Z1 _
6 T8 ?% N" m! t7 W; O$ K4 s. {3 S
WAIT:. ~% |/ e+ R$ O; L+ `% u! c
MOVX A, @DPTR3 t+ X3 ?5 Y% ?+ ?3 h4 V
ANL A, #00000001B9 F' R3 j8 W% _; R/ b" ?" o+ b: U) E
JNZ  WAIT3 U. G5 }1 o, p( J- ^! D6 T
6 ~! M  Q- }: {* q5 s
MOV DPTR, #MD3            
2 R: X2 ^7 A) ^8 t* _6 XMOVX A, @DPTR
0 c0 u$ y. @5 Q$ a4 H8 A  h. P2 J( v* _* u' p, ?6 {  d4 Y
LCALL SENTONEBYTE1
  {+ S2 D0 S% K7 v' V' K+ G6 F
. u( T4 L! N2 [9 p/ YMOV DPTR,#MD2           
4 D6 N( a% L* z! {. c7 ^3 Y. f0 ~; dMOVX A, @DPTR
/ V3 H2 x* m) f) G2 Y3 |* t: `
+ A  h7 O* _* x+ Q1 tLCALL SENTONEBYTE1
" Q0 ~0 H* V' d1 |3 p, B. v3 q4 o# P1 y, c9 Y; B
MOV DPTR, #MD1             9 k9 u& r) K/ [, n9 u+ ]1 [
MOVX A, @DPTR
& ^, O5 U  i/ u& @# L  @* ~
" b3 ]6 c% n; ILCALL SENTONEBYTE1
. E( j) y# ]+ G; M) n" s7 P- N1 E( w, Y6 B% b* J2 h3 e  A7 U5 T
MOV DPTR,#MD0         
3 w/ M9 {4 l- {8 r! v$ R7 rMOVX A, @DPTR( h6 b* N+ X0 P

$ ]% E( \3 ~! T: X/ [* Y! j  ALCALL SENTONEBYTE1
; r& W" [$ e) S4 M- m  m; W' y# D  w; q: u% N/ E
MOV P_SW2,#00H            ;访问完毕要关闭2 F2 V! Q0 x1 S+ r

% D! k3 ^0 V) j  g! y$ Q5 `" ^0 iLED:                      ;停机
( |6 L9 s2 N' @5 E3 Y3 u/ R0 }
3 V5 N8 ^: R5 YJMP LED
, K' J# x2 w  k( e, V9 r
6 h/ N' E5 u7 W. s0 ^. t4 LNEXTBUFFER:
- r& z- j$ p% R" y1 T* hCJNE R0, #LASTBUFFER1, NEXTBUFFER2
, p$ c6 _* ?9 E5 s! P. w  e2 bMOV R0, #HEADBUFFER1
2 g/ P! W8 Y& c, l' x8 B* PJMP NEXTBUFFEREXIT
* U) s  o$ P; I, nNEXTBUFFER2:* W  Y9 v4 }* ~
INC R0  OINT TO NEXT BYTE
0 x2 {2 \- m% @$ U" _& m  D8 ?0 A* ?NEXTBUFFEREXIT:
9 O7 D1 [4 E( w& ]8 KRET/ Q( r" \" ]) V+ D( P! N' z7 H: I

  x* n3 |# }% d& o( ?SENTONEBYTE1:                ;SENT OUT A
0 {2 r! O  A# r9 lCHECKBUSY1:
$ Q; C; H! S7 _+ j" TJB 40H, CHECKBUSY1# J/ d( q9 T* Z* X2 C. l( e1 V+ [
SETB 40H' k% v0 K- j/ E5 ~: }, v# k
MOV SBUF, A
7 z5 t2 H7 U! h) Z8 w/ o3 `RET
( X# E. M; H' T" P
+ j7 Q4 E$ A% GUART1:      ;RECEIVED DATA FROM AIR
( Y2 s+ M. b' x1 X1 A) iPUSH ACC7 p/ I0 R* \( d3 f+ O8 M
PUSH PSW& S; f- {6 T5 ?4 y1 A' F4 F
JNB RI, UART1CHECKTI
( e0 r# |- I' NMOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT" S& e7 g& `1 q- p2 X2 [
CLR RI      ;CLEAR RECEICED FLAG1 ^3 m% m9 y5 M7 z
MOV @R1, A  ;SAVE TO BUFFER
  X/ \0 J% U( Z8 zCJNE R1, #LASTBUFFER1, NEXTREADBUFFER
8 H# t9 O0 g, G+ {1 SMOV R1, #HEADBUFFER1
& ~$ o: G0 t; G6 }9 pJMP UART1EXIT
2 x/ S0 Q& o. yNEXTREADBUFFER:: l  C" f, ~" w/ L
INC R1  OINT TO NEXT BUFFER
8 K% Q3 m7 N, R4 pJMP UART1EXIT5 T) T5 H0 W" i7 G7 M) v1 s% |5 n. z
UART1CHECKTI:
7 T* U2 \$ y' O! l- HCLR TI5 R* }( ?0 F4 c& r3 W' E3 h( V
CLR 40H      
4 Z; w$ @  \2 N4 eUART1EXIT:1 u& o' }6 A# {1 J& |, k
POP PSW
9 Z2 f" s/ d+ n) _POP ACC
' s* w9 Y4 G4 BRETI
7 Y( J; z# q5 ~
0 z; h: ~4 W; i' I# }INITIAL_UART1:           ;115200' T' h" z& D7 Z
MOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK; z. s0 q' h* Q  k& F
MOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0   
  D& P, k, R* m7 m3 U/ M0 HMOV TL1, #253
! f( m4 `, B, A2 }# |# DSETB PS                  ;SERIAL PORT PRORITY HIGH
. U5 ?1 B3 c5 K. b8 `) w6 s* I* PSETB TR1                 ;RUN TIMER_1
, i' V# r8 f; s7 v+ h' d+ j( v+ RSETB ES                  ;ENABLE UART1 INTERRUPT
) u6 A9 U5 _, N* h% }1 }RET
7 T8 U( c  \/ E/ C& e0 n+ ]# c- M5 K$ L( d7 \5 J1 [
IOSET:8 d, }* j1 U6 n  \3 ^8 ~* N! T/ V
;-----------I/O CONFIGUE
( b" Z- S6 y# D/ _$ dMOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT- N' i5 f, q- `( x
MOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)
6 o/ f8 e+ [8 e1 u4 O3 v3 tMOV 91H, #00000000B      ;SET P19 `- \4 s+ U5 X5 U9 p
MOV 92H, #00000000B      ;SET P1
7 M$ p% [' y. U+ HMOV 95H, #00000000B      ;SET P2) z. r1 h$ w; b: n/ d2 I
MOV 96H, #00000000B      ;SET P2  B" K5 G& B9 [9 X
MOV 0B1H, #00000000B     ;SET P3
4 X. ]; w. Y1 ]0 M8 w4 ?( ^MOV 0B2H, #00000000B     ;SET P3
& v' T9 C# g( e% _$ D1 f) ?3 BMOV 0B3H, #00000000B     ;SET P4 ) M6 r$ y; @% w
MOV 0B4H, #00000000B     ;SET P4- @: _' T9 M2 o
MOV 0C9H, #00000000B     ;SET P5
: [. m7 E9 m0 \( H/ BMOV 0CAH, #00000000B     ;SET P5
# w$ t" C& M7 L" `' N;MOV 0CBH, #00000000B     ;SET P6
+ E5 a: a2 q; I3 ];MOV 0CCH, #00000000B     ;SET P61 I% |- ]# w: p2 ]$ V& X
;MOV 0E1H, #00000000B     ;SET P7
% @. N( I+ r& n: N. T, ~( B# i;MOV 0E2H, #00000000B     ;SET P7$ _3 U4 _( B* O$ F. u3 H$ o% R: x# o
RET+ P1 ^7 v3 c- [

: ]' Q. m1 Z+ C( h! a& {& EDELAY1:- L1 P$ X7 E7 M" c5 Z* F1 t
LCALL DELAY2/ o  h. m: M3 ?3 X. f
LCALL DELAY22 Z9 T( V4 G* U0 |' W; |
SETB P1.0 5 r5 X* ]$ g) e- ?7 ~& z' }$ X
LCALL DELAY2
3 e  o" C. d9 S5 j* \) J' MLCALL DELAY2' U9 h0 E. W8 L, }
CLR P1.0* P1 s7 I: H$ U- R. \+ t3 c5 J
RET
; v7 |* f/ O' T+ T
8 C3 }$ i; t* }+ w' d. X3 ADELAY2:
& g! G( @# Q6 D7 V- s( P0 b+ d2 AMOV 35H, #255. R2 D9 t+ Y% P. ^0 Y" t% i: d
SLOWDOWN0:
) J4 J& K7 ~+ W; @4 ]' PMOV 34H, #170
$ g" O# _; _! \  O' {; k  p0 XSLOWDOWN:
# C& N5 q0 v$ W; f: h) KMOV 36H, #2
9 z) _; W0 m' m3 TSLOWDOWN2:& n4 p% Z# x% _$ u% L- q$ e3 Y( R; u
DJNZ 36H, SLOWDOWN2
( u' `6 V1 y/ ?7 }" pDJNZ 34H, SLOWDOWN
) @" @/ X$ T( C- w7 i" z* wDJNZ 35H, SLOWDOWN0( H4 ]: j! n% C; _# `9 c
RET# H& ~/ g/ x* |0 a* R0 L" t

3 r3 M9 C. i; bEND$ y* P: j9 Q0 J( z
, _" d. U1 E6 _& S3 H0 {" e

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是
, v3 v9 t4 c0 W0 l啊啊啊,

该用户从未签到

3#
发表于 2022-6-9 13:54 | 只看该作者
逆向学习学习。啊哈哈哈

该用户从未签到

4#
发表于 2022-6-9 14:54 | 只看该作者
逆向学习学习。啊哈哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-18 21:24 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表