|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于单片机的智能计算机程序 可以实现加减乘除运算1 u; m, }. h: I" h/ I' a5 t
6 O, ~- Y% i( T+ {/ O0 T2 y
! K2 [ i5 U! h. @, G
: d f; S: L6 P% Q B# a- `单片机源程序:9 G, {$ r$ g& O: e
/* S16 S12 S8 S4分别是123+
/ V3 q) W8 ]( r* f0 f P, K S15 S11 S7 S3分别是456-
; V# T0 }2 b R0 W1 |% Z$ Z! h S14 S10 S6 S2分别是789*
. K8 C( V& o5 b8 E S13 S9 S5 S1分别是0 CLR = /* i ^; a; _3 Y/ N7 q# e
*/$ {: \. }2 K3 C$ R- M1 [2 F8 q9 {- W! t
/* 实现两个数的运算,每个数的位数至少可以八位 */) ^( p6 X6 T- A6 `
#include<reg52.h> : t7 X6 I) a$ S: @
typedef unsigned char uint8;
" k; C3 w: p7 l( J4 |+ f, jtypedef unsigned int uint16;
: z% d6 {; q% @# |sbit rw=P2^5;
0 i) }/ Q8 u$ k6 Zsbit rs=P2^6;
* ~0 K9 e2 L# s% [/ V9 K* W2 Dsbit en=P2^7;* c! x/ \2 v: A" v- {3 j
sbit led=P3^7;, d* E. \ }9 B# ~5 p
sbit psb=P3^2;9 `5 q3 D: n% u) m+ D. w# H: W
sbit beep=P2^0;
; c! i5 @! [" E6 H. L! p! O+ {4 f0 kuint8 key,num;8 e+ I% M9 z2 m& B
uint8 fuhao;//定义具体的那个符号,是加减还是乘除。) J5 P- D1 ~0 @3 V
uint8 flag; //定义有没有按下符号键,这个是统称
; g4 I! b. W, O9 H/ s7 B: plong a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量
+ K; |6 V" r& j' y' xuint8 k; //定义小数点后面显示的位数
9 c& {# |$ X8 \* |1 _! C3 \uint8 biao,keyflag;
- Q) K3 Q6 X2 I! q) K; }' Fuint8 dat1[]={1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据
" f: L5 S: o3 x+ `5 h1 Fvoid delay(uint16 i) h6 [6 ]0 U. l% x% T0 X7 {
{' g+ n( x6 D- L3 e7 [/ Z. E% ]+ j, [
while(i--);- T/ l4 m; ~$ f) {2 n9 p
}
* o, ^4 k! ^ A$ O. l/ b9 nvoid write_com(uint16 com)
+ P6 x( a8 F3 R2 U{
* Y B, z1 c' ` e0 G rs=0;2 w8 p- `( z+ w* A
P0=com;4 e0 J3 Q& @' c" D. Q! i/ s8 n0 y
delay(500);
* o) p4 o% v9 x | en=1;
Z: v6 B# g+ s9 y% S+ n delay(500);" b* b0 G& O9 k F' b: s
en=0;- C) T$ i8 Z2 o9 E
}2 @; E7 Q: U( ]: Z" z% O; H
void write_data(uint16 date)) ^/ L S [7 ]4 m# J
{
6 m! W" ]$ W9 I u O rs=1;3 y+ }& [9 S* u% I4 H0 O) M8 n
P0=date;
6 {4 D1 w% w+ I' c! k0 Z& Q+ o delay(500);8 t8 ~, n9 V- ~7 [& a& m1 x2 R
en=1;9 d9 a' ?6 ^6 k! w2 {
delay(500);
& Q5 \8 d& X! T en=0;
8 D5 o7 Y8 T' e8 I' |: M4 k }
$ Z( o; G; j$ A5 F* ], Bvoid lcdinit()9 k- u3 `# u! G8 w3 L
{4 U' G8 L6 N! S; R
psb=1;% X p$ n' V5 J, s- n# o0 h
rw=0;
: D8 M8 j" d+ r en=0;
; {1 C0 H6 h" X0 p. ` S3 a write_com(0x30);
. k; F* x& ?* t/ z" d3 r/ |4 X delay(500);
: b, Y5 v2 z: | write_com(0x0c);
7 g4 R" }% |& X. L; v9 y delay(500);3 x- B# X+ i9 w& s7 K2 \
write_com(0x01); [8 Q2 O( a8 p7 O; h( {' Y
delay(500);
% P; r5 O7 l* b W" e% Z3 K2 \ key=0;
2 d" g( o/ d0 b( F num=0;
/ l5 B6 f3 e: p' r. l: H& ` flag=0;
9 T$ o r, `1 F% p fuhao=0;0 y& T4 m& s4 x0 K% C+ K# ?5 X
a=0;
4 z( ~/ J5 ?8 M5 }, x9 v/ p( Y) n b=0;
% K- |3 l" b9 h/ J c=0;: Q9 w, l5 \ d' `
d=0;$ e9 z6 ]7 c( t4 o
biao=0;
) Z! B: x& l+ d: u7 r2 _( f led=0;
5 |, ~) c/ s+ p' d+ v$ s}* L( r. A& D: c9 F! ~6 @8 V5 h
void keyscan()
% g* U5 |' V- I% f1 n{
' a' A+ `( J# ?1 L% c P1=0xfe; //令第一行为0,然后判断是哪一列按下: p) `- M. b2 x) ^! y9 b, ]: N
if(P1!=0xfe)
* d) }+ {' U) `& W {' @: \. L4 c. E. ]
delay(1000);/ O6 Z9 E9 y! h- ]4 U6 [6 q( }0 |5 g
if(P1!=0xfe)
4 Z3 @' f7 C: i {4 A2 T9 T5 v7 m: ]+ \
key=P1&0xf0;
+ z8 A( u n+ r* E" Y2 F switch(key)
, j5 i+ H @4 w/ I8 J {/ _8 l5 C2 T6 X! f: x ~/ |
case 0xe0: num=0;if(keyflag==1){keyflag=0;write_com(0x01);};break; //1: H! F$ C' O6 g7 Y# p" S
case 0xd0: num=1;if(keyflag==1){keyflag=0;write_com(0x01);};break; //2) I+ ~ g; P5 r! n
case 0xb0: num=2;if(keyflag==1){keyflag=0;write_com(0x01);};break; //3
+ {! Z4 t4 V" n) z; X( u case 0x70: num=3;break; //加
2 k+ e! Y7 q5 C }/ G( ]$ c+ ], {) y
}: u) x3 I: x7 j
while(P1!=0xfe);
# |' N6 v+ K: H& Q if(num==0||num==1||num==2) //确认第一行的数1,2,33 I( I! d9 ^) o1 L* R
{' Q) g$ X/ r; E+ `% f% m
if(flag==0) //没有按下符号键/ y+ V& h3 x' \ Z+ T8 T' @
{
# c0 p. B/ m U3 _5 J1 t Z& \ //led=1;+ o. }; |5 p4 a' R# u
a=a*10+dat1[num]; ?; n0 ?; s. ]2 ~% ~( V/ [
}5 ]. `8 y" [& G
else U' Q" V- n% D6 H
{
" _0 x: l9 V; L8 B4 ~ //led=1;
8 ]$ G/ q4 G* ~6 g" W, u b=b*10+dat1[num];! U: {( x0 P' K
}, P! w9 n% |& p, o# X
& a% M# K6 \5 @3 r3 E& s
}. {5 ?4 W* I+ l9 a) b+ X& h2 c1 i
if(num==3) S! n, n. h: k
{
7 L) C5 W: e- u' C' b* _* r //led=0;
- P+ m0 C) P% w" T* d' h1 t flag=1;
+ [. Q9 A! R8 @% L5 G2 O fuhao=1;//加号+
$ C# f: b0 B! Z. c- j+ ~ }
) a) s) Q" C+ y( j5 O! U0 G3 Y% s write_data(0x30+dat1[num]);
% w7 R- P( V9 f& g% z" c9 f3 C }
" z* U- C/ L$ i3 H$ p2 u2 G9 n4 V8 c
# b! I! Q+ @& c3 ]2 \ o P1=0xfd; //令第二行为0,判断是哪一列按下
' j+ u5 Z% t' f# V% h( w5 M if(P1!=0xfd)
5 ~* `$ K9 B9 t$ Q {
4 u2 b+ T4 C) T$ _ Z( p delay(1000);
2 O Y2 x3 |0 s7 d if(P1!=0xfd)2 G3 ]- e, M1 g3 c
{3 {0 z0 s6 d% \% z
key=P1&0xf0;
L* T$ A1 c. I* T& F switch(key)7 ]# R- M+ K9 M' I5 K% h
{
& F0 a/ Q ~+ }+ q6 O. W case 0xe0: num=4;if(keyflag==1){keyflag=0;write_com(0x01);};break; //4
" F3 j5 h9 w" ^5 K O case 0xd0: num=5;if(keyflag==1){keyflag=0;write_com(0x01);};break; //5+ F t$ J& ?3 v1 ]1 V
case 0xb0: num=6;if(keyflag==1){keyflag=0;write_com(0x01);};break; //6
6 d( S( _. h. v case 0x70: num=7;break; //减—
1 e9 Q$ E3 c6 d( r; O }
; H' d0 l# d" x% y }
# C4 U* K: K! o, I while(P1!=0xfd);
) A% Z6 H Y8 U0 e6 h if(num==4||num==5||num==6)( i; A6 V7 G( J& A
{
/ b, K n$ s4 A; g0 J, I if(flag==0) //没有按下符号键* l5 G# X4 m; [/ V. i; z& _$ k( T. ]
{
2 Y% U$ Y- d9 u1 f. G, u3 z7 Y //led=1;
' t& M/ O8 j4 w) ?8 u7 M a=a*10+dat1[num]; . h0 V0 P" k; N
}- O* x7 ~2 N( I/ \0 g8 R- [6 {
else6 m8 ?% N" g) _# B! \+ |
{- `8 W$ }5 H' B# w0 t
//led=1;
; ~; V u. w1 x, [: [; E b=b*10+dat1[num];
B; I. l$ y+ H7 W+ ]$ t: V- l* r } 3 B J/ k R& E* B) }4 p9 v- f( N
}; K% h- E" K$ R& _: K8 T
else
- |6 q; }7 u* L" U {. z }# u' F& E) e. X$ S
flag=1;+ J3 P( N. N1 w9 t
fuhao=2;//带表减号 e! E @2 h" ]# q
}" I# I" x6 w% L' U5 Y5 O5 I
write_data(0x30+dat1[num]);& y2 C5 G% N! w H* u5 \4 @; V
}
7 n3 W& u/ }5 {7 P! U7 j
; h# ~5 o- l, a% U+ P# h) r P1=0xfb; //令第三行为0,判断哪一列按下
# _5 _7 L( D1 [. \/ v if(P1!=0xfb): L6 B% X+ a$ F" v5 n3 K! R$ O
{
$ A" Q/ B7 R6 U! V4 }9 F! \) ] delay(1000);. c$ [& J( a* `+ H |4 V Y
if(P1!=0xfb)
6 T i$ }) |2 S. T4 a {
& o7 Z+ G' G: H: V' C3 M( k key=P1&0xf0; X" a5 N! i$ p- t
switch(key)
: |8 O! K6 Y! e) t8 ] {! p4 W3 N: H! \' ?. }' b8 u5 T
case 0xe0: num=8;if(keyflag==1){keyflag=0;write_com(0x01);};break; //7
( v5 K. I' {+ w) h* l& o case 0xd0: num=9;if(keyflag==1){keyflag=0;write_com(0x01);};break; //8
. V8 s" X1 F6 a6 i" e! m Y* k case 0xb0: num=10;if(keyflag==1){keyflag=0;write_com(0x01);};break; //9
! E) L$ [* }2 P+ L; {$ F0 L case 0x70: num=11;break; //乘** b: I$ P9 T4 f _5 o& C, N
}
- m# l7 e2 S5 {- z0 P8 |8 _ }
" [. k" q2 r* g) ^% i6 q* ^ while(P1!=0xfb);6 N1 N; s3 v0 Z; N) P& W. r# K; n
if(num==8||num==9||num==10)
9 s4 |, L% c; w {% u0 G" o' f: a, ]1 i
if(flag==0) //没有按下符号键
2 H. \# L7 X& q6 @" ~) c1 j x {
* _+ r- h6 |* F //led=1;8 w) s4 Y9 z% S7 p/ W, s
a=a*10+dat1[num];
9 z! W I! W& Y. u5 O7 b4 x' V }
: R$ Y. A/ n' v% S* M6 q else5 x I) ]- n; L$ V2 k8 q( W
{
4 _4 T( y2 U) M) K8 \% [ //led=1;6 u/ Q, L8 ?. C0 S( u- o6 }
b=b*10+dat1[num];) U8 w+ D$ C2 z; Q* i0 [
} : |- ^/ Y, s) F# S6 g) {
}
& K5 q+ G! p/ I, d, V else
7 ~% H: d/ d2 w {$ r- Q& u9 d1 W- r2 {0 ]5 C2 n3 f
flag=1;
" j% v" ~8 A3 n3 H4 b9 X3 e fuhao=3;//带表乘号*( V" |/ ~+ p3 W3 r+ V$ p9 h. x! a& k
}; ?& D$ A* d/ n" v# C! i
write_data(0x30+dat1[num]);
7 ^) a1 c: W) v) p" r }1 w: ]# ?+ v4 a$ ^0 }: s; Z2 n
% ?& H& @( t8 Z7 e) W P1=0xf7; //令第四行为0,判断哪一列按下
. [& {7 C1 L" q7 F8 P" F$ V' Y% W. L if(P1!=0xf7) g# I! T! X u# @: h. \- Y" o
{
& `2 E+ O( w4 a- K+ X- S delay(1000);7 U( s! k2 B8 A% L/ z, e7 Y; l
if(P1!=0xf7)
* P- C' n& q6 @$ o! `0 h3 v( K' M/ K { Z) d: o6 s7 ~' u2 ]% i
key=P1&0xf0;
: o1 K& _- M7 V8 A: H( X# i; E switch(key)
) g9 w- f/ a. F/ P {0 M$ }: B: I+ H% M( ~ Y
case 0xe0: num=12;if(keyflag==1){keyflag=0;write_data(0x01);};break; //0& ?2 d2 T* y5 B& \2 O( _, U) X
case 0xd0: num=13;break; //清除rst# ], E% x: ~4 T+ n$ G/ K
case 0xb0: num=14;break; //等号=
. J. s8 I$ d: u* | case 0x70: num=15;break; //除/# e4 X" C! y" T9 V
} * a, t2 c. F% ?( M. ~7 a
}: W6 X! T- Y! b5 K0 e- w) }
while(P1!=0xf7);, F3 x* Z; Y- P8 s0 s8 I
switch(num)
q- F6 G& `6 ?" }; ~/ c {! x8 j! p% R7 [; @. g
case 12:
j2 _/ Y+ p. V3 _3 v( O if(flag==0) //没有按下符号键
! n- p- d9 f, X3 O: `( _# Z" \ {
9 ?0 E, r& {1 C! N //led=1;4 C, g9 N6 Y6 ^0 Z2 \
a=a*10+dat1[num];% v, N6 _0 J3 N: E7 k1 r
write_data(0x30);
/ l. x: n; S+ |' y }
6 ~! I) B8 H2 L1 ]7 I2 \8 X0 u else, x# W' P& V Q( I( `' h% i' @7 {3 P
{8 N5 `- K1 L0 B# N
//led=1;8 N; K N/ L9 B8 b4 N/ J
b=b*10+dat1[num];
' |! d' I8 Y# E write_data(0x30);$ |) F0 {% [* P6 L! h
}
5 _# X6 H% d v! I6 o break;
- J; y. ]& }) O & d1 J2 K2 n$ f! B, v3 J$ f9 s
case 13:
" N X) O: c" {' V4 w write_com(0x01); //清屏指令
% c' J% @* X' a. Q: b a=0;3 q1 Z* h: Q/ Q: E3 W: s
b=0; Y) T* J; ^* M, s* F, @
flag=0;
7 I, O) O) P7 U4 |( O- Z" Y4 ~ fuhao=0;! m9 v1 p% n5 `
break; g; \+ @. U, j- z. q% x/ C
case 15: x: N7 Q0 n* x8 I% t$ R. l
- Z& _# Y5 v' y) f9 U' O flag=1;
7 k+ p4 Y# d. R) a8 n$ h; T7 v fuhao=4;
) ^+ K' W# @9 Y! _4 Q write_data(0x2f);//除号/
' i7 U. g% t4 s j$ j break;" ]; V, b" s2 P! t( r, F+ q) |' ?9 P0 u
% G, A+ @! { J3 [ case 14:
' e& A, `, a/ v7 h% N if(fuhao==1)//加7 ?, f; {6 ]. Q$ I0 K% I
{& h, e8 a# t6 X- E5 U9 s7 W6 r7 g
write_com(0x4f+0x80);
$ b$ O9 t4 Z3 i8 j6 I+ U* e write_com(0x04);//设置光标左移,屏幕不移动
5 I5 `, y/ O5 f$ `+ g4 B c=a+b;) m( L' T( P% y, J
while(c!=0) //一位一位显示
- l1 a2 B) p9 T- t {5 q7 c+ k8 j6 E% H9 b9 e6 Q+ U
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
" W' Q5 m; Q$ t0 z' } c=c/10;//取前面的结果数据
7 o# y: B3 ~. n+ x+ w q4 h keyflag=1;1 z2 I$ n: c; C/ v" A7 f6 U: x
}8 i# V2 \ }: v
write_data(0x3d); //显示等于号=% e8 f* _; B" A9 L
a=0;' {5 c1 c. i* K4 u/ f m0 m
b=0;
+ X) y# W# p: \: A flag=0;# u0 d& o6 _2 Y% v- Y& T0 X/ A8 [
fuhao=0;//全部清除为0
9 _% @9 s. D6 {4 w" p7 s2 @& Y. x" s }1 \3 d2 p: ], |; j/ C* g
if(fuhao==2) //减
9 y2 b3 I: c3 a: ~4 }. r2 U* ~ {
% b# H3 K, t/ b& u) f write_com(0x4f+0x80);
4 }# ^* m' D1 k2 q: H' ^6 w6 X# N write_com(0x04);//设置光标左移,屏幕不移动1 H$ ]6 T1 z1 y6 @
if(a>b)! u6 V5 [% X9 e7 G- m+ v' b' s
c=a-b;6 y7 K4 J2 U: D1 Z* c
else8 A7 N1 ?" {& E: ^7 y" X% I4 e
c=b-a;# S6 L9 r: ], s L* i
# h7 A$ E5 s% F5 i while(c!=0) //一位一位显示& a/ ~% R" X6 x; n- r0 D
{" |' |$ u" A4 J* o U
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
6 ?$ e- A6 v$ j9 O' l c=c/10;//取前面的结果数据 ( M9 _/ d: B5 [; ]* T( V6 M( {
keyflag=1;
# ?# s; ]- k4 z* o2 w }. m7 E' s4 g# s* a% O1 \* Z* A
if(a<b) write_data(0x2d); //显示-号7 @- S, Q6 c5 K- R8 o
write_data(0x3d); //显示等于号=6 V" u i, l* W7 I: E
a=0;% Y5 C2 a' G, {+ u
b=0;% L' r3 y$ Q- c# b
flag=0;' \0 r$ b6 u3 z9 U# J
fuhao=0;//全部清除为0% G _7 g4 O% j% H# o" f) r" M7 s
}1 L( g' }' y' w- Z, D3 M2 |
if(fuhao==3)//乘法
8 i$ ^* M9 e; s X9 t: W3 z; L {( Y% {+ I" ^+ P' \6 f! Z
write_com(0x4f+0x80);7 j( [* i" q1 a% w. a6 M: C$ f; B
write_com(0x04);//设置光标左移,屏幕不移动
4 N0 s4 j, _% P# D' l% i c=a*b;
/ ?% [' U6 \+ S( ] while(c!=0) //一位一位显示
/ O/ M3 j% t7 {* H, Q {/ \3 A0 E- K, w# U+ p+ ]- [% {
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
" T5 O* @% @) }% ~ c=c/10;//取前面的结果数据
) a+ R' t* a3 o7 D/ h keyflag=1;
% ?: N/ s6 L- g9 o( ^% N! K }/ U/ Y L- i8 t1 e
write_data(0x3d); //显示等于号=+ N4 w; [/ G, f% [9 r
a=0;( `5 b' v2 j5 l
b=0;
! O1 [8 I7 _+ v0 u flag=0;
% |) t7 k* n) w) b- @% r fuhao=0;//全部清除为0
5 N, i* ]+ s2 Q- s9 u }
& C( q! p/ \ u ^" ~9 d3 t& E if(fuhao==3)//乘法
- J) B. _% X5 k9 i; Y/ u2 C; N) ~ g {
0 K' `7 G2 l: q5 u5 [0 @ write_com(0x4f+0x80);: ^5 {& m, d- n9 P; p
write_com(0x04);//设置光标左移,屏幕不移动2 M# }3 O3 W$ m# k# L( R
c=a*b;$ z8 n( \7 d, ^, R2 Y
while(c!=0) //一位一位显示
* A i6 `1 {; S) ~( ^1 \9 V2 L* Y {
% B- ]/ ^& D7 R" d! |" f write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
; S7 [' T( K- S% s; i z9 G w+ V c=c/10;//取前面的结果数据 % w, d! y; o# M
keyflag=1;3 K8 B: L8 i: g& W
}; B3 v6 U) W @, ?0 ?
write_data(0x3d); //显示等于号=
! n; ^' A# z! ~2 e9 w5 n5 v a=0;' Y8 f q% S' ~( N! T( r% y/ d
b=0;$ t d) w( a& \& H
flag=0;
# J8 |2 Q0 C s; g, W8 d fuhao=0;//全部清除为0
/ o' n, h& B% |' T' ?. f p- @7 x }5 v$ ]* a- h* B0 E# I
if(fuhao==4). N& o; v5 g( r
{
: t/ [# d4 O+ @! l1 A6 K6 r k=0;
2 }8 v. V$ R- W# R1 t write_com(0x4f+0x80);
: M3 p8 `& N, r1 O4 y write_com(0x04);//设置光标左移,屏幕不移动, u6 [2 x( v( _' [' y3 M$ t* r
c=(long)(((float)a/b)*1000);//强制转换为long。
6 x- @$ O# u) V$ L) B7 P$ O" q0 R, M while(c!=0) //一位一位显示. o# e8 P3 z8 s- c+ `1 o
{
) R$ q" J) w3 S$ z/ b0 w0 F* Z k++;0 b) F& u! X3 J8 O
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置, S6 W3 V5 ?4 t6 y
c=c/10;//取前面的结果数据' ~8 ^: l' x3 a" \
if(k==3)
" I0 o6 g3 D2 v# [* W( V" d {
8 A$ V8 k# \8 J* S& h+ A write_data(0x2e);
7 h* Y6 p9 ~! _4 _+ `- c9 Y k=0;, k6 c N0 X. b' a. d4 Y* y
}
, ]7 ^ ], \: e- l7 M. T% u keyflag=1;
5 o0 h G. w6 S8 p4 u }
, X- l% J' p2 ?/ Z; D/ h5 O if(a/b<0) //如果a比b小的话那么除的结果最高位是09 z/ n* `# l: u( z& p- y0 s
{
W$ y+ B3 I, i$ N$ I! d6 f write_data(0x30); 6 z6 x. M- ?5 [# X% N( V& ^
}
& L* D$ c1 z; C write_data(0x3d); //显示等号
0 j2 i: \! L7 \+ C4 n) P$ Y8 t/ ]* W; I% @
…………限于本文篇幅 余下代码请下载附件…………
; [& K8 h1 S5 d
X# W |, A4 A% p" j" R1 \% H4 n6 {* x" L3 j- ]% D
|
|