找回密码
 注册
关于网站域名变更的通知
查看: 244|回复: 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,答案正确吧?) _0 W& w: G; x8 @% @  T
8 e* k. ^0 o* s( ~
;C语言:
/ P$ D: M; |+ d' E7 Z. ~6 M% e; e  Y: O2 i" W3 d+ o  A7 g
;============================================" F# I# K8 v1 h3 C8 S; o
;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0}
# V! T; k( V) b  ]6 H6 m& K7 c0 r
8 D. o+ `0 l1 O0 q( ^$ I;define MD3 (*(unsigned char volatile xdata *)0xfcf0)
; d, Z$ ]" r" n;#define MD2 (*(unsigned char volatile xdata *)0xfcf1)
0 k5 ~4 c, O6 g5 B, Q- Z& S% t;#define MD1 (*(unsigned char volatile xdata *)0xfcf2) 9 p1 @( n/ ]0 p1 }& d
;#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
1 p: Z$ u. f, f8 C! I;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
. G8 o+ x) K4 @* R( D& ~3 O" V, z" z7 U;#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
7 _& K: T8 g" q$ s" _8 X;#define ARCON (*(unsigned      char volatile xdata *)0xfcf6)
. O. u$ q. F3 i. ~0 M( k# U;#define OPCON (*(unsigned      char volatile xdata *)0xfcf7); G4 T. b; ]% n4 d7 w+ i* H6 e
;sfr              P_SW2                =              0xBA;            
2 r% V2 M+ @/ v  k- u7 b;//////////////////////////////////////////////////////////////////////////////// . w" m& r* j5 A: {9 e: I
;//16位乘16位//////////////////////////////////////////////////////////////////////////////
1 h4 E$ ^0 z4 `/ [;// unsigned long res; unsigned int dat1, dat2; , d& h. L4 {, U' ]- y( U
_SW2 |= 0x80;     //访问扩展寄存器xsfr
# N8 X) G6 A0 W& m$ \0 v;MD1U16 = dat1;     //dat1用户给定MD5U16 = dat2; //dat2用户给定
; {9 Y* b' k5 `1 _( g! J% M( W/ d: a;ARCON = 4 << 5;    //16位*16位,乘法模式
% }; R! S4 F8 y9 y7 x3 \$ h! Y8 p;OPCON = 1;         //启动计算
' R8 {: A- }1 d% j; d;while((OPCON & 1) != 0); //等待计算完成) d+ L  Q  _& \
;res = MD3U32; //32位结
4 p" i# N  }4 h: m7 [: q; g% r2 x! _  t5 n2 R( J
;汇编:5 h) R0 j. F( n0 z5 Z$ `! F
HEADBUFFER1 EQU 0A0H9 D0 ^$ @& P0 A+ D! f
LASTBUFFER1 EQU 0FFH   ;第一组缓冲区
2 n# Z! v, h- U+ h$ w# {AUXR EQU 8EH8 a- ^3 ~; L4 u- `4 @* d
AUXR2 EQU 0A2H
$ N0 t. M! U+ DWAKE_CLKO EQU 08FH   
$ h  l: h" j+ g9 z- C3 y- S# V) @7 d% B7 I( _; v/ i
MD0 EQU 0FCF3H9 w! s. @/ Q. N, u; L
MD1 EQU 0FCF2H
' S) [  U4 Z7 ?  {MD2 EQU 0FCF1H( ~5 R- O1 D3 A0 Q2 q' I' {
MD3 EQU 0FCF0H
2 X. z8 ?! x6 U; {7 }MD4 EQU 0FCF5H
/ V5 f# O' `  U4 n9 C3 xMD5 EQU 0FCF4H
$ Q# F) i3 S; t! TARCON EQU 0FCF6H
$ k* r4 [2 m5 q6 f8 u3 D8 WOPCON EQU 0FCF7H' ]* B( t( e# H
P_SW2 EQU 0BAH            ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写
+ M% r6 R9 q9 Y4 i. C' @* f: }
; V: w! _6 ?3 I: Q" hORG 0000H' v, g# i1 l- Y! d" j8 s
LJMP MAIN( d8 |$ k+ c8 V4 `. \) o3 x, S: f
ORG 0023H$ \: L4 o& P# S3 y- z6 g$ @% N, l' d
LJMP UART1    ;UART1 RECEIVED INTERRUPT
. d: J1 G. o+ A$ q) ^) ~ORG 0100H
# v% D; Y4 J5 {$ y- T
5 M( y+ _. L, F- L# N5 G) |MAIN:* x% L2 B# `" N
LCALL DELAY1  ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4' |( x1 [; x, d  w0 g
LCALL DELAY1
) v' m. A5 P8 F  H2 T) J2 GLCALL DELAY1
, o  t- b" g# n4 y8 W  [8 {" i) B7 ?
LCALL IOSET
% s: r, M$ O& w/ u9 S, s  e5 x0 w! D: h- r" ]7 t9 c: `
CLR P1.0( W$ b' ?3 @+ q  Y) H3 i3 O5 M
( Y' d2 Q/ c# P) `: ?$ k. _
MOV WAKE_CLKO,#00000001B     ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4
3 q( Z4 \5 R" E, T# l+ G" j( BMOV AUXR,#11111100B          ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS 8 J- ~1 m! \1 t
MOV AUXR2, #00000000B        ;#00010000B=SHIFT UART2
, ?6 V. D/ p9 ]5 _MOV TMOD, #00100010B         ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)- n! @/ c4 i; ~+ V) @
                             ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) 2 s: r4 W0 m  p2 [) z. S
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)
+ U8 x: Y; p! S5 K# |
7 v) U+ X3 Y2 Q6 hLCALL INITIAL_UART1        ;USE T1 AS SERIAL BAUD GENERATE FOR UART1 9 U5 F3 \& c; a5 O2 u
CLR RI$ H& B' @% H# f" u- s
CLR TI  L, j6 ]( X$ M: s/ w8 }+ S9 ^
SETB  EA                  ;ENABLE ALL INTERRUPT! E5 r. ^! q3 h: i: a1 a, X; T! n
% r. o! j! y  Y7 P  A7 X
MOV P_SW2,#80H            ;访问X寄存器打开
7 `7 d% H2 n4 j% w( ?# ~8 ^! Y1 h7 _+ q* x8 W4 p% p
MOV DPTR,#MD1             ;4 l2 q7 _1 j9 n7 j0 [
MOV A, #01H               ;必须通过A才能送到
/ \& y" Z9 j# ]+ x6 }% Z7 sMOVX @DPTR,A* l3 X( |5 E1 k
$ s) L5 `- N/ i
MOV DPTR,#MD0             ;5 L  X% e0 C1 W  j& B! q2 r
MOV A, #07H               ;必须通过A才能送到# M4 |3 B* s, Z5 L" x
MOVX @DPTR,A: ~3 ]9 W' Z- j: O' l' w' i

