|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于单片机的智能计算机程序 可以实现加减乘除运算2 r3 Q7 V# Q6 S: H7 ~7 W
9 L4 M% O8 G2 T7 S! U
; T7 r2 _7 N( H" |7 A8 U8 s3 n5 v. y
4 B \3 ]+ e9 l, \# X单片机源程序:* w( k! l2 r/ O
/* S16 S12 S8 S4分别是123+# s4 T5 [9 `+ I0 h( a4 L+ r5 \6 y
S15 S11 S7 S3分别是456-
# X" r) `0 c( @; t+ a, K* C1 ` S14 S10 S6 S2分别是789*) h2 F" y% x# [
S13 S9 S5 S1分别是0 CLR = /
: @0 |, p$ V+ T0 h+ R) J*/
0 H: \! ]( G8 [/* 实现两个数的运算,每个数的位数至少可以八位 */
" M% {9 } L. v#include<reg52.h> # n9 U+ s; d1 @" K9 i; J+ Q' l
typedef unsigned char uint8;0 o- w d& W8 F- m" E
typedef unsigned int uint16;( ^" I$ B" g- U% P; f2 S
sbit rw=P2^5;
- I8 Y) C( B6 d5 Ksbit rs=P2^6;- C% c, r% P. T) _# q
sbit en=P2^7;
8 m% t6 R4 l. w" Ysbit led=P3^7;6 H9 R. S4 I5 h8 @. a1 I
sbit psb=P3^2;- N% r6 G+ v: A% j
sbit beep=P2^0;
: ^1 F+ [5 g% \: b* j1 Muint8 key,num;
; f5 w% ?, T4 O# P kuint8 fuhao;//定义具体的那个符号,是加减还是乘除。 x [0 V3 a0 \3 ~9 z* G
uint8 flag; //定义有没有按下符号键,这个是统称( `4 Y5 l& _6 {/ ]6 t4 |: B, e2 t5 B
long a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量
0 E. z; S" N) e; u5 cuint8 k; //定义小数点后面显示的位数) \, V ^; Z& z) C1 W5 o" A1 H. p
uint8 biao,keyflag;. Z# l: M# H q6 C) g4 f
uint8 dat1[]={1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据
' M7 T- y3 L* l% M7 K! O' Gvoid delay(uint16 i) j, S. d/ g1 E4 j$ s8 K
{( [, W n6 E" O) A) t. C4 w
while(i--);
! k. R9 I2 q7 l}
% x3 V4 B, F* x# m* c# ]# u- s' q. k; fvoid write_com(uint16 com)9 k8 Q8 X; Z8 N9 q
{
F. u. S4 V. }% I3 m V: [ rs=0;
/ l* u* S, j) @% L, H P0=com;3 Y8 T- f& h7 O! }( S
delay(500);9 K3 @4 V6 F. `! W6 f3 e) H
en=1;5 @& e3 a& O0 w+ E5 N4 V7 a$ i
delay(500);- u7 ~) T1 d& X8 k; u4 x- Z
en=0;
; E2 c$ M5 O; `; M. \ }3 n# u0 e5 a, X+ Z
void write_data(uint16 date)% [3 j. j4 |) p C, y, I) a: _
{* D' T0 x4 O& M# H
rs=1;
. U) l2 n( X% O& ^ w: v% r* ? P0=date;- t2 _" s* v+ P1 k% V
delay(500); ?* X$ D. G7 h1 \
en=1;9 ^8 b3 W! a5 `' ~$ C( u9 x
delay(500);) u/ R! [6 ~8 f; p+ x2 b7 w
en=0;
8 C3 W* D( L6 \/ A# p% g1 s6 u) ^1 ]8 ]. x }
6 M) R9 r- Q1 ^' l: _9 L8 Nvoid lcdinit()
' {, A$ b. j) T& P; ^# ~2 U{
. I* F3 U# W6 `- s Q9 p psb=1;
W* u. p$ P- n9 s rw=0;( S' b6 I+ f: I m3 S5 ? c! h
en=0;* m6 Y! I, f( w+ k! q- k4 s. _6 S6 Z
write_com(0x30);
/ o3 i9 ]) V6 C# n! s# `% \9 i3 z delay(500);
9 V. T$ [/ @$ c1 ]" j. O/ k write_com(0x0c);
6 h& i# k& ]+ W) }( V) A4 v/ y delay(500);/ _0 x* E$ E/ A, m- G b. j
write_com(0x01);0 H, y* h' A' S3 S
delay(500);
; J! U! Z0 e1 N {( ]: j# Z0 S key=0;
' X. {/ R4 T! H- ^: J, D6 }6 f) _ num=0;$ ^) k* @- n1 r( x$ c2 `
flag=0;/ r) u4 E& h9 q/ h9 m- C2 q
fuhao=0;& I' d: |+ n$ j
a=0;( F- s& _, y2 p9 a
b=0;
" r5 p3 ] m G6 P) r/ V9 V* G* O c=0;; d: J( T* n) V- S, B
d=0;$ u1 c2 ^' t. S( K5 Y4 s
biao=0;" X: Q2 Y! o3 q& ]$ {' _: _$ ^8 `
led=0;2 I: ^+ j+ A% R
} @ v8 y) ~9 w
void keyscan()
" g: M) U9 D' G& O' ^{* w3 A$ x) H2 K* I. @
P1=0xfe; //令第一行为0,然后判断是哪一列按下
/ B2 _4 R# ^ v if(P1!=0xfe)/ i5 ~6 K& y# O9 e" L8 k
{
+ G0 H, h) J9 [% ? delay(1000);# y1 E | `, g8 G# u3 G
if(P1!=0xfe)
% }# n7 z+ x. h. q+ O# h7 J {
' ]7 Z+ D3 F$ D0 `) v) S7 a! f key=P1&0xf0;
D4 | a! `, K" ^' S, ` switch(key)
9 v: h" X# F/ r( w5 D {
' Q* H. t: k# k/ G* J% _; _ case 0xe0: num=0;if(keyflag==1){keyflag=0;write_com(0x01);};break; //18 } `3 h3 j/ b9 U, s
case 0xd0: num=1;if(keyflag==1){keyflag=0;write_com(0x01);};break; //2% G* i( f( W" L x, Z' x
case 0xb0: num=2;if(keyflag==1){keyflag=0;write_com(0x01);};break; //38 ~+ f1 U5 j/ o9 D9 W' P4 B
case 0x70: num=3;break; //加% c+ @0 t7 S/ ?6 |+ d; y. O! {
}
! \1 a# f5 T! S/ H7 J }. B9 M }
* |. j2 J! _; m; h% X- A while(P1!=0xfe);2 X- }+ k& H5 i) i4 p/ @/ u7 t. A; F
if(num==0||num==1||num==2) //确认第一行的数1,2,3# [2 y( m v* z! a1 V
{' e5 [/ X0 [0 E; p5 c
if(flag==0) //没有按下符号键
9 J2 r$ y& ]" N. ` {
7 P* E. R: }. j* i; y) y //led=1;7 {9 K( G( L% k/ @5 A3 |8 k
a=a*10+dat1[num]; |$ f5 [" u) ]5 @
}
' D9 A. a. h+ d+ }7 `; w9 Z! d else
0 B7 h* I3 W" S+ |& Q2 ^% M {
- o! L! z& H& \" i1 v/ t8 O //led=1;6 c8 U6 [ B, K+ G
b=b*10+dat1[num];
9 p; G: ?4 V" ~" I9 O% n1 `9 Y }
& F0 F# Y' X! r" A
! d% Z5 F0 d+ I7 r' I }
$ i; Y6 V0 M: v. }1 L# G if(num==3)% r3 y7 v ^; S
{, g, F' j" l1 r! Y7 k. X- }+ U, }- A
//led=0;
2 u3 N/ B! S% D flag=1;
+ j) Q5 J3 R7 `- G fuhao=1;//加号+ 9 q( B; @; X6 _, L
}8 j* o Q" I$ R- A- }
write_data(0x30+dat1[num]);8 v3 K9 s7 m0 y/ \1 \
}
6 t# \6 x# [" S6 [& ^ C1 n0 I. |1 ^9 ?# e* E* `& \9 ?$ D
P1=0xfd; //令第二行为0,判断是哪一列按下
' X, u X' t/ \$ i' ]- _6 n( S if(P1!=0xfd)
* P7 j- m& E( z {
# R7 c! t* A) d& x) ]9 t- D6 {* s( X delay(1000);
. l0 Y6 j' S( D. q2 R; e2 { if(P1!=0xfd)# Q0 d" n3 q6 K6 Z% B! Q
{
/ ?$ F, F V- ~" K. c6 n! ?8 I key=P1&0xf0;2 W0 s' s+ k* R6 W# F
switch(key)+ J3 q# U% w, s4 Z* z8 a# \
{1 V z7 S* G/ c4 a# ^
case 0xe0: num=4;if(keyflag==1){keyflag=0;write_com(0x01);};break; //4
; c9 u) w$ u/ G( }0 L case 0xd0: num=5;if(keyflag==1){keyflag=0;write_com(0x01);};break; //5" A* d, M; H' E" j7 q5 A9 a; k
case 0xb0: num=6;if(keyflag==1){keyflag=0;write_com(0x01);};break; //6
" c1 J) e; M3 J5 e: Y; i& Y( E case 0x70: num=7;break; //减—
; ?: d% |4 o2 b [, l% b2 C } & d# P- r6 i0 Y- v, k7 g. \$ v9 ^4 x& V
}2 S- I$ z- A, ~2 m
while(P1!=0xfd);- |5 @1 l( [8 Q4 [: q
if(num==4||num==5||num==6)
% m, Q4 k0 \ P$ A( r {
/ K+ K7 n9 R- i: y, ^: u+ Q5 ? if(flag==0) //没有按下符号键; @5 v7 U" S% i! G4 [) u1 S$ k
{, p- d! b3 b2 g: L3 _; h7 {
//led=1;
& R6 b* D2 [3 q: g0 R* I7 h3 f# a a=a*10+dat1[num]; - w0 D0 Q) \& f
}
+ a! R* Q( f# j) t6 N* A else9 f( Q# T5 V2 M7 N, C
{3 J1 i, Z# @) b
//led=1;# ~- b% u" O8 N* B$ j( h V5 n$ Z9 V
b=b*10+dat1[num];% K7 \. I1 b" a+ q3 M w4 Q; R
}
) J- O4 i7 c- O0 F }
. ?6 A8 q9 R' H8 o3 e% ` Y else0 @7 r( l4 {* r& ?
{
/ ~% |5 C8 d% i `6 V0 _ flag=1;2 Q$ n2 e: U7 N7 U2 u4 D' }* Z1 U6 Q
fuhao=2;//带表减号
1 b# K, t% X* {8 b }
- _& I: n8 h% c6 D write_data(0x30+dat1[num]);7 G$ {. d8 o1 S% {: @) E3 @5 w
}
% H0 y+ ?5 w) D, O1 q, p, J% `' t, G: i5 X
P1=0xfb; //令第三行为0,判断哪一列按下8 o+ b3 [$ ? y2 w5 x; h
if(P1!=0xfb)
6 N6 m% _1 Z+ b3 Y$ S; l! m {6 f: o7 u9 p9 v6 u
delay(1000);, ^, ^* D- X. D) F- D
if(P1!=0xfb)1 F0 B- i( B8 G. I9 w0 N4 K/ t3 m
{- j: n* ?0 H* r+ \# S/ ?4 U4 U
key=P1&0xf0;, H; ~) q) D8 @7 |
switch(key)
; \/ y2 k' h' S4 r4 ]6 @ {
( ?: p7 x6 G4 C1 `8 J' s case 0xe0: num=8;if(keyflag==1){keyflag=0;write_com(0x01);};break; //76 n- @, {) n4 U3 @' M7 C9 P3 F
case 0xd0: num=9;if(keyflag==1){keyflag=0;write_com(0x01);};break; //8& h9 z7 T( R" Q
case 0xb0: num=10;if(keyflag==1){keyflag=0;write_com(0x01);};break; //96 [% U2 h/ j( |7 U
case 0x70: num=11;break; //乘*
: [" ? \/ k* s( O! m( s# r+ A F } # D$ @( \3 A9 ~) P/ }( Q
}& b/ \ R" A( M4 O. g& }( ]
while(P1!=0xfb);6 _8 ]$ g7 P) W' g
if(num==8||num==9||num==10)
Q D! g3 h" h6 j( \ {9 W8 c2 V1 _" X, S2 w
if(flag==0) //没有按下符号键4 t- C7 N& P; u. k- g# c+ `, U* r
{8 d7 Q% a% }. n* b* m
//led=1;, r1 ]/ t j$ G( Y$ E* y
a=a*10+dat1[num]; 2 b( w6 W; J p7 ?9 _6 O
}
8 A* S8 i* M% P else0 \& T6 C1 i+ ~/ j& v. F) Q
{) d8 l9 r* s0 ]4 [ a2 h+ H
//led=1;
, M$ n7 s7 {. Q, O' C9 A b=b*10+dat1[num];
/ ~) C& {0 C5 s6 v B- p }
* c5 o: w8 s7 [$ K+ O' n5 l, \8 s }
6 K! z# y: z) O0 D; E else
: K: U8 a) e3 z# b3 v, |* A$ v( T7 _ {
) X+ w* a2 a) n% r flag=1;
7 p1 U' U H, u fuhao=3;//带表乘号*
* C5 k+ W% k( N/ t V8 E/ [ }
/ s$ n2 L2 i) C write_data(0x30+dat1[num]);% U2 p- K- E+ r) h: z
}
+ y. R! L, p+ k4 J) S! W; p
* @6 A/ P, w3 j2 v& T. O P1=0xf7; //令第四行为0,判断哪一列按下
9 b6 A9 T0 O( q7 `+ r if(P1!=0xf7)0 ]# p5 E5 e" J; y# |7 V+ n
{
. J0 b: f# g+ P0 E1 W* R delay(1000);
3 H5 g' z; b; ~6 A if(P1!=0xf7)
) V( Y, e0 @. W1 j6 e- `, o {
: m1 i. b6 t+ I, L# S key=P1&0xf0;+ S: |' K. D d# O0 ?! |
switch(key)
' V8 Z! Y7 [& Z8 x/ M {
) e' S' @9 B- G5 r) F. e" t case 0xe0: num=12;if(keyflag==1){keyflag=0;write_data(0x01);};break; //0% r: T. u% f8 b% d6 J
case 0xd0: num=13;break; //清除rst
6 \, p* w2 K5 a' q case 0xb0: num=14;break; //等号=. [! W+ z. X& h% g% E! U
case 0x70: num=15;break; //除/. E u. E$ g9 B0 T0 K/ Q2 C8 \
} , ~* D5 O1 w9 O) O
}
. `" g# p7 e+ j5 b. b while(P1!=0xf7);
% h) ^/ ]+ I0 |3 B+ g* Q switch(num): D3 m4 c* D7 v v; W
{
, P0 n. @8 L% c1 S' U, m case 12:
2 A' e* ]$ n! g: j& B2 M4 H) Z if(flag==0) //没有按下符号键$ m/ Z2 Y) u- i
{. ]' x2 ^) E, r6 p- E
//led=1;. o, j* {3 V: Z! V
a=a*10+dat1[num];8 R: P3 }0 } J2 K/ A- H8 {( p% X
write_data(0x30); : _6 m7 M8 y: ~
}. `! O1 C6 }5 A+ O8 V: E9 U7 h! L
else2 d6 F+ Q& l \+ D4 e0 `& I4 z
{
; a" n0 w* V C) N //led=1;
4 ]0 `$ a3 h+ q! z2 V b=b*10+dat1[num];
, i8 ?5 |$ n" X2 Y write_data(0x30);9 w: k3 g0 J& S+ ?
}
/ N6 Z0 S0 y- ] break;
& w1 [3 P: i% F( W7 H3 V4 }, p
! A$ k. Y, p% |$ A; v$ A case 13:
4 u" v8 `1 U0 W% R write_com(0x01); //清屏指令
3 j' W8 L6 s% b' e# [ a=0;$ X8 r( A4 K8 S
b=0;$ ~5 `9 }+ l. C6 Y
flag=0;
6 L+ ]1 d) ]6 B fuhao=0;
6 ]& [4 C i1 Y break;! [! a* F2 A8 G1 O: A2 }8 G2 U9 t
case 15:
; T! c, j1 G/ x! h; [& f# T 0 v$ c7 K+ z; n' h4 F3 A H
flag=1;/ }7 M, p) n% F0 m. A
fuhao=4;5 m4 {! ~! g* U7 v" N; B
write_data(0x2f);//除号/
$ B: I. D* a. K break;
) r0 M( B# y) {3 y( ]# i2 \
7 l1 |% U3 O3 V6 |8 D2 L: j) ^7 R8 c' L' K case 14:
% X6 h' }! b3 h0 R! J2 c4 T7 T if(fuhao==1)//加
9 g1 b+ ?9 K; L U9 k& v2 A' m9 h {8 f1 {* Q$ X ~& P3 h
write_com(0x4f+0x80);
2 G9 Y6 l& L' K- j1 t- q0 ~+ ?* F: U write_com(0x04);//设置光标左移,屏幕不移动
& R$ d1 t% m, W4 d' C c=a+b;
( l" Z* X* l1 ?( X while(c!=0) //一位一位显示: @2 Y+ U& B2 }
{
8 p1 D% v' n4 z: J2 I- D8 J write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置) E% c G3 r) a3 U
c=c/10;//取前面的结果数据
% d% R3 A% E, E# S+ _& m( l keyflag=1;$ b# E/ P# c3 z# v- I d
}
" n. j N/ Z! _/ W write_data(0x3d); //显示等于号=
! V. } r7 R$ I' F1 O1 a a=0;
- k# i! c. k8 Y7 r& } b=0;8 g9 a9 k! r k5 {+ m+ {0 A3 t
flag=0;
( F0 @/ Y3 j U fuhao=0;//全部清除为05 }$ u! |5 [0 R% X1 m8 x; a+ |; e
}
4 A8 c( W6 r! h( @: n if(fuhao==2) //减
* }0 D, A7 r$ C( x% v {, k7 ~! S0 U6 K' w
write_com(0x4f+0x80);! m2 j) Y3 W$ k0 t y& j
write_com(0x04);//设置光标左移,屏幕不移动
! y9 S5 B; e" J, [ if(a>b)
2 d% l: g `6 ^3 R+ P* b3 f& p c=a-b;
# S' o" ? j' V( j else8 {0 ^& E) B+ V) f. X
c=b-a;
3 O" @0 x! R" z
" B" p4 n: z" g2 f6 P5 c while(c!=0) //一位一位显示
7 O+ l: p* e0 z! v7 X {
; ]& d8 m& \ M7 q4 y3 d* W- x write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
: t% t* u! _4 T: e- s c=c/10;//取前面的结果数据 3 o' J u+ T$ \( |3 C
keyflag=1;
! Y# i/ m8 Z5 v/ V6 T6 l }! I8 u @; ~/ A" U+ A
if(a<b) write_data(0x2d); //显示-号
3 c6 P/ d0 S6 o- D D write_data(0x3d); //显示等于号=
! e# B' l. g" L8 D0 m" x, p f a=0;& @; \# f7 [( X8 {1 v2 E* m: P
b=0;2 k* V! A- k2 W
flag=0;* L- ]* z) `7 N+ M7 ]7 y9 r
fuhao=0;//全部清除为0
0 i5 {# g( n7 }+ B- n) [( ` }! O7 @7 S- @. v+ e
if(fuhao==3)//乘法
. z4 Z( U; \, k {
% y7 j4 x. A# ? write_com(0x4f+0x80);6 W9 r+ |" b1 M/ v- B: L
write_com(0x04);//设置光标左移,屏幕不移动
9 P& e' s, f3 n9 Y& ], O. | c=a*b;
, W( n! M$ n4 J' G8 Q9 | while(c!=0) //一位一位显示
5 }; l) h1 X( w6 `2 @9 X0 } {
( q! ]5 g4 o: B# R! F4 G- T, F write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置6 k, A# c" n, m( z+ V) ~2 m ^4 y5 o% ]
c=c/10;//取前面的结果数据
3 X4 G3 K: W6 w2 W8 A keyflag=1;
! j8 z1 P1 y- X8 N8 K }
9 V# m$ t8 V2 H3 `1 ^% Y write_data(0x3d); //显示等于号=
3 y' L* Q- N7 c/ K* D a=0;
+ w; |* F! c8 N! q+ W b=0;; } S+ s/ u* \9 A! C& ]
flag=0;
* I$ A$ d/ O3 S8 ^ fuhao=0;//全部清除为0 + k& D5 _# r* N# @$ ]8 L
}
4 q- e W9 h1 t$ d if(fuhao==3)//乘法
& w( o' \+ p4 M {
+ Y5 m6 Q* S6 I; f* I write_com(0x4f+0x80);% [6 ?# R; M# A/ Y" ?0 [/ a
write_com(0x04);//设置光标左移,屏幕不移动
1 D9 H+ a# o+ P# T9 e c=a*b;* }. v- [( z2 X
while(c!=0) //一位一位显示
9 p- V8 \! a. B, ~+ r! D+ B {, m' }* o1 d! W6 w
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
* a5 i. f5 C: B; P5 v c=c/10;//取前面的结果数据
3 @' X. }$ }4 u+ n- `$ o; y9 a keyflag=1;
& f( I6 c- }8 V& A5 u8 ~ }
7 ]5 z6 _% Y1 ~1 s! ~6 x" M write_data(0x3d); //显示等于号=
$ R' C6 P f, g- q; y1 b) H a=0;
8 }2 ^& p4 E$ ?2 c3 o- i b=0;
B& t" e; f, ?- p7 }: g flag=0;4 P8 U; r2 e; \6 X' S
fuhao=0;//全部清除为0
# ]6 ~* b6 ^0 w3 J0 H$ C) B( }1 Q1 i# ^ }* o8 ]+ i2 f7 m/ d2 P) l! B
if(fuhao==4)" {: l* J+ j6 l% i4 H
{
9 M4 U7 M; B7 k; B b k=0;
/ u' t( j/ } U$ {& c j write_com(0x4f+0x80);
4 ~9 N6 L8 ?& B8 E write_com(0x04);//设置光标左移,屏幕不移动* O9 E" J6 ]' T* J& [3 a' P
c=(long)(((float)a/b)*1000);//强制转换为long。
4 k$ T% V8 y! ] while(c!=0) //一位一位显示& A$ d' i1 G& R% L2 n( ~; }
{
: p6 i4 y+ K B/ b, X k++;1 N' Q: t( b0 v; i' Q, ~
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
Y2 ], C9 D5 d Y! {, @ c=c/10;//取前面的结果数据5 [2 Q; ]2 @# z5 b( G/ m
if(k==3)
: `3 G3 Z& e7 c: x. d2 M' L, F! g! i) P+ ] {
7 m) w3 ~6 x& v2 \( \3 }1 } write_data(0x2e);
- o. D4 \9 ?1 E' M7 E k=0;
5 O6 t7 T/ _0 q0 _/ O }
9 P0 e g X- e: ?9 w keyflag=1;* _9 G( F; ?6 u. l, A- }
}. A0 E! I$ C, u1 Y/ c9 b
if(a/b<0) //如果a比b小的话那么除的结果最高位是0) s( Y. W9 ]8 R. @* `7 I, E
{
% g5 Q1 l4 m8 W; \- d0 A write_data(0x30);
" f* p7 H7 t, ]' ^" V) H7 t* \ }2 ^3 i4 }5 e, h- C) J
write_data(0x3d); //显示等号
: E8 W6 ^& n& @2 h& A9 U! D- a: W0 ]
…………限于本文篇幅 余下代码请下载附件…………
( Z3 U5 D5 f2 @3 f
2 z; F. u& ~/ ^1 ]% N
7 ^/ J9 Q" t4 n1 j |
|