|
|
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,答案正确吧?. }) @& t3 G+ d( X) V& l B/ F) g
6 v: t# y7 `' v' p
;C语言:
( _5 W2 l& |: b- k
) j B; }4 z. E: }' w& K6 v0 v;============================================! N0 g4 e" V- ^/ M1 Q0 y/ K6 N1 B
;16位乘以16位乘法:被乘数:{MD1,MD0} 乘数:{MD5,MD4} 积:{MD3,MD2,MD1,MD0}
+ `' ]' ?, _; ]- M; ?7 T. D& {) ~' n5 s) o; h
;define MD3 (*(unsigned char volatile xdata *)0xfcf0) 8 L. ^2 T) J1 D& l3 \1 v
;#define MD2 (*(unsigned char volatile xdata *)0xfcf1)
# _$ N ?: Z3 F4 W/ j% K) k;#define MD1 (*(unsigned char volatile xdata *)0xfcf2)
* F% B/ h6 M: _+ f7 @' Q;#define MD0 (*(unsigned char volatile xdata *)0xfcf3) ' s0 Y2 M% A) o% m' A
;#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
% F( l3 x, `2 V;#define MD4 (*(unsigned char volatile xdata *)0xfcf5) : |; Z; F N' d
;#define ARCON (*(unsigned char volatile xdata *)0xfcf6)
# p1 n4 D+ p2 e% g+ b% o;#define OPCON (*(unsigned char volatile xdata *)0xfcf7)/ ]8 ?3 S3 N5 b
;sfr P_SW2 = 0xBA; ' k9 ]$ G0 d: t, {4 H5 I+ l
;//////////////////////////////////////////////////////////////////////////////// 6 d& u6 K7 C4 B
;//16位乘16位//////////////////////////////////////////////////////////////////////////////
! I5 X$ w) ~3 e; V;// unsigned long res; unsigned int dat1, dat2;
( T' A$ T! f1 D( K" ?; q/ i _SW2 |= 0x80; //访问扩展寄存器xsfr
9 _; e/ |9 s9 y% i;MD1U16 = dat1; //dat1用户给定MD5U16 = dat2; //dat2用户给定0 Z: d2 b$ Z- x6 u# P, w# J" B/ U
;ARCON = 4 << 5; //16位*16位,乘法模式# y9 I) c% W, H$ K' `
;OPCON = 1; //启动计算4 H4 y3 N1 [: W5 e* g5 S2 C& ~1 j
;while((OPCON & 1) != 0); //等待计算完成
6 F, ~9 v% |! J;res = MD3U32; //32位结9 M' a& J* X; ]2 J* y
7 }1 G, n1 m9 ]( n- m9 W* k/ L
;汇编:0 t9 c: h/ F/ N+ i$ w) P
HEADBUFFER1 EQU 0A0H; c0 z7 z7 j4 _& M
LASTBUFFER1 EQU 0FFH ;第一组缓冲区# J. @1 y: n0 [& i
AUXR EQU 8EH, M4 W; ]7 F0 \' `
AUXR2 EQU 0A2H) W5 Y; G- Y+ c B8 s) U
WAKE_CLKO EQU 08FH ! c# U! r+ m [. w: [0 i
9 ]; f# \9 h1 B' F- n' L
MD0 EQU 0FCF3H+ A6 A3 H3 g( ]0 v! |, i0 [
MD1 EQU 0FCF2H
) S7 [5 K+ {" c4 W; s; u5 LMD2 EQU 0FCF1H
) f, @) }& T9 @MD3 EQU 0FCF0H% f6 U [% y( @
MD4 EQU 0FCF5H. R' X0 j& K& U' n1 S- j" v
MD5 EQU 0FCF4H
( D4 K* }8 t( G$ G/ _& o! s, RARCON EQU 0FCF6H- E, ?; y }- r
OPCON EQU 0FCF7H* L7 K) s, ?# g0 C; s& p' _
P_SW2 EQU 0BAH ;当需要访问 XFR 时,必须先将 EAXFR 置 1,才能对 XFR 进行正常的读写
/ m$ J7 D" t/ R# S3 Z- F
2 p0 q; b# N+ d' uORG 0000H
' O6 p: T* N ^* z/ M- b$ eLJMP MAIN
; o, Y, V3 t2 aORG 0023H
- A, k" K( |8 f& fLJMP UART1 ;UART1 RECEIVED INTERRUPT
* n0 u2 ]. {$ E* l# y0 U) lORG 0100H
* p$ A8 y1 t8 r" k6 W& D' @. T4 X. ]( R9 _
MAIN:
( i: k4 _, v' ^+ MLCALL DELAY1 ;用STC-ISP的串口助手,必须给点时间切换,否则上载后来不及接收结果(00 02 16 38)接收口波特率为115200 晶振:11.0592 STC8G2K32S4
' |+ A" g- {+ Y1 _1 BLCALL DELAY1' v2 ^% R- F$ @; A" e# R0 m# w3 ]
LCALL DELAY1- S/ Z( b" }$ g# n; U
9 ^; \4 D5 f) w0 W! YLCALL IOSET
3 l/ {! s2 x L+ _( [
! c% p, ~; ]! x K- E# NCLR P1.0
" ]/ J2 p2 L* \4 |
8 O0 ?1 W" z2 J/ W/ ] i, \% dMOV WAKE_CLKO,#00000001B ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4
4 W! E; o Q' n' xMOV AUXR,#11111100B ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS
$ G# @/ E+ P. z/ @, |: NMOV AUXR2, #00000000B ;#00010000B=SHIFT UART2
, F/ F% [; h0 ?+ J- ^MOV TMOD, #00100010B ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
. A* n' x, X5 O! ?, W/ m/ D ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) * O6 s9 \" \! n3 r3 _
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)
3 B8 x5 U) ?8 a2 G( X9 y) c; f! |6 l/ G5 _, m3 u6 A8 s
LCALL INITIAL_UART1 ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
) D7 ~' |$ N5 K7 e9 O9 GCLR RI
5 S" j% v% V2 hCLR TI
0 F# M: t& w5 \/ h. c2 {" SSETB EA ;ENABLE ALL INTERRUPT1 }. n) z3 L( b2 b, i
' K7 C- Z% }" |' [, `$ Z. aMOV P_SW2,#80H ;访问X寄存器打开
7 w/ T* c. s0 f, s! @6 S- |
/ W3 x/ i1 A% RMOV DPTR,#MD1 ;4 {, c4 ]# {( T3 k2 \' }, h
MOV A, #01H ;必须通过A才能送到
* x6 J7 t; K. n. B; j2 DMOVX @DPTR,A+ A' a2 @1 E8 C3 L5 d- j! V
: @. w: c4 V: H' r* K0 y# MMOV DPTR,#MD0 ;( K8 f5 a i4 D6 } e/ U
MOV A, #07H ;必须通过A才能送到
4 _0 Y/ v: E8 E w4 [, vMOVX @DPTR,A2 }( |0 s4 @. o
8 F! q, s. o, @. K
MOV DPTR,#MD5 ;1 }& O( {: M) y$ N& z
MOV A, #02H ;必须通过A才能送到- M: N( O9 ^5 @
MOVX @DPTR,A0 D3 r9 G7 X5 s; p7 Y; y/ o
g8 s) i+ g3 f2 F' ]3 h' r* pMOV DPTR,#MD4 ;
, O3 j% v$ ]" a" }& d4 IMOV A, #08H ;必须通过A才能送到
+ l3 h0 i/ l% W" BMOVX @DPTR,A3 L& e4 `" g! a+ e
" ]% P3 ^) W! {1 ?* x. B/ mMOV DPTR,#ARCON ;# W, @5 s- I3 u q, F+ O& j
MOV A, #10000000B ;b7,b6,b5 4=16X16 5=16/16 7 y; s% U' e$ H- y5 o j0 r
MOVX @DPTR,A6 c, n/ o& m f/ Q/ T! b0 V9 \- t
3 w# }7 p7 n- r1 g$ H) \1 q( GMOV DPTR,#OPCON ;启动运算' I" v" ]" m" V- |
MOV A, #00000001B
- [! k) o8 F8 CMOVX @DPTR,A2 p ]. I( }8 r1 b* n3 {
) ?7 @; |) Z1 u
WAIT:( E/ m/ m' J- J3 G8 [" }5 W A
MOVX A, @DPTR1 w) g* f8 ]7 [5 n: X7 a
ANL A, #00000001B
. i( ~) F: V; U d0 @JNZ WAIT0 |3 m, U! i6 I7 h) S' n
* S" V* g2 J: a
MOV DPTR, #MD3 0 t, E) S& e+ o* T
MOVX A, @DPTR6 `: E1 B! }0 I" A5 g4 B
2 X/ L. x) O1 m% gLCALL SENTONEBYTE18 l8 _6 T: \7 E+ w
# I) B# j- w6 k7 e# x# o0 RMOV DPTR,#MD2
# Z/ Z: M3 O& n: `0 JMOVX A, @DPTR
; Y- O- n% ]: q3 e8 w; Y/ F% S
( D' W1 F/ [' ~4 wLCALL SENTONEBYTE1' h$ C$ |- A3 i
: b# I" [) N0 k- W4 n: l1 H8 V
MOV DPTR, #MD1
( b" `2 m; v# z: EMOVX A, @DPTR
) c1 ]* P* @+ g1 L8 U$ g# r# ~3 w- H% R3 ` B! I
LCALL SENTONEBYTE1
4 W7 N( p6 Y u/ `6 g2 t* Q1 A4 x# n" u+ _" Q
MOV DPTR,#MD0 N4 \* a. n0 C$ L6 R' S
MOVX A, @DPTR4 `6 U' d5 h9 g! s% a
( Z# v& x$ c. }
LCALL SENTONEBYTE1
( t7 j% j9 N i1 P) k/ q# M+ D# q- F
0 Z A) o' z- a, I- R9 bMOV P_SW2,#00H ;访问完毕要关闭
% \: \* K, Z0 s/ F g1 w4 n6 a5 B7 Y3 o) ~
LED: ;停机& X! P* B1 n4 F; N7 t
" `2 u+ h/ h+ z7 c" v# H
JMP LED- K5 l! R, D- x# U& ~' T
4 j" r" M' F z8 l; X9 R5 UNEXTBUFFER:
" a+ W7 L# ?4 z r( C0 dCJNE R0, #LASTBUFFER1, NEXTBUFFER2
$ I* @7 z# X7 _4 M: D/ ?MOV R0, #HEADBUFFER14 ~9 F5 u8 N& b
JMP NEXTBUFFEREXIT
+ z8 `0 Y; J6 q7 P5 k' f2 v+ \. U; Q! CNEXTBUFFER2:/ \( p* T x' q- D
INC R0 OINT TO NEXT BYTE( [ \5 s0 p2 E9 q* {
NEXTBUFFEREXIT:* u; f A5 k [0 ~- T: n# g
RET. L' m9 M! M; `, y9 N
4 C: T6 r5 e$ ~9 ?( i" I
SENTONEBYTE1: ;SENT OUT A0 l8 T+ {. d8 a
CHECKBUSY1:
0 g" n0 T/ ~& {6 SJB 40H, CHECKBUSY1! E9 l6 X9 J! |* y9 X3 U E# ^' A# n
SETB 40H8 v2 @( \ j1 b7 I6 R8 L- f; ]
MOV SBUF, A
6 i0 x! f( R4 Q! g& k2 B( z4 HRET
, A: U7 R8 G, G; x5 p Y* ^
, V X4 g, z5 o* M) cUART1: ;RECEIVED DATA FROM AIR
5 H8 |8 k# r' |: m( o. nPUSH ACC) D3 R* x. Z) C8 ~9 R( ]# \
PUSH PSW
: ]8 _' [8 w+ T* fJNB RI, UART1CHECKTI4 i2 s0 x; G+ S" ^+ z0 A H z/ H
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
, G% ]9 M8 y6 L0 C& ECLR RI ;CLEAR RECEICED FLAG# H) o3 s3 `+ W! E
MOV @R1, A ;SAVE TO BUFFER
- D. V( i/ I- z( Q' oCJNE R1, #LASTBUFFER1, NEXTREADBUFFER) i( ]* O7 `0 y7 ^( I1 k" s
MOV R1, #HEADBUFFER12 {8 s$ p' f0 R1 X& G9 K: x
JMP UART1EXIT5 b- c4 F6 V' Y0 j
NEXTREADBUFFER:! ~0 S5 ]1 q. x, `- j4 S
INC R1 OINT TO NEXT BUFFER
3 h* ?. Q! A2 Q0 MJMP UART1EXIT0 @# M$ g6 z1 A9 {8 O
UART1CHECKTI:
9 e [/ C' }; i r5 Y* r V2 UCLR TI
, T3 H& ^3 e, k* c4 b' gCLR 40H
! j* Z3 Y8 u. _4 }& J0 RUART1EXIT:. B; a. A& m2 c+ L+ p; S( x3 y* R
POP PSW
& z$ s$ J U) G8 p- s) i4 y( \* {POP ACC
2 h" a& L6 X6 O- URETI" @5 O' q# U2 y, J
) w# n, N( T0 Q5 X" z
INITIAL_UART1: ;115200
( { } B& X2 d; _1 PMOV SCON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
$ _% S' M8 E5 B/ |: fMOV TH1, #253 ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0
% }* ]2 v" `( r5 i$ R+ Q& ZMOV TL1, #253
# w! G+ |, A) zSETB PS ;SERIAL PORT PRORITY HIGH
' Y4 l5 C+ {2 Z3 |SETB TR1 ;RUN TIMER_1* j) j( w; h: e6 \
SETB ES ;ENABLE UART1 INTERRUPT
9 g# c' r) O1 `4 e3 \# K: M/ ORET7 c) I) v- S( w1 N
+ [1 E* ` C) L4 N1 [" v+ J
IOSET:0 A! M( T& s# v% R/ e$ I" E: U, r
;-----------I/O CONFIGUE
1 C) r' q! f$ d& B. S) _MOV 93H, #00000000B ;SET P0 0,0=I/0, 0,1=HIGH CURRENT OUTPUT, 1,0=HIGH IMPEDENY INPUT 1,1=OPEN COLLECTIVE OUTPUT0 D( R, P* x) M. [) G
MOV 94H, #00000000B ;SET P0 (CONMAIN WITH 93H THIS IS SENCOND BIT)! N: J: i& \: z% U- g6 M# T' e
MOV 91H, #00000000B ;SET P1
) }6 {/ l1 F, a+ HMOV 92H, #00000000B ;SET P1
t5 a4 q$ s9 L3 Y# s1 V5 b2 ?MOV 95H, #00000000B ;SET P26 g" S* m* J! x# ~
MOV 96H, #00000000B ;SET P2
8 O; ]& r7 L8 F! zMOV 0B1H, #00000000B ;SET P3 7 R; l$ r% M4 B) {0 c
MOV 0B2H, #00000000B ;SET P3* k4 H3 d/ J" X
MOV 0B3H, #00000000B ;SET P4
/ `( {/ Y9 c. K5 IMOV 0B4H, #00000000B ;SET P4
0 t4 I; v/ v- T: yMOV 0C9H, #00000000B ;SET P5
" Z e, [, n$ _% w0 H( G" xMOV 0CAH, #00000000B ;SET P57 R! n5 M3 r) n Z, {( ]
;MOV 0CBH, #00000000B ;SET P66 c- m) i# N4 N% ^2 p
;MOV 0CCH, #00000000B ;SET P68 k. x0 m1 y; q% a6 G! b/ {
;MOV 0E1H, #00000000B ;SET P7
3 d$ [8 [% V( [( x;MOV 0E2H, #00000000B ;SET P7 l& p$ R- _" y0 ~! r
RET
4 J' Y- b- W! r# f
2 o3 ~; ?- B" c; MDELAY1:
$ x% |1 h6 J- ~3 C4 D( L: pLCALL DELAY2! S/ O& l( Z( F
LCALL DELAY2
7 |7 J! d1 w% G4 G+ XSETB P1.0
- I* z5 j5 D* FLCALL DELAY2/ O# c/ O- H; w: ^# S+ v+ `, }
LCALL DELAY2) w- {+ J% t2 Y" ?6 X- |" L# y
CLR P1.0
/ s" A+ c$ }* f$ MRET9 H1 p1 p) Q. H$ W7 U, I7 w
) `! [. W9 p% j4 U! k! a# z5 {
DELAY2:
" s: U; L9 C) T8 I; Z4 u7 FMOV 35H, #2550 c S# l) J! [9 }0 P" |. q
SLOWDOWN0:
U9 w. z, u1 s, h( @7 u, y" a+ }MOV 34H, #170
1 L* |( O) }: `6 D! t- J, pSLOWDOWN:
7 g, M2 {$ F3 h1 e% W M: VMOV 36H, #2/ i7 ~: z% Y8 j# E
SLOWDOWN2:
; v Z5 @: s2 ADJNZ 36H, SLOWDOWN2 % I5 ?% R7 t4 u6 ?& _1 m# a
DJNZ 34H, SLOWDOWN
' }4 x: Z; r1 M& r/ I2 J" bDJNZ 35H, SLOWDOWN0
9 h% N3 \5 e/ v' l( |+ M7 IRET
. D2 Z& L$ ~- a. V: r t
6 u. ?3 v3 R6 k, E8 } @END
5 n, k* w* ^6 F' A/ |7 ^* R; y
- p/ F; o, \+ i8 u |
|