4 G! o! `% h/ i8 A. x  MMOV DPTR,#MD5             ;
3 j+ U' Z8 D' KMOV A, #02H               ;必须通过A才能送到
9 a3 x9 x& X: m! E4 @MOVX @DPTR,A, z8 O. U' r1 P% j- W9 h

, F. W6 H7 j+ ~- Z* q0 AMOV DPTR,#MD4             ;
$ B  [" q" O' P3 n# y7 N/ RMOV A, #08H               ;必须通过A才能送到+ z$ H5 P; P% U* s
MOVX @DPTR,A
2 }+ Y7 N1 r+ A, M% N4 _: S
( d2 m) @8 i2 U! N8 j3 P! I: HMOV DPTR,#ARCON           ;
, x; j) J- v& N7 u' A! B! k5 ~MOV A, #10000000B         ;b7,b6,b5 4=16X16 5=16/16 * e9 I9 f, F( U1 v8 B. e
MOVX @DPTR,A
# P$ P: ]$ K- r' O# n
! m; l) x# J8 Z" f: _8 jMOV DPTR,#OPCON           ;启动运算& F& O) Z' e$ p6 Y- V$ a% K5 o
MOV A, #00000001B             2 J) }+ ]# u1 P0 ]6 a! \- k; o
MOVX @DPTR,A; U  X4 ^; a: D# ]- I
2 M( s- J5 m' C; [8 B2 q# d0 U
WAIT:3 T0 s+ o8 _! ^7 D
MOVX A, @DPTR
+ u, G3 x) D# i; x; ?! I+ vANL A, #00000001B
4 B: T" s0 m6 n+ a! qJNZ  WAIT( K3 w) d9 L( s0 L. S
2 ?9 E3 k8 F# g% h
MOV DPTR, #MD3            
# Z, q; e! v7 G) d6 ]" }4 EMOVX A, @DPTR& K. Y# I  C* p. D

) b6 A' I0 L5 A* D) ?. `5 I7 J5 cLCALL SENTONEBYTE1
4 {, }; @* [7 c5 Y6 R0 x* V& ^$ Q9 m" @
MOV DPTR,#MD2           
, e. g' _3 Q. q* K( }MOVX A, @DPTR
( i5 K" i4 i3 T' @  `2 |9 z/ ~) ?6 ~3 w6 }
LCALL SENTONEBYTE1+ C: Q/ `7 P% R$ @$ {1 A/ g' ?
7 k* v, }* x! V* R, _! V! v& U
MOV DPTR, #MD1            
5 y( U/ {% x* OMOVX A, @DPTR( r7 E0 s9 E1 I( a8 N

: I& z2 x/ m) J+ O. s  f, fLCALL SENTONEBYTE1
: p' i$ V6 |0 c) z
0 |# D1 `% u( L- [MOV DPTR,#MD0         
/ a4 t: h; e: J5 H- _* CMOVX A, @DPTR" J; E% @% l# G3 V1 _& f' u
* S/ G$ @" P$ D4 l
LCALL SENTONEBYTE1
- P3 ]$ z8 H# X. h+ Z
' c. S7 B, ?( wMOV P_SW2,#00H            ;访问完毕要关闭
7 a5 R* O: T0 J9 v  B! }+ Y# w2 \6 f5 C- \+ m
LED:                      ;停机+ T" n1 R* A# L
. ]2 `, V/ C; l7 Q
JMP LED
' x- t, ^* o& c
* A' h; K4 [. _) @. E! e1 U. dNEXTBUFFER:
$ K) _* |2 G7 ~! s, l+ LCJNE R0, #LASTBUFFER1, NEXTBUFFER2
0 E$ Y: x# I% @' _" UMOV R0, #HEADBUFFER1
2 Z" X/ N  g" ]JMP NEXTBUFFEREXIT
; o( C0 y9 ]5 JNEXTBUFFER2:! K' M+ D  ^. G) O2 g( V
INC R0  OINT TO NEXT BYTE
8 b3 n4 H+ `. f1 y( R5 ]3 c2 |- dNEXTBUFFEREXIT:* v5 H# k9 x2 w, w& H: q  ]
RET
# z! U3 f5 H2 i, G) |! P: k- {8 b
9 |& E3 E' }/ e9 pSENTONEBYTE1:                ;SENT OUT A
6 E8 t0 B- X9 x4 D2 C- P* k0 rCHECKBUSY1:
8 I$ `9 W7 k9 U$ M# HJB 40H, CHECKBUSY1
, n4 x! S- l" H) YSETB 40H
0 n& m& k: ]" w) f" iMOV SBUF, A5 k( D4 _2 u! y1 F
RET
4 f: p' \9 q1 P3 m: H0 f8 @( a0 a* |0 f
UART1:      ;RECEIVED DATA FROM AIR
! C0 T0 D  p5 b9 N* tPUSH ACC  Y- [* t. J& n
PUSH PSW* J: w, \3 @* x% j7 t. c5 X
JNB RI, UART1CHECKTI
3 v2 h5 r* G1 a+ {$ G4 OMOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
6 O* @1 e$ P# R( E0 }" vCLR RI      ;CLEAR RECEICED FLAG  |4 i6 r) {( ^: `  l6 X+ A
MOV @R1, A  ;SAVE TO BUFFER
2 S3 z7 C3 P; O4 h9 F6 c# QCJNE R1, #LASTBUFFER1, NEXTREADBUFFER' m' p! I2 A; M3 E$ |( Z
MOV R1, #HEADBUFFER16 {. W9 v+ C8 D0 F' {! n
JMP UART1EXIT
  U6 g, |7 c) c( yNEXTREADBUFFER:
0 {% L) ]; t9 [" S* j& t) nINC R1  OINT TO NEXT BUFFER% s" {8 B* ^" G0 k; S8 _* }. `
JMP UART1EXIT
6 P7 S$ V# X2 JUART1CHECKTI:" j8 m/ i# _# L8 [$ Y3 o$ i, U
CLR TI: R4 G7 K2 [3 ]
CLR 40H      ' P) `% x, D" c& C
UART1EXIT:: X+ O4 S5 R4 T
POP PSW
) t* M8 k) z# {POP ACC
5 W( L, ^6 S' f; l( wRETI( h- t* Y2 z' t% w5 g; Y( E* J- i

. {  T) P. ^! t1 [INITIAL_UART1:           ;1152000 g, g4 A% L2 p
MOV SCON, #01010000B     ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
0 F* V2 |& B3 b  y# |MOV TH1, #253            ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0   
; M8 {- A, V. n+ s$ ?% TMOV TL1, #253' p) w9 F( i! s9 n+ \  m2 V8 [) ~% o
SETB PS                  ;SERIAL PORT PRORITY HIGH
/ E& q" `  X- N- ~SETB TR1                 ;RUN TIMER_1
7 [5 R& P& v5 X6 h! O5 e" m" pSETB ES                  ;ENABLE UART1 INTERRUPT
( o" f# R$ z9 L: c% t* hRET5 E! [5 ~5 a$ W7 y
2 p, o% T( s; R# `) q. x
IOSET:3 q- I9 k  _7 h" r6 n
;-----------I/O CONFIGUE
- I- D: h) e3 W7 v9 RMOV 93H, #00000000B      ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT5 G1 k+ `; O8 d, R9 Z0 T
MOV 94H, #00000000B      ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT), V. [, ~& x) F0 y7 [, _) @
MOV 91H, #00000000B      ;SET P1" p" r9 m4 [: V3 K( K9 R4 ?. q
MOV 92H, #00000000B      ;SET P1. G8 r* ]" Q* p! o+ Q$ C
MOV 95H, #00000000B      ;SET P2
6 w5 W2 ]9 q7 ?$ [2 y, bMOV 96H, #00000000B      ;SET P28 x; C4 G0 I; J3 [4 \9 h, p& Y
MOV 0B1H, #00000000B     ;SET P3
; i# |! D; Y) U" L4 c& NMOV 0B2H, #00000000B     ;SET P3/ H) z8 s1 }; h. ^$ g- F
MOV 0B3H, #00000000B     ;SET P4 " d3 q2 y. a: s$ n
MOV 0B4H, #00000000B     ;SET P41 X" Z+ {5 f" S: ]/ V5 ^
MOV 0C9H, #00000000B     ;SET P5. L' B. |+ }2 O3 Q
MOV 0CAH, #00000000B     ;SET P5
" ?4 R7 y. U+ q1 p( N+ m/ `;MOV 0CBH, #00000000B     ;SET P6
* v& g: G4 l, L  {) r$ ]% k;MOV 0CCH, #00000000B     ;SET P65 j* ]; o5 o; \- p: k1 Q4 n5 j
;MOV 0E1H, #00000000B     ;SET P7) F& z# O7 \- j: z0 Z; {
;MOV 0E2H, #00000000B     ;SET P7
) e1 `  ^; `( P5 m$ ^* yRET
# J; G6 P% Y; Q6 H$ C  x
3 I6 i& ~' O, s8 |DELAY1:+ K& Z, K! w$ I: ?7 B( _
LCALL DELAY2
' ]8 q, o. R% N9 h2 YLCALL DELAY2; z5 h9 i3 x/ }# ]  r9 h
SETB P1.0 . K) T- H/ E" b! T2 v' ?
LCALL DELAY2
4 c# r& B0 m% a$ Y6 CLCALL DELAY25 Q  \) c3 s$ M: s
CLR P1.0
! E) D: \, U' k, v9 uRET  S# a; ]6 ?, c
: @. }4 @  N# w2 g% N' D# M' n$ L
DELAY2:! R1 r3 a; L3 w- m+ L% F/ u
MOV 35H, #255
% @+ X+ `8 Y/ pSLOWDOWN0:8 \$ w' \1 X) p) R. z6 _) e( c. H4 |
MOV 34H, #170
4 w8 S8 o7 V4 {, f' P9 m, C$ w' e7 n8 ISLOWDOWN:
6 y' N1 m2 f' a8 M4 f  N' [MOV 36H, #2/ @* Q  C; d2 U2 n7 f6 _
SLOWDOWN2:
$ E# H/ N4 c# n$ q( P4 Y8 ]) c, LDJNZ 36H, SLOWDOWN2 9 Z5 ?/ |, G+ u! _7 w- S
DJNZ 34H, SLOWDOWN
( b6 ]" j  k/ k" N# gDJNZ 35H, SLOWDOWN0
$ a. w; A% w5 i* `5 iRET
/ x5 `' B( y' O$ p9 e( s6 o
  T; L& B8 ~5 CEND2 @. Z  V9 @2 m

+ F. p2 B1 S7 m

该用户从未签到

2#
发表于 2022-6-9 10:05 | 只看该作者
(; P)是
& M2 v# C9 v3 S& [5 O- o# W啊啊啊,

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-18 16:48 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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