找回密码
 注册
关于网站域名变更的通知
查看: 272|回复: 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,答案正确吧?
* Q; P2 L5 X; P# f! ?
* c0 Y' n) e, c. e;C语言:& o5 v: ]: C: b) r4 i' x2 \1 L) |
8 Y% U1 V' ]4 O( R0 A& @- _
;============================================
- k9 q1 v( f, c0 m" y5 B" ];16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0}
* h- c# M& P2 \% L" G7 F& x  N& f, A
;define MD3 (*(unsigned char volatile xdata *)0xfcf0) # x. D* ^; x4 s7 r  c- b; Q
;#define MD2 (*(unsigned char volatile xdata *)0xfcf1) ) |2 X2 b& z4 T5 B) R4 k
;#define MD1 (*(unsigned char volatile xdata *)0xfcf2)
6 D+ b' ?, o( R+ |) C;#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
! A6 B4 `% P. t; k! v9 b. \! V;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
) H7 b( e5 E. b8 A5 d;#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
  Q& \0 a0 w1 d1 J4 Z; p;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6)
$ C  d- n% M+ Y1 e;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7)
* @' V. ]# p$ ~;sfr              P_SW2                =              0xBA;            
  |( {+ G( `4 t# R: L; q/ Y% J, |;//////////////////////////////////////////////////////////////////////////////// % z0 T0 F+ @) \6 g' R! G7 T9 J, C$ a
;//16位乘16位//////////////////////////////////////////////////////////////////////////////
- B  E4 C* i! m! Z/ r% D;// unsigned long res; unsigned int dat1, dat2;
) R9 ?" Q1 v8 H3 j% d* o_SW2 |= 0x80;     //访问扩展寄存器xsfr; k$ D+ p% H# p3 y
;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定
( S8 ^: N/ F5 c9 b, N# C- G;ARCON = 4 << 5;    //16位*16位,乘法模式. Z' r9 K- Q7 A# m
;OPCON = 1;         //启动计算2 ~9 ^  c; `) J, m+ q  \( P$ p9 Z4 M
;while((OPCON & 1) != 0); //等待计算完成
5 L9 s) p7 J# O- \;res = MD3U32; //32位结
+ [% z, U7 M; I  g1 z6 D1 H# S% z- v+ \) T
;汇编:
% b& K9 L+ x& Q* A$ A0 P7 j  g) KHEADBUFFER1 EQU 0A0H
' ^6 ?. K; j# K! h+ R4 ELASTBUFFER1 EQU 0FFH   ;第一组缓冲区& W% ~! @2 d1 N$ i
AUXR EQU 8EH$ f8 b/ k+ i* ^
AUXR2 EQU 0A2H+ b' a* h9 M7 n8 W" z
WAKE_CLKO EQU 08FH   4 c/ L% O9 A; |5 T% ?. Y

