|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于单片机的智能计算机程序 可以实现加减乘除运算
7 T' j; ^6 Z1 R/ [/ ]) q) ]8 I" j! d. ^
: N% h, R1 S( V) h, Y2 b# U0 {3 D
# s& g4 t3 ~9 d& L0 g2 e: B5 o
单片机源程序:) [& D8 o, o1 i" L
/* S16 S12 S8 S4分别是123+
) i- K9 M: D Z" w: p- i S15 S11 S7 S3分别是456-
2 Z: K( b H- g, t S14 S10 S6 S2分别是789*+ ]+ H# @+ \1 P
S13 S9 S5 S1分别是0 CLR = /
9 o+ ]; v2 _/ X$ L# {*/
1 n% K* ?" {8 \9 E% o3 a2 O/* 实现两个数的运算,每个数的位数至少可以八位 */2 h: V4 y* M$ t5 s2 J) e6 f
#include<reg52.h>
2 F( a' P) x+ L- b$ p4 O. j2 i3 jtypedef unsigned char uint8;
* r# g- M* u" O# I: Q6 X0 Ytypedef unsigned int uint16;8 z6 s, k. |) c8 ]& S
sbit rw=P2^5;" P6 v8 z* `8 k; y. b4 _- m% c
sbit rs=P2^6;. v* {: U. x& ?' X
sbit en=P2^7;
5 A- f; O: \9 o+ p* |2 }3 isbit led=P3^7;; h' U7 ] P4 D8 r* w4 @
sbit psb=P3^2;
7 l% z/ j, l. T/ P9 f5 p) g9 \6 Rsbit beep=P2^0;
8 q8 z2 W+ i( h! duint8 key,num;
5 Z+ C0 m! m: u5 G/ Huint8 fuhao;//定义具体的那个符号,是加减还是乘除。
1 B# L# f% i/ g% Luint8 flag; //定义有没有按下符号键,这个是统称
. S. W$ C* D6 X7 Q3 D# Klong a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量
9 |, N7 e. F; Z$ p5 e" w/ t$ D4 Yuint8 k; //定义小数点后面显示的位数0 M4 f5 H; n% j' w j0 ~- b
uint8 biao,keyflag;2 B8 f" r D. ?5 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 };//保存显示的数据
$ z* Q' x p5 P. z8 B, F/ f: X/ y/ yvoid delay(uint16 i)
: J$ q8 N8 @& n) f! J9 u{
- ~6 p- t/ F0 s* ~ while(i--);# `4 f, o; z9 m
}- Q/ n( u4 [" X* j( ~/ Y
void write_com(uint16 com)
6 F+ Z: I/ d7 a: o3 A{5 x+ H- M& |: F4 q# M
rs=0;. |5 K1 |7 g5 G; C f) Z
P0=com;& a4 }0 }3 i" o4 D8 ^2 d
delay(500);
- ?7 F# T) U! |& B0 \! {. k$ i en=1;9 X1 z3 \1 F0 `" f
delay(500);6 [0 h$ p3 X: I# A- R8 m7 @4 [
en=0;' m1 S5 |1 ]4 U; v! \+ J
}
( G% T6 r3 y+ r/ }. N/ Avoid write_data(uint16 date)
8 {4 }- ]& [ a8 P D0 h. N {, s$ L5 E" a1 z( |% U1 Z8 [
rs=1;7 b5 f4 `9 N3 _1 C' J2 n, ^) w+ J
P0=date;* j& `! F: D- J% d" Z9 Z) x" E
delay(500);
+ d% @& Z! R9 C3 v9 f( A' ]* k en=1;
+ ]5 W* j) D: G delay(500);
/ K4 I! x. Y0 i' r7 P' T en=0;: f9 q, x1 D8 Z
}- }( |' ?% d# Z# O. ]" F. `
void lcdinit()8 e7 V ^- v: f! g0 C/ c* e
{3 u8 }7 I) a9 Q+ Z: j" z
psb=1;
l+ o2 F* U! _" g4 X, Q rw=0;
) J( T/ H8 y7 a1 ]& H7 R1 b en=0;4 _) P2 r2 W6 @+ U j/ r* m2 y& z
write_com(0x30);
! V7 _& C2 g9 l: T. F delay(500);$ h" Q* J0 Z1 O) ]
write_com(0x0c);) W0 d8 d' `1 n1 f! @$ h# R4 {
delay(500);
+ C1 h5 F. ~" X Z( G write_com(0x01);
1 k+ D* p8 d8 ? delay(500);
9 a+ S( D( J/ h, s4 m9 j key=0;# V" {& _% p4 R* d% _$ x
num=0;) g: P# L9 c& W: B
flag=0;
- O$ \! ^0 Y8 ^. [ fuhao=0;2 X! u( B' ^8 p. G
a=0;
; Q+ s9 u4 C4 H$ | {* W b=0;
2 \( z: W2 M9 M6 }; T7 \+ g c=0;
4 b2 p3 _9 h) Z$ u) i- C. y d=0;
( o% P9 z0 y1 H; b biao=0;* N5 b+ M; b( H
led=0;
: `8 C4 z# e# D3 k% ]8 [+ C: _}
+ Z6 m2 a( N1 C4 Qvoid keyscan()( F4 ?" P8 s6 r# [$ h4 J9 _- |# i
{
5 K# ^# A7 U" B, ?, U P1=0xfe; //令第一行为0,然后判断是哪一列按下
4 F7 C* z# d, B( b1 h6 | if(P1!=0xfe)
7 O* T' e+ g6 Q, C {! p& c" z( C/ z! i3 d0 W- {8 q
delay(1000);
6 V$ n ?3 {3 z- s$ G if(P1!=0xfe)
8 P8 `& } S- H" K4 Q; \- J' t( K3 { {
3 W' ]7 ]- a6 |( t. h6 a6 d4 F% h key=P1&0xf0;
" A! l8 T5 f+ Y' b$ m switch(key)! r Y c# \5 ]+ L2 h
{
6 s3 |: o& R- s4 Y3 \ case 0xe0: num=0;if(keyflag==1){keyflag=0;write_com(0x01);};break; //10 f {/ o2 J; Z6 R6 v
case 0xd0: num=1;if(keyflag==1){keyflag=0;write_com(0x01);};break; //2% B6 r; H. g. L s$ R: l4 Z
case 0xb0: num=2;if(keyflag==1){keyflag=0;write_com(0x01);};break; //3% U0 |# f2 U4 o6 P4 H: l
case 0x70: num=3;break; //加
- W) x9 l& t2 d/ H" s }1 H, a; o. g( ? j) l
}, R/ b' r4 C! u0 _; Q/ |# @7 [& z
while(P1!=0xfe);4 v3 B0 c( Q8 l# J) |4 _8 s2 g r
if(num==0||num==1||num==2) //确认第一行的数1,2,31 g" K0 C$ N$ ]. a& [8 y" q
{
5 y8 D' i& R) Y- o* u6 _ if(flag==0) //没有按下符号键
# N3 N" T8 h; z {
! ]7 ~/ j c4 R, g; H) n2 m //led=1;
6 _7 P; q+ c5 N; W a=a*10+dat1[num]; . S% U+ L8 s& G! X# Y" d* S* p! k
}
! @- K+ o. w) ?- | else
1 |+ q( @8 \* m/ Q9 X) B {' X4 m: |3 ~& T) G" v
//led=1;/ |4 O# [% K; A# @0 B0 S
b=b*10+dat1[num];
! H! B% f8 l# t Y }
3 S" u' C4 k4 n4 u+ i! w ) I# O% w4 q4 w1 @: B
}8 _2 i' ]) ]$ P! t6 p% O
if(num==3)
8 l: B2 j; |5 c6 ^* t% q# p6 | {# C/ y" O0 {4 m# o0 D. I
//led=0;
" A$ T7 R7 O4 o( H2 o flag=1;
+ A* K( @- L9 J+ z& r0 d" \2 d, ~ fuhao=1;//加号+
1 c& G3 D1 G% s } d6 G- G1 J$ i. G9 K
write_data(0x30+dat1[num]);8 k- V1 L# D" e* Q/ t! z
}& x% ^ r$ X4 M; _' e0 D
]' T, L( i& I8 v P1=0xfd; //令第二行为0,判断是哪一列按下4 c* L5 O, w( ]3 w) B
if(P1!=0xfd)( ^, i& y5 `( d5 J; w
{
4 b/ `* f& ^$ Z( R delay(1000);
. V4 A2 N, w$ v5 s if(P1!=0xfd)& `- A9 G. L. f
{
% _! d3 c* G# `& _( U key=P1&0xf0;
0 @* \2 ^1 f3 E3 e x switch(key)
1 [3 J% T9 C6 s3 u, @. y" ~ {% h* g; _: X+ p0 c9 y% \
case 0xe0: num=4;if(keyflag==1){keyflag=0;write_com(0x01);};break; //4
* a4 Y- H( Z+ x. l case 0xd0: num=5;if(keyflag==1){keyflag=0;write_com(0x01);};break; //5
6 j+ n/ i6 f/ g: n case 0xb0: num=6;if(keyflag==1){keyflag=0;write_com(0x01);};break; //6
% {5 T T( u+ R* r0 Z; l' f case 0x70: num=7;break; //减—
& r2 J, T `/ q }
8 R: ~; Y) X& r; [4 i0 i' }( C }
8 l( k- T" I1 h; ]8 z while(P1!=0xfd);
% }) F1 h% f' Q9 O! T if(num==4||num==5||num==6)9 t; T6 _6 r, S2 n8 Y+ i
{& X) [4 @) y8 P0 l0 y" c
if(flag==0) //没有按下符号键
: b0 X0 l2 }# y$ O {
3 _3 k# ~6 P+ ] //led=1;' p0 T1 x# F2 L5 X g+ u. Q2 M) l, L
a=a*10+dat1[num];
6 j8 p" m3 L6 _( }/ `9 b( w }* W, L- }7 n4 B# ^0 Z! e0 w' e: ~2 o7 s
else, P4 I5 R& |4 A0 K- t
{
7 t: W$ w" \5 I //led=1;0 k' F% j9 p2 ~, K( I. g2 A4 A/ z
b=b*10+dat1[num];% x7 u* ^+ W2 e3 j5 U7 T
}
- S$ {* H. @! Z$ B: s: q }0 Z+ g0 O. S+ T' ^
else
5 [5 U! z* Y8 ~# C! G, b6 T {
1 W& B" j2 V; a& O: e! F flag=1;& L0 k; m1 H) ]2 v- _2 G% A
fuhao=2;//带表减号
\8 P" _) M7 w; ?/ h# E2 r" T }6 P/ Y( s; V& p; |" i
write_data(0x30+dat1[num]);0 q( h; x/ N1 _ l7 r j
}
( |, b! z, w' R+ x- D2 b* @, {% F/ m/ i# c/ a
P1=0xfb; //令第三行为0,判断哪一列按下: L1 n2 c( j$ q2 W2 I; T5 x
if(P1!=0xfb)
* E. X1 B( d7 ^! Y {' m9 M$ h4 X6 Q4 |3 e3 C7 S
delay(1000);7 x* t" c/ W) q+ @/ z
if(P1!=0xfb)
2 L0 R! W1 d) Q7 }* K) H# x/ s. x- M {
) ~" s& g& }9 _* n( ]# R4 H+ K3 I key=P1&0xf0;
2 w# d0 X% Y8 ? switch(key)7 _$ _: \2 @# o6 d, `# A
{% U( V- _7 N$ n- A
case 0xe0: num=8;if(keyflag==1){keyflag=0;write_com(0x01);};break; //7/ \ j2 |- |- @$ L9 a8 Y
case 0xd0: num=9;if(keyflag==1){keyflag=0;write_com(0x01);};break; //8
. `& l! `( _# v/ q0 a* K case 0xb0: num=10;if(keyflag==1){keyflag=0;write_com(0x01);};break; //9
' S& W8 }" z! G8 ~/ Y case 0x70: num=11;break; //乘*
4 S. Z, h- s2 Z+ U: R3 R } ; X- q# n$ }4 [
}
+ M( H' c3 c2 [ while(P1!=0xfb);
9 p0 M, Y9 S( G3 O$ K! Y4 \& P$ K if(num==8||num==9||num==10)" x' `* H& r' A- I
{" `8 a0 R$ X/ {6 S* N, U
if(flag==0) //没有按下符号键( p3 B$ p' G+ _" h3 ?( E
{
! Q( S3 I' f% g; ^* g# H //led=1;
3 K: t3 m8 S: B, P% y: u a=a*10+dat1[num]; 9 m* _# e# s- q
}
2 N+ |# Z7 Q d. v9 d' B else
3 R9 t: r2 w* `' N% [, s2 ?2 | J {
. f0 j Q, W: I7 H //led=1;4 r9 D4 \2 |) i6 [0 c
b=b*10+dat1[num];* u2 ?7 e% X' U) R/ Y
}
# @* @! x, f6 L0 U }
9 n1 J7 ?) }6 O3 u else
$ Q3 x, }6 U I, k' I; p5 \ {9 r6 \: J" l2 \$ @5 w- A
flag=1;
; _5 M5 K2 Z+ { P' g fuhao=3;//带表乘号*
/ y6 i& s! g: l5 `& o$ S7 d }
n1 Y! `, v" o+ R7 D1 C write_data(0x30+dat1[num]);
* T3 y1 \/ H8 b" ~) z2 Q' ~! A }
. }2 b( S$ S6 o4 [. ~
* m. l" b; g6 }. I; X P1=0xf7; //令第四行为0,判断哪一列按下% ?/ h% C$ K; m4 k
if(P1!=0xf7)
* b1 t6 F' }# p9 l# B {
9 H+ [1 s3 F5 u$ D delay(1000);" d7 Z- V3 n# B8 |0 X6 ?
if(P1!=0xf7)! H/ u5 g# i6 h* ~% H( t+ Z
{! L1 o0 I" U& l/ P, Y4 J: P8 X+ a
key=P1&0xf0;
: r6 V: R( m- _7 n8 Y7 \+ x0 I% w switch(key)6 s; i; q* T" w8 j) o
{
+ _! L0 O4 U5 P' O case 0xe0: num=12;if(keyflag==1){keyflag=0;write_data(0x01);};break; //07 N! ]3 |; F. D! C$ L
case 0xd0: num=13;break; //清除rst
/ w3 R0 A& a$ `4 c& o' L4 g) } case 0xb0: num=14;break; //等号=* q" P. D9 l. k& d; N
case 0x70: num=15;break; //除/1 K9 ^5 {* b2 j6 Y
} 3 \$ ?3 u7 z6 p b W
}
1 _$ n9 Q$ h) _5 I0 \1 S while(P1!=0xf7);8 s: Y) ~2 g; i1 G8 x, w5 e" R8 v
switch(num)0 W, {( k. _. u) a
{
, P; d: U8 d/ L8 k' R7 V; Z case 12: - G. B- i1 e' t3 ?/ ~
if(flag==0) //没有按下符号键
4 j9 y2 D5 U5 ^$ O {/ h) S1 B1 o5 n4 g$ i: T( q
//led=1;
/ B4 x9 r+ E* u" ] a=a*10+dat1[num];
o+ G5 w( Y& |1 ]+ H1 a) } write_data(0x30); 3 D! \3 \7 a5 C
}
4 T* S% _+ a; }, {) I' B1 {- M* n else
' s, ^2 A4 s* z, D6 \9 N {
9 V' N, F, H5 ` //led=1;- U/ R+ \3 T- @, j" U L' A
b=b*10+dat1[num];
8 Q1 y/ j1 l" i# K3 h( P, h: { write_data(0x30);
' \7 a' j/ G7 @ }! e; _& Q; m, b8 M9 t
break;4 c+ Q% \# c5 S' e/ K" c0 h( t
% u% z* n9 {& M
case 13: & R& V5 D7 ~! e/ ?3 S
write_com(0x01); //清屏指令 : R _& @* Z/ p
a=0;
5 u8 J$ ~& L7 V& B1 m. l/ l, j6 s% u b=0;/ V, R) ^! q8 n; }8 Q) n7 N$ N
flag=0; \/ n% {( L, ^2 M6 y: E
fuhao=0;. \! D+ p0 a+ G! I* H) p( I
break;
2 {, q8 g# y a case 15:* n- d3 R6 U+ L% s h
& L+ X1 ^& b1 s6 [5 Z flag=1;
p/ T" \2 I# O K& G0 L fuhao=4;( y: g7 w, b+ y! @! g5 z
write_data(0x2f);//除号/3 z0 I! Q# T) T6 ^
break;
$ N* _2 ~4 M6 N/ f4 K7 y$ J
9 u% L% a) X: {/ d2 s case 14: ! W& r, Q8 h& o8 u8 Q/ g
if(fuhao==1)//加5 T/ o( y6 {) N( J3 ^3 ~
{
/ W8 ~, _ D" X( n write_com(0x4f+0x80);+ E A% I2 P# b6 f2 }' m8 h5 e
write_com(0x04);//设置光标左移,屏幕不移动
$ h; u; ~9 ^5 q$ K" m+ F& Q c=a+b;
5 Q* l! r% m0 s. S6 E4 t: d while(c!=0) //一位一位显示
& I# w8 a5 [5 }' Q: k {
, d5 B7 c( F/ Z1 w+ J. M) \! u write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置5 d* |& @8 g, q
c=c/10;//取前面的结果数据
# B' E- x: l' v$ W6 l7 B keyflag=1;
- Q" H) \6 ^' {4 E* @9 J ]7 A }
7 F) u! D! K$ I# ^ write_data(0x3d); //显示等于号=
- V! o, w7 Z. B8 d! ] a=0;8 Z: w+ S O0 L1 c! D
b=0;
9 F. n$ u& i; Y. O$ Q7 H a flag=0;! o" x4 ]! ^5 ^. |! Z' J
fuhao=0;//全部清除为0" [5 T! e) m) {+ E
}9 R5 V5 J( `* }* m/ F, k+ {" D
if(fuhao==2) //减* q% y: ^+ P' F1 o2 Q. f/ w
{
! F/ L3 k- t# e0 w# q3 {% d9 p write_com(0x4f+0x80);& ^6 S i' ~* p) E( s# V' n
write_com(0x04);//设置光标左移,屏幕不移动
' q7 d% d P. |$ I; f& P if(a>b)# k5 R) [& H6 `. h2 ^6 C6 g
c=a-b; |( j+ ? o+ J3 Q7 _- }
else1 G) f' L* A: C }
c=b-a;
* _3 h' c3 u) G; e1 G; Z* H
% W: z w( J. B. O9 F( B while(c!=0) //一位一位显示
! I! j+ H( X- f+ K. K {& P3 H; w+ |& `% x( w
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
# c3 [) O/ g* v c=c/10;//取前面的结果数据 5 M8 K7 B5 Z% a+ j
keyflag=1;
: L0 c- Q# U* Q( ]$ f* W }2 l7 x& Q& C7 q# J
if(a<b) write_data(0x2d); //显示-号2 ?8 e/ i) y, Z3 J1 s0 e' e
write_data(0x3d); //显示等于号=. r9 f8 Z4 y9 N4 u9 O; N
a=0;7 D. } Y6 h5 l5 d x
b=0;
; v* H) m1 \8 a. f% q' U) S C# w) D flag=0;
4 N+ h: N- N; U% v+ O fuhao=0;//全部清除为0
5 z. q7 s4 n3 K }0 @1 q: p' D( K* R3 Y5 p' d2 g( a
if(fuhao==3)//乘法 ) @! ` e' S/ R1 F& C) z a4 }4 Q
{% n3 e$ h4 o( B `! C" R* M
write_com(0x4f+0x80);
3 Q4 C5 E. n2 g; w5 ?2 H; ~/ e write_com(0x04);//设置光标左移,屏幕不移动$ b" P/ C9 h2 U3 F
c=a*b;
) A* ~! e9 ^( G, }1 a+ i. N- E while(c!=0) //一位一位显示. M2 ~8 O& z7 ^: U3 M0 v% _6 Q
{
$ N" v$ |, h R; }. g write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
* u0 c( j( y3 y9 |7 {4 c c=c/10;//取前面的结果数据 W% I% o7 n5 ]$ x
keyflag=1;# C4 A0 S8 K- a/ e4 l% ?5 }
}" F5 @0 x& n3 `; R0 V
write_data(0x3d); //显示等于号=+ i; j" z# v: S
a=0;
. b3 {' _! X' e$ n. |& T b=0;
$ N& O" K+ A2 y5 c. x0 a; U5 t flag=0;$ c- t K/ W; I! V3 `4 s
fuhao=0;//全部清除为0
/ x7 i9 x8 `- @0 w }
6 W" Z6 t% J% F; \ if(fuhao==3)//乘法 . U" c/ ^% x, W3 o N+ P1 C3 S
{
9 o! K/ Z& I9 I; g8 c write_com(0x4f+0x80);
& S( f+ B! |" G write_com(0x04);//设置光标左移,屏幕不移动
( Z) h. g# _) ?: z! c c=a*b;
5 J, T2 T+ n2 n' U2 e/ O! ] while(c!=0) //一位一位显示: k/ s6 x: X* \0 ]4 g
{
+ ~$ P3 d0 N7 t4 G3 f. i* }" N$ F write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置! `7 G, q) B( @/ `4 `+ b
c=c/10;//取前面的结果数据
1 q6 W3 ^; `; z) O keyflag=1;
0 k5 l$ O: y" k0 H }; Q W5 y- L. H. O# Y1 Q% r5 b
write_data(0x3d); //显示等于号=
" w* o7 F6 }- C a=0;
f E' H3 |- A# X8 w9 `& i6 e b=0;
/ k8 P# ^9 G V3 L& ?; i& A- G1 s! O flag=0;
/ f5 V4 }& l9 B+ R9 P" Y fuhao=0;//全部清除为0 1 |/ [( n2 r) `+ D* v' Z3 J
}
1 o+ Y8 S+ W7 K if(fuhao==4)
" B& }, V, r- D4 N! n* ]: m {+ d" n9 r' D- M3 }( _1 u4 B
k=0;
+ f% K6 e L. w( S* \; ^0 V write_com(0x4f+0x80);
0 L7 C$ s6 |/ ` write_com(0x04);//设置光标左移,屏幕不移动
& m' W L6 m1 o3 W c=(long)(((float)a/b)*1000);//强制转换为long。
+ Z+ m2 e3 ~5 U2 i- Y' C: h while(c!=0) //一位一位显示( m& D) c: H- S( K G+ [5 x
{3 a; `. B4 G2 m. Z F% t, l
k++;( p/ Y; }/ [9 A" {
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置$ k: T, C5 @ V) B/ V4 X
c=c/10;//取前面的结果数据
4 Z! p( G g! _5 q' j if(k==3)6 C E# @; a: J: [6 E- j" Z8 b
{( _4 }4 o% j8 w1 k
write_data(0x2e);$ |% V2 {7 O [' s. p8 _; z
k=0;4 y3 b! y1 P$ c
}
' @5 r8 G* u/ a0 t" a% L keyflag=1;/ ?2 Y5 x9 E; r' ]$ U& i
}
9 U4 z7 b8 w% x* f9 q if(a/b<0) //如果a比b小的话那么除的结果最高位是01 \5 u( K1 {& j* b0 b
{- u$ G& t! e' h* g
write_data(0x30);
9 g8 {7 y5 m; k( ?* o$ I }% s2 ~1 Q7 {& x9 {! ?! b. k6 u8 b: v/ k
write_data(0x3d); //显示等号' E% w4 v: J) [
' a6 K5 a- Y$ X
…………限于本文篇幅 余下代码请下载附件…………( @; o4 p" p: U" b
; ^7 E# q& G2 h; Z! @
2 G, m. }, r) d! n1 {/ d; ^ |
|