|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于单片机的智能计算机程序 可以实现加减乘除运算
1 ]# d1 r, s3 E9 B$ J C8 I! d1 T8 H, M6 \
4 l0 Z5 A" U( h
2 T( @* K* j* k- A3 I单片机源程序: Z) `& y, U( Q) {. q! M) q: l
/* S16 S12 S8 S4分别是123+
7 W. Z$ Z7 O7 n# ?$ I: G. v! Q/ c S15 S11 S7 S3分别是456-
5 y$ @# V) Y8 D2 @4 i S14 S10 S6 S2分别是789*4 j2 ?, C# X2 x. I5 M5 V5 R8 j7 s
S13 S9 S5 S1分别是0 CLR = /
7 B- j( X J1 I: `- I/ k/ p*/
' @5 G7 |5 [, {$ _/ M/* 实现两个数的运算,每个数的位数至少可以八位 */
$ W" Z& l4 \6 B' m, I. s3 m#include<reg52.h> ! ~7 @( L& Y$ x) ]/ [
typedef unsigned char uint8;
7 x# A8 X* a4 Q. n: E' otypedef unsigned int uint16;
! s1 [) |! `0 Q5 asbit rw=P2^5;9 C( I8 r! x9 N# E
sbit rs=P2^6;6 Z. R) u% M# M: }0 G5 g6 i' @
sbit en=P2^7;
" s- f% A/ h. ^$ Csbit led=P3^7;
1 P3 m. A' X+ Q; h* n5 @9 r! Isbit psb=P3^2;
/ ?/ S. X& z8 G# w$ b; O3 jsbit beep=P2^0;' n4 F7 V) g! c6 T$ ^) V% J# W# `
uint8 key,num;3 G2 `+ f, X0 H4 A, l' @
uint8 fuhao;//定义具体的那个符号,是加减还是乘除。. F) l) s5 H c: O( S
uint8 flag; //定义有没有按下符号键,这个是统称8 S# e) p8 p( E8 ~
long a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量2 o1 b0 C. G5 V6 r( e
uint8 k; //定义小数点后面显示的位数
9 u$ O+ r5 j+ t' c8 auint8 biao,keyflag;
; x- Y. T. f6 G4 I/ o9 Quint8 dat1[]={1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据% m! j6 T! S- O6 x M' V4 p# b
void delay(uint16 i)9 A( M2 @6 d& \& W
{
6 {! u3 s/ B" H3 A* m( N9 E/ B while(i--);, k3 ~8 q1 ^9 i; I* K _: y) J& F
}
. h( e. D4 C$ g% Q# Pvoid write_com(uint16 com)# A* h$ C% e: n" s1 J, L, F
{% R2 Y2 \7 U: T# y5 K9 q2 a/ w
rs=0;
/ X9 A/ o- G* ?% q) x P0=com;$ d# n$ ] \$ ]/ `" i# Y
delay(500);
& H1 o# \0 Y; j3 i# \: Y: V en=1;
. o. N, L% A( {' p2 J delay(500);. I6 w8 H2 q! W4 v6 V
en=0;
9 w, E) b5 n) n% i }
3 K3 y G+ Z5 t3 j: R5 i7 ?. R8 lvoid write_data(uint16 date)
4 U; C4 b. @9 q {
' ~7 y- v% N2 z rs=1;
5 b0 G6 c+ v/ M" @5 Y P0=date;
" B' ~* I- K5 \, q1 v2 h delay(500);
. ]+ ? \0 i N7 l6 T9 {, X* |7 _ en=1;8 @5 Y) t- Y7 H. W0 c# q
delay(500);" \( }* m5 R) L* i! M8 j P4 s1 D7 B. `
en=0;+ E5 Q8 @% E& t$ s# V, T9 q# Z
}
( ^) I9 @+ U+ G: U# l/ _! V1 tvoid lcdinit()+ d4 R- D8 f4 K# ^9 K
{
5 P% q2 E; R7 e7 K& [+ ]& f! R psb=1;5 ~1 L& Q# D2 S3 E( r5 y' J
rw=0;4 z! C% Z1 [+ p F3 d' G
en=0;9 ^1 P' x5 K% B5 N7 w6 L- `0 r
write_com(0x30);8 y2 V8 m$ E) u( O7 F" r" P
delay(500);
, [" F8 U) i. _, O' ]3 } write_com(0x0c);+ c- b P# m- j' l; u- M
delay(500);- V5 O( i+ I" ~! w5 f
write_com(0x01);
: W5 w7 h* E/ r4 B2 w4 H. X delay(500);
( i/ O+ y% Q |. w2 h% ] key=0;
3 A0 j$ S2 A% A num=0;) z6 G5 D) n( Q
flag=0;
2 a3 f1 C, j7 w% z- Y fuhao=0;
( [5 Y$ w: o2 `% J9 S: J a=0;
+ g" l t S- z) v2 F b=0;% h5 w- {; z1 a' C
c=0;
. x8 @7 N, M/ z/ r" g d=0;; V6 l$ s: [: F& Y) ?) y+ }
biao=0;- [+ U' S3 b! J: {$ U& c% T" O
led=0;
0 V3 M. }" T4 d; K E}
4 w! o- ^$ ^5 t3 R* I7 F# L( zvoid keyscan()
6 B6 T) M; I. v0 L. J{ U% H% _# l# j2 ~1 i% Y+ }
P1=0xfe; //令第一行为0,然后判断是哪一列按下) ~5 S. i. u ?, v! e0 P) I
if(P1!=0xfe)$ C( V3 t! p8 @% g0 J
{' ~3 c" j7 f) G: O; o
delay(1000);
+ _( Y* f/ R: d& ^7 Y. {7 d if(P1!=0xfe)
$ E! t( q6 P) a+ {% I/ c {
( F$ P8 a" ]1 Q9 M% _3 U( X key=P1&0xf0;* {& e: J( j, {: K( S9 {
switch(key)
7 g' I9 I: V% K# j; p {# m K* Q8 A- Z4 k( Y
case 0xe0: num=0;if(keyflag==1){keyflag=0;write_com(0x01);};break; //1
# {9 c9 Q+ z# @ case 0xd0: num=1;if(keyflag==1){keyflag=0;write_com(0x01);};break; //2
8 O: L* h8 z4 v. J# V- i) `: h case 0xb0: num=2;if(keyflag==1){keyflag=0;write_com(0x01);};break; //3
8 }- A+ o8 z% S4 B case 0x70: num=3;break; //加" w1 r7 M" L8 `( |0 V
}
- I( }3 L( L5 z# U+ h6 p }- H! i7 A7 M" V: l6 P5 l8 o: o
while(P1!=0xfe);5 |+ u z) A" m: u0 a, [, c
if(num==0||num==1||num==2) //确认第一行的数1,2,37 ~$ Y/ _3 p; @
{
* n+ |) t" g0 ?$ G9 H. M/ t. n if(flag==0) //没有按下符号键
4 F/ T+ j+ {9 f/ b {
! f) {# X6 F8 Z7 F //led=1;' v4 ~! o( K6 v- U8 P) }) W) Q
a=a*10+dat1[num]; ) j6 F2 g4 ]* d# K& F8 |5 f' x
}- ]; r1 G* m; n+ z6 m
else, y! l) [! P* [, P& _; w
{4 }1 j8 F2 ]- t I3 l' v, y
//led=1;/ O3 N3 U5 }( p+ i: r
b=b*10+dat1[num];" `! C# P, O5 C( q0 z5 ^
}
1 [& \7 j0 V2 E+ d* ]0 O* T
; \/ j9 x, [9 n6 e/ @. y# B9 Q }5 ?% X% r6 ?5 e0 j; G
if(num==3)% z" K$ i) J0 W- {% h5 N) M
{( d" h8 c. Z3 T: S) k
//led=0;' H5 H1 z2 ]5 v
flag=1;
* l4 T& a9 c( c0 }1 b fuhao=1;//加号+ ; |# h' k2 p: b7 A Q
}
- y/ H7 \2 t( v; t, D write_data(0x30+dat1[num]);
8 I0 `8 ?5 i2 m" |& H, E }/ l8 N+ u% c+ ]/ w
: d' s) K: q. K" P! L3 N P1=0xfd; //令第二行为0,判断是哪一列按下
: ^; c% l' T: d( ?3 i2 C3 D( f if(P1!=0xfd)
- V% K8 U1 k- T7 R9 D {6 Q K b0 j' A0 Y
delay(1000); B) [) R" c. }9 B- ^2 `) _0 H# E4 d
if(P1!=0xfd)
- g0 i, _+ B4 L, q* w$ p, c+ F { v' c. m* R% C* M) r0 h
key=P1&0xf0;3 r0 a$ H( Y# y, |# O
switch(key)" f+ `) H. P% S$ `$ C: O
{8 E5 K5 q5 Z* H" F
case 0xe0: num=4;if(keyflag==1){keyflag=0;write_com(0x01);};break; //4
' ^/ v9 k7 F* u8 z& C& T case 0xd0: num=5;if(keyflag==1){keyflag=0;write_com(0x01);};break; //53 ^# ?9 T6 z" B
case 0xb0: num=6;if(keyflag==1){keyflag=0;write_com(0x01);};break; //6' c) z0 o* k# N7 @
case 0x70: num=7;break; //减—
" u9 @/ S4 Q5 | } ) j1 @0 n" C: g: I7 u: O, w* I
}
- Z1 O( O W1 r2 y4 V: l* f while(P1!=0xfd);
R& W* f* w- \; r if(num==4||num==5||num==6)9 j j1 S% l6 t8 D% x
{$ f( u- U2 h- Y+ c4 h* d
if(flag==0) //没有按下符号键
/ b3 [9 E3 s! ^& A% P {
6 p" \2 w n; T+ H //led=1;" n' a1 p+ {2 F; W: D
a=a*10+dat1[num]; S5 W7 l+ z" c! }+ b1 `" a$ d
}: D @# N/ E6 }9 e$ @" z( a
else9 P5 A7 a1 T9 ~; ?* Q% \, _# p
{
, Q9 B) z% T5 q7 o) C) v! h //led=1;
2 n# u A% l$ b4 o- H b=b*10+dat1[num];' b( {4 |% v9 J+ K2 {% d9 K
}
/ V5 M( Q: b/ o7 h7 y }7 e/ v' I$ k3 c" X2 W$ n" S
else
7 f9 W; o& i0 G1 F8 `$ Q5 r: M {
) l! v# T: d0 R, y flag=1;% \3 V( ?7 ]: r! g
fuhao=2;//带表减号: l$ \9 C" {* h' D2 K6 j. B
}1 \; }# y& w- R6 m% a @
write_data(0x30+dat1[num]);2 E% R: v7 i# n8 l
}5 m# P' x+ `7 t! w
- h# Z! r9 |& ]! J& S P1=0xfb; //令第三行为0,判断哪一列按下
+ Y V9 G' g+ Q6 P* o8 ^ @ if(P1!=0xfb)
+ Y% f3 a! m4 |( ]4 B {/ H; S w# B1 E8 B/ O) h
delay(1000);8 J' j* \& G8 x& ~ d4 y5 ^
if(P1!=0xfb)
' {( i8 ^) t& H$ e7 G) ^ {% V5 ~' l6 S `1 `9 w
key=P1&0xf0;
2 e9 I: O" v$ U switch(key); Q8 _. {/ ]1 ~2 R
{
3 k( c* t8 m: X" g! @. J case 0xe0: num=8;if(keyflag==1){keyflag=0;write_com(0x01);};break; //7# Y9 W3 \) `, }4 q
case 0xd0: num=9;if(keyflag==1){keyflag=0;write_com(0x01);};break; //80 O: ^8 T) @, p& }. W4 w
case 0xb0: num=10;if(keyflag==1){keyflag=0;write_com(0x01);};break; //9
$ n+ ]: E7 ^0 @4 {% } case 0x70: num=11;break; //乘*
' o% x+ M4 ]+ J$ G( O* a, d }
; w7 Y2 e2 ~1 F }
0 B) b# E2 s! L8 Y while(P1!=0xfb);# Y3 X5 x4 \- `6 Q
if(num==8||num==9||num==10)6 P- C( \9 x2 C$ n
{7 U0 O! O$ H5 A3 Y) f; B
if(flag==0) //没有按下符号键
- W7 n3 |/ i( `+ ^$ e1 ~ {
! @, h. r! G: {8 M5 D //led=1;% E, T9 `7 R$ z7 r. d/ b% J6 w' c
a=a*10+dat1[num];
- o R2 ]5 N2 z+ t }" M9 L7 b+ Q! Q/ J6 f @; R* z
else
/ b6 J" t. Q$ F& p2 Z {
- e/ L1 m2 J3 R, N; D. E( e/ Z2 Q //led=1;
0 l& u" g0 h; ^0 g; l/ ~9 R0 o3 a! ` b=b*10+dat1[num]; T4 ^# V1 y3 W& `+ Y- _8 L& N+ F' U
}
% b$ L+ Z) z" J% ^/ ?2 {7 B8 }4 X }
1 a( M! D; y4 w2 S( S else' F0 z0 j0 A. k0 _$ s
{" l' R4 d, t" E3 U# Y3 y
flag=1;
0 h Y$ J7 g. k5 I: ` fuhao=3;//带表乘号*
( K5 _' Y. B, t }% J0 o- `& u( H2 Z, j& @
write_data(0x30+dat1[num]);
1 H9 B7 _1 s- t" K9 a }! U3 [) f9 k% m
; J% Z1 F% G$ x9 w+ l$ ?
P1=0xf7; //令第四行为0,判断哪一列按下2 b1 G3 G' ^( h$ P4 B
if(P1!=0xf7)
7 ^ F. l% ~ i9 j5 B {7 k s* |4 r/ d. p2 E
delay(1000);( @& x; x5 F' d8 ~) R8 a
if(P1!=0xf7)2 P; |1 Z/ c5 I- E' m. K. ]
{
# i g0 t( P) u1 _' E$ X2 P key=P1&0xf0;
4 k& v4 K9 u0 D6 L6 H. @3 E: N" { switch(key) C, P8 P( }$ G3 ?) d: T
{/ ^5 i- U2 C4 h6 V( q6 z" N
case 0xe0: num=12;if(keyflag==1){keyflag=0;write_data(0x01);};break; //0$ \9 _7 B% L+ |+ ]# u0 \+ w
case 0xd0: num=13;break; //清除rst$ }+ W+ |6 T! w D- h, }
case 0xb0: num=14;break; //等号=
$ i8 e& b, z- l) S9 o7 ~ case 0x70: num=15;break; //除/' G: C+ n, \4 I3 l
} 5 t& O& d9 A; h0 b+ B3 ~ Q% I
}/ E% w" r" H9 W0 B- W
while(P1!=0xf7);( b& g; Q% z3 d% h5 b. g
switch(num)8 E6 g2 a) Y0 T! s$ v
{- | ]$ E( b' x9 \6 R J
case 12:
3 w% O; K2 v8 ^: v* A if(flag==0) //没有按下符号键4 U# J" x; H4 |3 A$ i
{" H. w8 K4 T8 ^0 \ M
//led=1;
9 j- q- C: J. ~/ Y5 h. j8 U a=a*10+dat1[num];! d k3 L( ]6 {4 G) C9 g" z
write_data(0x30);
: E: \: f. L) u x$ K& B }
& Z& N3 J$ U+ R0 V else' T( S+ x" G- V8 Z% |0 F6 o1 h9 A
{
8 Z& f; o( M7 Y" K' S; @ //led=1;
& P/ _& Q) A4 z1 P3 j7 Y9 s0 U b=b*10+dat1[num];0 |! H7 G P9 h4 r' M% _
write_data(0x30);
* n6 b( |1 }, C7 w7 L' F. p% ?/ O }
: ^( e m4 @' [) ] break;# @- U5 e+ e# I: @8 b$ \
8 y& w6 L0 o/ P3 R
case 13: ' }/ V7 a0 X `; J0 e; y- G2 z
write_com(0x01); //清屏指令 7 Z# c+ f. H5 x+ g: L) W
a=0;
) |- Z6 [+ C( V0 d6 R b=0;" f7 n) }0 k& w" e* G
flag=0;9 k# v7 S+ k& X6 @2 S
fuhao=0;
: l0 R8 X5 O M: E6 o1 z4 J break;
* ^' A! L( I- Y% j' @! y: G( a case 15:9 d# c6 \1 ]* F M, U3 O$ Q
) p- D+ v: p+ p' H; u: @ flag=1;: W+ s* l- L" h7 J+ n, {! Z3 Q
fuhao=4;) N# U. Q+ x8 o* ?
write_data(0x2f);//除号/2 U" f: Y" g. V4 H4 k* S
break;
& E1 b5 J7 v2 C" d9 `9 [
% x! l: s- v) H% P0 U- S case 14: * o/ [! f3 n8 r# w1 F) i
if(fuhao==1)//加1 |. J3 o( T. \" z- I
{
, _! ~# h0 e4 \- H$ m8 I' x2 b write_com(0x4f+0x80);
- H% P8 A) T5 [: W8 z write_com(0x04);//设置光标左移,屏幕不移动
5 ?$ Y- \6 j n' {* A c=a+b;9 y8 {5 T& G# U1 Z6 R
while(c!=0) //一位一位显示
5 |1 }' R& \& E: Z* x {
8 S; Q& ?: G0 V) ? write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置# R% v7 `" E( \
c=c/10;//取前面的结果数据 + P% r4 j2 [7 `; X# f
keyflag=1;& n. d4 z7 k) O/ f" y/ h# }! }
}
) F/ F) f2 ?5 a8 H. h1 h write_data(0x3d); //显示等于号=2 h9 a( S7 m; g# m2 H8 o4 ]
a=0;* x* V0 W8 w4 h4 _1 l9 v. P( c
b=0;0 R/ B* d( h- \' v& Y
flag=0;) ?# [: a& [' f
fuhao=0;//全部清除为0) S) L- Y* E) P+ \" m
}
; e9 S& f; a( h5 w4 w if(fuhao==2) //减
- j' F g5 |8 ~2 Y( @ {5 `, x/ J- _4 q
write_com(0x4f+0x80);
2 |3 j. l# \* y( b2 e! f' l! Y# k write_com(0x04);//设置光标左移,屏幕不移动
8 Z; y+ u2 p3 I' V+ q if(a>b)
6 S5 U! P7 u9 W" a" A0 Z- _ c=a-b;
/ ?) N {$ X$ n! {9 ~' R else/ X0 x+ E8 ?; Y6 Y
c=b-a;8 M9 o2 z4 t2 q, l4 k8 E1 l
9 M: `% w: _- k
while(c!=0) //一位一位显示& S8 A+ j: r$ ]& C( o
{
" _7 d @7 r; ?# V7 g write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置$ F. C+ V/ u* O+ E" l' W
c=c/10;//取前面的结果数据 8 o. `% _- X% q
keyflag=1;1 R; Y+ o, T1 H6 b6 D- K! {
}
) t5 o( j( _. u+ V P6 l if(a<b) write_data(0x2d); //显示-号 B, r$ E1 i4 [1 [, @# t
write_data(0x3d); //显示等于号=' j* i2 r3 ~, T; @
a=0;
) V* U! n. k3 L8 Y" g b=0;
% K3 Q$ w4 M! _! p8 u) m5 ?2 D0 B flag=0;' o* ^& q( H* ]" Z& w0 ]
fuhao=0;//全部清除为09 o, ^) L: m4 I2 r4 ^8 |$ H
}* I$ u$ \1 d0 J+ ]. |! t
if(fuhao==3)//乘法 , s; R5 l) y) v8 d( G
{- `7 y# ^' `7 b; H5 ?5 z5 P, ~! Y# N1 q
write_com(0x4f+0x80);$ }7 _) P2 Z/ U
write_com(0x04);//设置光标左移,屏幕不移动
( O; d5 ~0 q9 J( S7 R c=a*b;4 p+ u4 w. w1 ?- r, U
while(c!=0) //一位一位显示% U/ p" n. W, J: ]5 G5 M
{$ l: ~0 s! X2 X! y$ t. l
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
- L, ?5 U9 K, h& b c=c/10;//取前面的结果数据
: g, c# F, }# n$ R' E' R keyflag=1;( T3 }/ I& R) R; G) O
}
7 i* Q ~7 e4 n1 P3 |5 z O write_data(0x3d); //显示等于号=4 b" U" K# z& i2 o' j
a=0;- B/ T! N- q S; a, y
b=0;
( F; U% r- f8 A: k- C1 f4 X5 @; V# m5 g flag=0;* O* z1 r; _- C% |4 o" U0 F
fuhao=0;//全部清除为0 " N# R9 Y/ o6 x+ R8 T, f( `) [
}
5 A ~7 N: M5 o" T if(fuhao==3)//乘法
5 A8 a: @5 m0 o; I' F {5 y# B( N; z5 e( t+ t# L
write_com(0x4f+0x80);7 F( U3 E J8 g: W G/ S0 C. W
write_com(0x04);//设置光标左移,屏幕不移动
& B ]# N3 G9 L a- b c=a*b;1 ]/ U( v6 ^/ ?9 E
while(c!=0) //一位一位显示
0 e& [" z) `% e; T! {0 Z9 o d {
: g. u y |+ W4 u5 i( _; o write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置- x% f; s: e8 ^& r" r% P
c=c/10;//取前面的结果数据
2 s$ C; P: @/ ^2 O- M0 k3 W3 Z keyflag=1;, U6 C* p+ U7 z1 Q
}5 C* p$ [3 ~$ K
write_data(0x3d); //显示等于号=
) U5 M' M1 e+ o a=0;
2 ?# a9 k# O2 c b=0;
9 d- b! q: [8 a flag=0;
+ c9 v# Z/ [ ^0 V. ~7 Y. F4 A3 j fuhao=0;//全部清除为0
; a4 E# o: [' f2 @1 V9 c( | }
! r$ v# B" P" W, V, v if(fuhao==4)
9 K# |+ N! L5 @$ T/ C* y( E {1 X3 M, m7 J' H7 Z+ }
k=0;) y/ n) D9 ^& ]1 y
write_com(0x4f+0x80);
2 A3 N6 K @# g" ?) H6 l1 ~ write_com(0x04);//设置光标左移,屏幕不移动. e: R- v C4 \2 D1 R6 u
c=(long)(((float)a/b)*1000);//强制转换为long。
2 F$ f% U2 J/ K7 h H/ ^ while(c!=0) //一位一位显示
* h% |. y3 z- A3 `5 e {
5 c9 V3 E9 {- @- }1 a k++;
3 V6 k9 q) s; d X' T- _; ~ write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
$ ]: R: V8 |* W2 l) n, ~& j7 ` c=c/10;//取前面的结果数据9 U' e0 J) m' E! A' V
if(k==3)# e/ l Y2 y. W# `1 T. s ]% D
{
) \2 d$ z# r& s- D, i- a write_data(0x2e);* N6 U' Z3 s% ?5 C
k=0;
2 b, {3 B; c- p* ]7 C }
% Z/ g6 f! h9 I: _+ C, m keyflag=1;
" d2 [% D: G5 x* e4 K3 ? }; Y! x z W0 F) P4 s8 k* v
if(a/b<0) //如果a比b小的话那么除的结果最高位是0
8 t: F" [( }. y2 z {
/ t& [0 y+ @" K1 _ v: u write_data(0x30);
0 S. d% ^" g& R }
4 W' p8 H; j$ H write_data(0x3d); //显示等号
' m% I/ l, U9 O, E9 I2 I" c3 V3 ~2 L2 Q( c+ E3 z& Y/ I
…………限于本文篇幅 余下代码请下载附件…………1 m3 w u6 m* V, b7 X6 J
* ?5 ?7 G. h( C
5 v( _' c2 I5 h, l |
|