5 Q+ }4 K! F3 |6 J8 nMD0 EQU 0FCF3H# \! k8 U0 U6 M8 q' v  U7 I
MD1 EQU 0FCF2H* l7 M+ {) j8 f+ K8 @: K# T
MD2 EQU 0FCF1H
$ x3 f0 e; Q6 Z' T- H9 O4 b/ iMD3 EQU 0FCF0H
( U$ U& T; J% |5 v! {; oMD4 EQU 0FCF5H: t/ V3 ?% ^, i  b5 [) \
MD5 EQU 0FCF4H
9 S3 L; k; {9 G, ?2 ~ARCON EQU 0FCF6H5 [* O( K( @/ ]# q
OPCON EQU 0FCF7H
  n/ f3 a$ B0 `5 r/ Z$ ~; \P_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写5 W( i: R% i3 {; O2 [2 V

4 b7 T, w) E8 ]0 `( E$ q4 yORG 0000H, e+ \8 r* p7 Q1 M8 G
LJMP MAIN% W, b( |- \* h( S9 \+ S/ A7 ^
ORG 0023H
0 s* f# N: v! _! {* a( nLJMP UART1    ;UART1 RECEIVED INTERRUPT
- }, C" v. ]6 g0 s! fORG 0100H
, j7 [3 \! O: u4 m5 w$ Z
) X% T9 K9 V/ k  r/ s4 R5 DMAIN:
2 V& @* M5 Y# g% HLCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4; K# i$ \: O% e
LCALL DELAY17 x" C/ x7 E& q7 Q; _  J1 E
LCALL DELAY1- y+ |7 {; G* P2 d: e

' M# D9 D$ j# e) Q. ?0 aLCALL IOSET
" P8 o) e8 G4 K% v
3 x# Y( \$ U- W* V; UCLR P1.0- a3 t2 _- V! _1 ?9 n$ E4 t

8 z( w1 B  [/ R9 X! a: v/ oMOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.48 X; l( Y5 P5 c2 B& K3 ~
MOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS ( u; Q+ F3 O- Q9 w
MOV AUXR2, #00000000B        ;#00010000B=SHIFT UART23 ~5 x1 [) {7 {/ s
MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)4 t) f: U8 u( @
                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0)
" N: ~5 ~* c1 J' t7 m( f6 ^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)
( n! l7 d' A$ H8 x; [# @
+ b! M) c9 `/ j/ B- RLCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
  l) w1 ^) ^$ t7 |" ICLR RI1 _* N9 E1 `- s! H
CLR TI  w: P/ C& ]. @5 C* D; x( h
SETB  EA                  ;ENABLE ALL INTERRUPT
/ ]$ ^2 C5 I. y6 R/ L, l
8 }0 m' t7 D' j% z2 hMOV P_SW2,#80H            ;访问X寄存器打开
4 c( k, C3 d# j, O
3 E* L2 G8 g# j" u/ V7 K7 fMOV DPTR,#MD1             ;
/ g, X6 c: L+ Y  S  OMOV A, #01H               ;必须通过A才能送到
+ }' d  o. D  @! Y$ A0 pMOVX @DPTR,A2 ]) L7 C$ ~' @* U

" Q" M3 B9 v( g8 g3 y+ a$ bMOV DPTR,#MD0             ;7 z% Q" ^* g) Y* z  |. {0 B
MOV A, #07H               ;必须通过A才能送到
+ s3 R2 u. g; r- R$ M  g! h2 bMOVX @DPTR,A
/ \1 @- p& |$ m4 v- g; A7 v
& d" [& ^; }& {1 IMOV DPTR,#MD5             ;
* u! q' A+ _) U* i3 M! ], p, w$ t! VMOV A, #02H               ;必须通过A才能送到
! H7 p/ q1 U& bMOVX @DPTR,A, M& U2 I+ F9 o" O
8 K1 P5 U4 a0 U2 @5 @) J) o
MOV DPTR,#MD4             ;
! v/ G5 M8 X5 W8 V  M) K. vMOV A, #08H               ;必须通过A才能送到
5 A' _; i& S5 A$ m" @5 i! N9 \/ QMOVX @DPTR,A
# M; o; e. h) f+ B; O4 X* c
' R7 W' e0 I* Y* b& F6 i) \MOV DPTR,#ARCON           ;
4 `/ u0 T0 V) V: t# BMOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16 6 N& I! P9 K$ U) S' `" t
MOVX @DPTR,A+ f: v0 V. _! ~5 l" [3 A* x5 U
0 w( H% R4 T5 E8 k9 E
MOV DPTR,#OPCON           ;启动运算8 F9 B) D" z( h1 \6 G0 {- E) Q0 T
MOV A, #00000001B               N7 A2 _% {' U5 E5 ]1 V
MOVX @DPTR,A5 w( ^) v2 @2 U: J) p

6 |2 ^3 y2 O6 z: H- IWAIT:
1 @/ g  g- I1 B# S; S5 i) |MOVX A, @DPTR: F3 R8 I' k' F
ANL A, #00000001B
5 o/ X8 W( y+ s- T9 q% J$ lJNZ  WAIT
- H5 q8 Z2 A! H! _! g+ E) ~7 `: X
MOV DPTR, #MD3            
1 q! u' l) `; S2 s) N; X" UMOVX A, @DPTR
" F6 F9 o$ i9 {9 Y- R. e- r$ Q; {$ e2 a1 o5 l9 E1 C
LCALL SENTONEBYTE1
+ u# v- s2 E1 V: z
" X- g5 B  B/ o- Z6 \: g* RMOV DPTR,#MD2           , y! b& l( n: f0 M! ?; `4 @
MOVX A, @DPTR# w6 o. w+ E+ w+ j+ M, _
1 o4 B/ h) K+ u2 \& l
LCALL SENTONEBYTE1
' m5 ~% C' \- E, Q5 w6 Q; U; A. R+ Q, C) M  d
MOV DPTR, #MD1             4 @+ w' u8 ^3 T9 s
MOVX A, @DPTR5 a) m* h; g0 P

" v8 M5 V% z: i- z( HLCALL SENTONEBYTE1
! j0 v# g# O* g2 X+ X' \. r) M
' V, K% a1 R  u+ zMOV DPTR,#MD0         
/ F8 O& R# G$ D+ @# oMOVX A, @DPTR# R& N( i+ e7 o/ U1 k5 f
4 l+ L) \3 D2 b
LCALL SENTONEBYTE1% T. q8 G1 F2 }3 G1 Q+ }) m
  z) g/ h" ~* H! x8 w: m$ x* {& p
MOV P_SW2,#00H            ;访问完毕要关闭& _8 Y, f- f5 q# R& y  ^! u4 K

1 ~3 N% ]  a# Z' l1 hLED:                      ;停机# ]% k% u$ ], h; S( h2 u

7 X! ]$ |% e. |5 C; t* TJMP LED1 Y7 X, K' w, E

- R. D1 X% a- B0 a) e2 yNEXTBUFFER:
7 B0 q9 ?5 F. G8 d# V/ q/ B7 WCJNE R0, #LASTBUFFER1, NEXTBUFFER2' l5 N' [: V5 Q
MOV R0, #HEADBUFFER1! s: w& J4 a+ S( t
JMP NEXTBUFFEREXIT
! P  C( F$ A+ J# \# F8 m0 nNEXTBUFFER2:9 s" U1 N; p3 P: {  Z
INC R0  OINT TO NEXT BYTE
. S, r* t7 T2 T& uNEXTBUFFEREXIT:8 x7 u2 {" ]" {, U# M5 b
RET2 v# k$ A2 c" p3 Z3 A9 H

) \4 Y$ I" q# FSENTONEBYTE1:                ;SENT OUT A
8 }; i7 x) s" V0 kCHECKBUSY1:
7 k. k$ }3 g4 E  ?/ x: VJB 40H, CHECKBUSY1- }# J" X" Q" ?/ q- F0 M! v: T2 ]0 b
SETB 40H
" L! y" y( Q3 l2 y7 ~% QMOV SBUF, A
% ?6 x0 D# ~* W* f: ARET! g! G/ t' O1 {; a
: R. I0 N6 a. L! E# m
UART1:      ;RECEIVED DATA FROM AIR* _6 V) z. u* Y4 v+ K4 ?
PUSH ACC& _6 J3 ?  Z3 S2 f6 s1 p2 i1 O
PUSH PSW% k8 |2 Y1 d* S6 J- b5 Z; T7 N" _
JNB RI, UART1CHECKTI; C& x5 {$ `/ s) Y
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
- Q" R8 k1 n/ a' I$ K) U) }CLR RI      ;CLEAR RECEICED FLAG* [+ p7 E' Z, j
MOV @R1, A  ;SAVE TO BUFFER
0 O; z4 t3 ]; s! FCJNE R1, #LASTBUFFER1, NEXTREADBUFFER
* n; i4 D+ c8 W7 DMOV R1, #HEADBUFFER15 h3 V8 W7 Y5 b; P; O, z( T
JMP UART1EXIT
2 m' L) n! S6 U) q$ ZNEXTREADBUFFER:
% n. p( k' u2 b* ~% NINC R1  OINT TO NEXT BUFFER8 U+ f6 W# s' v, J3 f
JMP UART1EXIT
, E4 {  k; D$ |; d2 `+ U4 jUART1CHECKTI:7 `! {. I. @. w4 W8 R
CLR TI
- ?3 r, s( ^) o0 j+ s6 B$ KCLR 40H      
  ^- y0 e1 a6 b/ P) i0 uUART1EXIT:
0 y  B2 s) ~0 T/ L5 _1 yPOP PSW, F) J5 C; Y- {: Q
POP ACC3 B8 K4 |( {" q, M/ B% S( J; o4 E  x
RETI* }; \7 `1 v1 U+ }2 a+ @
# B0 {. v: W/ |$ k% B4 L$ `
INITIAL_UART1:           ;115200
% `0 P+ O) K! k& ^! bMOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
* e1 y0 ]& U. MMOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0    & `# n/ |' v8 V3 ?$ M* r! A. f
MOV TL1, #253, |5 D5 b6 l- \  p! ~! I$ i2 Z/ }
SETB PS                  ;SERIAL PORT PRORITY HIGH! G0 r9 @: m9 a# S/ ^, Q  ~
SETB TR1                 ;RUN TIMER_1
3 z4 S; b( l8 j# }! h6 o# kSETB ES                  ;ENABLE UART1 INTERRUPT
( `, Y* i) k1 I% ZRET3 O7 \$ D! }$ K- g
* a6 s! B% t5 {3 ]& T! s
IOSET:
0 O4 H7 C4 ]# \8 K8 \  e* ^1 [;-----------I/O CONFIGUE
6 o1 z+ V6 ~* J2 oMOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT
3 d4 d, y/ y0 `: S5 FMOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)) p  [" V8 B' I/ g( T% P6 n4 I1 X
MOV 91H, #00000000B      ;SET P1& N3 t1 M1 f, m. j4 D, v* b
MOV 92H, #00000000B      ;SET P1) G8 `8 U* d* M1 e! D
MOV 95H, #00000000B      ;SET P2' h3 I& K9 g0 m8 }$ `, l, B
MOV 96H, #00000000B      ;SET P2
/ V) t5 [$ M# x, n+ Q; ZMOV 0B1H, #00000000B     ;SET P3
- ~! T! |, ]9 nMOV 0B2H, #00000000B     ;SET P33 s' V/ L% s# P" O; d0 s  i
MOV 0B3H, #00000000B     ;SET P4 8 L  o9 i$ u# S2 {1 W3 t! I
MOV 0B4H, #00000000B     ;SET P4( f8 D: z+ y, I: ^" U6 a: V' c; p
MOV 0C9H, #00000000B     ;SET P5
% W$ s4 k: ?' R! R' KMOV 0CAH, #00000000B     ;SET P5, H4 z1 i  b! G5 G. v# K
;MOV 0CBH, #00000000B     ;SET P64 `; D2 ?7 I7 e: g
;MOV 0CCH, #00000000B     ;SET P69 I6 b2 N( K( ?1 T! a
;MOV 0E1H, #00000000B     ;SET P7
! k+ c& _* m1 d& ~( V;MOV 0E2H, #00000000B     ;SET P72 p" Z6 O& D( a% j6 k
RET
% `* A& c5 N. u' `* c3 g+ m- J; A0 e' D8 ?
DELAY1:
6 G- g. a5 q# hLCALL DELAY2) `  i8 V6 V0 t9 o0 Q/ o
LCALL DELAY2
* x3 F& {9 Q+ ~. CSETB P1.0 # z' G  R8 g1 Z& j; p. T( r5 `6 C* `
LCALL DELAY2
2 ?  T# @' R( PLCALL DELAY2
7 E1 m9 c0 M3 x' a* l) I% VCLR P1.0
3 w4 @9 l1 E( x% s# }6 J0 qRET
9 \  t! ], W: D$ r
* |9 r/ M. M/ [% ~DELAY2:
' ~" s. H; N; Z, z2 w5 yMOV 35H, #255, ~, U+ @1 v. W& ^  h3 p
SLOWDOWN0:1 {6 l7 v, c# r. q4 P
MOV 34H, #170
: w+ q7 M. S8 i3 \. wSLOWDOWN:
& I& ~/ l9 O5 f' Y( VMOV 36H, #2
) a/ Y5 r' ?$ w. A+ PSLOWDOWN2:
# e+ P" h7 `/ T3 p5 D2 vDJNZ 36H, SLOWDOWN2
+ O5 {# E: _4 p6 w5 B4 N, uDJNZ 34H, SLOWDOWN
/ F/ \: W; \& d; p: QDJNZ 35H, SLOWDOWN0) c" y7 n4 C6 b& `5 `! Q) d
RET
+ e7 B- i) [4 |( |
4 T4 P- R) G& w$ P* g: lEND4 y4 [6 V) B$ N. M

  S1 d3 ~5 m% N

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是
, s6 \" e0 J4 _  z# B啊啊啊,

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-11 22:06 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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