|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于单片机的智能计算机程序 可以实现加减乘除运算: |" }& |. ^) Z% _
, W4 m9 _5 a. b+ a% ?
8 R' }+ ]) {3 o0 i( r' @. w9 {5 ~- s) R9 s
单片机源程序:
5 N4 y, x3 k3 v$ x/ G/* S16 S12 S8 S4分别是123+: r6 I# Y* Z Z$ V" e. \) b
S15 S11 S7 S3分别是456-
* R t$ h8 `1 N2 @8 s5 ]! a S14 S10 S6 S2分别是789*
j4 _$ A, ]7 I5 w" D& z( |7 t S13 S9 S5 S1分别是0 CLR = // s- v$ a' Z6 G! d9 X
*/% K* w5 _1 Z! ~& P
/* 实现两个数的运算,每个数的位数至少可以八位 */
+ f; ~! H* U9 z' Q! ~, A+ l#include<reg52.h>
3 k$ n. b, H2 }* otypedef unsigned char uint8;& x% v" t& A' t
typedef unsigned int uint16;
1 B/ _/ u, E3 S6 h5 ^sbit rw=P2^5;
5 ~4 c' ^6 O2 Z) a% h1 s* i7 [sbit rs=P2^6;* Q" N* v3 ~; c( S! Q8 k) F" K
sbit en=P2^7;
+ w+ _ _3 K/ _( \4 T/ K4 h' J1 Zsbit led=P3^7;
7 z, |/ r/ Q$ j4 I; R( m: e nsbit psb=P3^2;$ O/ o5 m8 Q5 }# }8 n
sbit beep=P2^0;
- z, K: p- ^7 Nuint8 key,num;( Y! F( i, u' r3 G. x% B4 N/ v
uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
: {+ S! d- ^2 I; @& v4 W1 iuint8 flag; //定义有没有按下符号键,这个是统称
( N$ [" F; j9 i! K9 g* ~8 |long a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量! F v- p0 R: D2 Z/ X$ O4 r
uint8 k; //定义小数点后面显示的位数
& I$ q' {2 A: c( T. K2 V% }! ^uint8 biao,keyflag;
& f7 k, m: y1 b1 }9 j3 Quint8 dat1[]={1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据$ ^) l1 v4 x! k. }
void delay(uint16 i)
, m" t* d t% q& O! E{
- S: ^& m4 S R4 y. q while(i--);
, E- a: ]3 A% T( Y}) ~$ p* L" \, g
void write_com(uint16 com)" r+ ? ~! {- u2 D+ A
{
7 p0 Z7 t& z: m* _ rs=0;
4 V& Q# g1 p2 h6 D8 M0 y) u P0=com;
; x8 d! [3 P. Q( L v0 B0 W1 Y7 D+ {! J delay(500);
% F6 s, z2 S" I en=1;( N0 G5 D; n" }, ]) |
delay(500);
. }5 r" r' ?1 r% V9 L en=0;1 a7 {+ ]+ Q& ~- s5 E5 H
}" |2 _2 H* w1 e3 ^& }
void write_data(uint16 date)- W' D) L* g+ _, D! ?$ H# u
{
$ [* P# y0 N9 y0 o+ l rs=1;
+ W2 k/ w* } p% x' C& H5 D P0=date;9 N7 ~! ?% E) w0 F# q2 L- m, j
delay(500);/ r+ {+ [* @7 x3 _2 b' N
en=1;
& ^+ k5 r6 ?8 W* Y! S$ K6 A delay(500);
) H8 F! f+ m# C! |) v% y) P* D. j en=0;
7 I7 M) p8 t' i% T( `! F4 K }; Q' ?) C5 M: I; C; ?" z+ x
void lcdinit()
' k0 F+ J. m9 ^5 k{
$ x9 G) R/ J; O$ b psb=1;0 G! w/ H5 O; C# x |% a
rw=0;$ n/ S1 z% H. Z" E
en=0;
9 z |/ Q% `. |3 { write_com(0x30);
8 q( J9 P5 [, ]& e$ f# O$ { delay(500);
. e" Q: A7 H3 I% x6 j& n* a write_com(0x0c);' H/ i8 Q7 f+ s/ V& N; ~/ M! T
delay(500);
, t0 h- n' O7 c# a# k7 H write_com(0x01);, _4 r; ]6 _5 V u* m' l
delay(500);
8 Q$ }) X9 g) _9 O5 |/ K key=0;) l7 r( @% J5 F! h9 Z7 s; h
num=0;
9 z1 K( Z6 m" M5 a+ J# q% d flag=0;3 {+ O. W, N7 w7 n
fuhao=0;& ~7 t) g/ M; I. |* {
a=0;
* M7 p1 z) y! u5 h) p+ ? b=0;5 b2 I7 ?* m, Q7 `
c=0;
- ?2 V9 z" l6 @2 F/ c d=0; ?. {5 ^/ B* e4 C
biao=0;
8 e( e' H7 C6 m led=0;: ]3 ^: n! C+ _; t2 D
}
& b: q, n7 z$ @0 l6 n6 q7 Y$ h& n5 C3 qvoid keyscan()) l1 M) i. C1 k) l0 \+ l/ G. M
{: W2 k: y" h4 z7 p% s/ E5 f
P1=0xfe; //令第一行为0,然后判断是哪一列按下
, G9 _3 X# s2 }1 [( y8 R if(P1!=0xfe)
. o- w U- J1 B6 S {& r" E. \& o f9 k
delay(1000);# {* e- B. ?+ l) T! A6 ~
if(P1!=0xfe)
8 O4 z8 @" a2 y5 u9 T1 A {3 b: h, ]. Z3 q$ a# ?8 S7 |
key=P1&0xf0;" m/ y# q9 J1 f p9 H! c
switch(key)
, R' U! w; e7 e1 z {
M3 x4 u3 Z; ~; n case 0xe0: num=0;if(keyflag==1){keyflag=0;write_com(0x01);};break; //1
2 z( {. s t* c case 0xd0: num=1;if(keyflag==1){keyflag=0;write_com(0x01);};break; //2
' m1 k1 Z* k- u case 0xb0: num=2;if(keyflag==1){keyflag=0;write_com(0x01);};break; //34 U# t6 B& Y3 j1 J% L6 o& |! T; d
case 0x70: num=3;break; //加! q( f# _ n# K) P
}1 H, h3 g: A3 j8 @$ O
}
9 P; z# V/ z* z. D/ S while(P1!=0xfe);
' e" n- M) `% B. z- }9 ~ if(num==0||num==1||num==2) //确认第一行的数1,2,3+ Y l7 J" s6 o/ A) s6 h) Q
{
% {' z, R! N' ]' Y if(flag==0) //没有按下符号键( q+ L4 m" x# k6 z+ _2 I: \( Z
{
# f$ `( a3 j( F. U' d" h6 E //led=1;
9 b+ e9 I( Z3 q a=a*10+dat1[num];
; g+ W" l) _! k. m, s0 h0 V }" @5 q5 \( P$ W! |
else
3 z) A3 k5 M* U# s8 q {
# Z, d0 C* a- ^ //led=1;5 T% o/ j% r( F. e( s/ y: h
b=b*10+dat1[num];
1 o. s* V. u7 ^! K }
7 Z9 u& [# G- Q4 W ( L0 r6 ]* J6 m8 T3 E: n! \- N
}
: m: b0 F; h3 J5 m2 {+ p2 N if(num==3)
- m) u' Z/ M- [0 L% O$ `5 y; R {
3 O/ m/ w0 j! r# |, \ //led=0;
8 `* H4 s' M T' S& |* j7 g5 b' m flag=1;# ]- ~. Z9 `+ s1 [1 @0 m
fuhao=1;//加号+
2 r [$ J. u3 Y3 b }1 q0 y' |0 h9 }* J+ P; V
write_data(0x30+dat1[num]);" R- [5 K. n1 q* ]. k _
}
+ R3 T$ G3 _6 L3 P/ w; P: L/ ] x5 }4 C! d; Q* ~
P1=0xfd; //令第二行为0,判断是哪一列按下! ^) p3 C x' |0 S; t. {
if(P1!=0xfd)
5 p' m: j4 X7 l& j' {& J) h- s {
) l' d) ?& ~5 _1 P1 p! e delay(1000);
- P* [. A4 `; P: X if(P1!=0xfd)6 P( g; x& F4 _2 B7 }( f- A1 o5 e0 H
{
8 n3 }4 J- D: _( _/ e" }( i key=P1&0xf0;
- R& @, |0 S4 L" J% K! f, ~ } switch(key)
. O c% {: W* A1 K6 ] {4 k: c! G. T: ]& r* l* S
case 0xe0: num=4;if(keyflag==1){keyflag=0;write_com(0x01);};break; //4
" u! _' L) c! K' V% n/ S case 0xd0: num=5;if(keyflag==1){keyflag=0;write_com(0x01);};break; //5& o* U; O/ k' N0 _
case 0xb0: num=6;if(keyflag==1){keyflag=0;write_com(0x01);};break; //69 c$ l5 d; m# X8 E
case 0x70: num=7;break; //减—
" Z* K1 u. T) b. i# F" k } / k9 L, l" n. L% D) m1 _+ C# A8 \
}8 \7 a2 m& k b) G
while(P1!=0xfd);4 Q: R" c; g7 x" X
if(num==4||num==5||num==6)# R' s; `- I* X# A! b
{
$ H- Y( f- S. ~. j7 O if(flag==0) //没有按下符号键6 r1 u$ h: O$ ^1 J& H& Y
{
) `# I9 a9 D8 f( z. f //led=1;
. Q* V& X7 k8 L, { F/ S a=a*10+dat1[num];
' l/ v. ~6 |+ R( w9 k7 `& |0 t }0 H! x: g+ E g8 r% b( o$ F. K
else4 l; Z3 R! K1 w/ j6 h
{
5 v- w/ z! l. C2 @' O+ M& |, X //led=1;+ s( R! A: h5 p5 E
b=b*10+dat1[num];3 z1 I& b! m& x) i5 C; K
}
- N; Q6 F4 j, R! Y- q) _ }) S5 U# u7 c* O, }
else4 S5 T: {' @: Q( x8 q
{9 c+ X8 T, u C. K* o# P
flag=1;% u6 T# T/ i9 g- d# |& F/ G
fuhao=2;//带表减号: U$ l- A- G. ^' @2 z1 i
}- G% c- Y: E; B, ~
write_data(0x30+dat1[num]);+ M( f$ n/ t" |9 L4 D7 B9 N
}1 I& K0 [* p0 K6 d' \; K! R" P
: n, a9 M' i5 c- D8 f P1=0xfb; //令第三行为0,判断哪一列按下
. |& Z9 v4 v( e9 L( \0 a/ u if(P1!=0xfb)
. l! s% U& ~7 E9 ~ {
0 ?, a, L/ D% i delay(1000);! a" \2 [7 e0 V6 r3 l2 q+ L
if(P1!=0xfb)! G: E" g% P! k4 ~$ w+ h5 u
{, |9 A7 Z& _% u# J
key=P1&0xf0;+ k+ t1 `: G+ B- R% p, \/ _
switch(key)/ t' J0 b! b! m& P) ~! t& I
{
- ~* h; s; X/ {0 T: O8 m3 o case 0xe0: num=8;if(keyflag==1){keyflag=0;write_com(0x01);};break; //7
# Z# K* n* r' D" L% s' _ case 0xd0: num=9;if(keyflag==1){keyflag=0;write_com(0x01);};break; //8
1 A C: k6 i/ w case 0xb0: num=10;if(keyflag==1){keyflag=0;write_com(0x01);};break; //9& f6 b$ m2 b# @7 c( w! C9 _5 B- ^0 p
case 0x70: num=11;break; //乘*2 o" J/ Q9 r' r0 V
}
. Y" h' _. i4 y! n8 H }/ W# d/ H! [: |/ E% y- O( p# |
while(P1!=0xfb);1 s; o! L! k. }3 h4 E: B
if(num==8||num==9||num==10) d2 w, \6 o! r
{
( Z& k A/ J6 I& ?. Q+ J$ e1 t if(flag==0) //没有按下符号键
# z( F3 k5 q' R2 z3 A0 V {
% E1 o c" O( n //led=1;
1 z+ m' }. q1 q" O( j" s a=a*10+dat1[num]; 3 V6 S! _3 s! ?: `! M
}
( x* t' _2 G: R else
) s7 m9 i! Q, ?4 y2 j% F; V {
7 R4 h2 ], c" T; E/ r: I //led=1;
7 u( {& E! O9 I: a1 h# {7 K; c b=b*10+dat1[num];
8 u+ Q% y- g( A; }! r+ d } * j* l K' O4 S- s4 Z7 W
}1 s5 g* l) n. W' ]
else" ^6 }! c5 K( D4 t
{1 F1 ^! B% w) @. n% n- U
flag=1;5 d& N# S( i0 f* ~; Y S
fuhao=3;//带表乘号*
9 x7 D/ ]6 X' Q D! r. u }, N5 A# F" K% y, G, u
write_data(0x30+dat1[num]);
3 K6 B6 j4 f( ?! ?, ` }
1 o5 o# n. R' R) C6 n5 V, p
; O' P" |: C2 u! q' l P1=0xf7; //令第四行为0,判断哪一列按下# S2 d9 A5 {; U0 J
if(P1!=0xf7)8 g7 t6 j7 G; f" `6 z
{
0 l3 R" |7 I' K( B; X delay(1000);$ n6 D# b/ P' \, c0 k, Q1 X
if(P1!=0xf7)
$ m( F6 F5 Q3 w5 n x {# k' w; m, @* y9 S" Y
key=P1&0xf0;! T# Q: R# K: o L; P/ v
switch(key)2 m( J1 G8 t" n* N1 h4 b" a
{
% Z! B3 ^7 Y; _8 n( K case 0xe0: num=12;if(keyflag==1){keyflag=0;write_data(0x01);};break; //08 [9 K( ?4 a2 x
case 0xd0: num=13;break; //清除rst+ b4 S" f7 ~3 J9 ~: k a; T
case 0xb0: num=14;break; //等号=+ v& G2 A" J5 p
case 0x70: num=15;break; //除/; x# k9 T, {: X4 S! @6 f
} / I2 |9 K$ C4 Y& x, A! l) |1 k
}
' T1 ~- |" N' x1 M# ~' U while(P1!=0xf7);
% j" V( ?2 D7 \; a- r8 B1 U* W3 X switch(num)( J- a4 n k, B0 S& y1 [ w, k
{+ ^) a; w+ I4 T
case 12: 0 s- h. |) f) N0 K
if(flag==0) //没有按下符号键
( p9 X! q% |% m* d+ Z/ d {8 `: H+ D) ?. V0 e6 Z
//led=1;2 Y; H- a/ D1 x! o. |! ?0 Z1 {/ Z V
a=a*10+dat1[num];
" B9 C; a4 e+ S0 w5 P1 c# e write_data(0x30);
B7 j& R) X9 H' {- d9 k }# M$ V2 `8 @* T% M
else
( ~8 \( H; B |7 @! C9 w% ~$ m {
- Q2 a2 n" L# R" a //led=1;
& z: L" M* ]; { b=b*10+dat1[num];' S' g" E' |; K" f4 Q8 I' m
write_data(0x30);
! C7 R% l7 @# i& |/ X. E }
- A+ e) u& q/ x; m( ?' @ break;9 b7 u& @5 K& P, K# o. ^
) D* X" I% K% K5 K# ^! A case 13:
$ F) G( q$ C4 I, X. K6 s% H+ G8 l) d write_com(0x01); //清屏指令
/ b( s% E0 Z& P, e- F, y& H4 T a=0;
& G" C2 X) Y- p b=0;2 \4 S O+ F# y& V
flag=0;
6 b, J9 l* S P0 H2 ^9 _& \, _ fuhao=0;/ q) x$ }5 s Y) C
break;
0 w+ |3 v/ O; z5 W case 15:6 A; b6 h! w c% d [
0 a! j# w3 F- [& U" F6 v flag=1;0 c. o- `! Z$ c* w
fuhao=4;6 `, P: r6 Q1 c( p7 b% Q& \! l
write_data(0x2f);//除号/
. H' ^5 X) e G# A- `8 c. t1 x break;: n+ a; G* x9 i+ H; Q* \( [0 _0 v
4 \' O" h+ `+ D" ?6 P
case 14: ! R6 W9 Q( c" |
if(fuhao==1)//加( A' Y, `% F; a3 Y4 ^% B7 X
{
9 `- S* s6 L% S/ B. f5 E( \ write_com(0x4f+0x80);
9 _ T. f4 _& H% Z write_com(0x04);//设置光标左移,屏幕不移动
/ T9 S' L4 K* a" H; |2 T8 P- p8 ? c=a+b;
) g& M) N3 U% l# Y while(c!=0) //一位一位显示% ~, l$ M' V1 N( W( n' n7 A1 m
{
`, D- L. M! p6 L( Q" T" F write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置) H, d; R# g* l' B
c=c/10;//取前面的结果数据
& b$ d+ G, ^ I keyflag=1;, Q; J: H& l# H- V3 o# T
}1 b: g5 |2 |. V l
write_data(0x3d); //显示等于号=1 v' q& {* U3 u: H
a=0;
! u& j& O$ l, |+ u9 O" b; k9 ~2 t b=0;
1 I9 |' m+ _! W5 t& \ flag=0;
- t' ?3 H5 W; O+ Q! X fuhao=0;//全部清除为0' K1 D0 G# r3 \7 ^- d: {* e) j
}
% `3 n* s# v2 \% e if(fuhao==2) //减. U% Z2 _ @4 |0 m7 Q5 {, P
{
- L4 p! ^) I# [& d* H9 S write_com(0x4f+0x80);
0 x6 b j/ ]) o6 `" \2 `. A* t write_com(0x04);//设置光标左移,屏幕不移动
& r% w/ |( C) L0 `; g; U if(a>b)5 v( L( h& M7 r2 w! A7 B
c=a-b;
" S) d& f: c# p; _% {2 e! T5 a else
- O- c% ~4 q7 i/ H c=b-a;
) F z) q* K( w; L 0 ~2 v& o& V5 `7 c/ `% [
while(c!=0) //一位一位显示+ V0 l4 ]9 L* g; K b
{( V1 M- J4 ^! E& P. P
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置' ?: B% g0 z) E
c=c/10;//取前面的结果数据 6 m& |& v- q" R$ Y
keyflag=1;* B$ V" ?; \5 U* N, B1 x( r) r6 f
}
; b8 r3 Y4 Q4 W$ V' \8 P7 v if(a<b) write_data(0x2d); //显示-号
3 F' \; |7 ^' \' M8 c; A; | write_data(0x3d); //显示等于号=
9 G0 h" |& S! O: y, D2 Z a=0;
7 i6 I& `* B* I% @0 \ b=0;' I8 d, a! O0 h% D3 L) B0 c: i7 u
flag=0;
5 k7 ?) n Q5 t) O fuhao=0;//全部清除为0
$ D* W3 w0 u9 A8 w# b2 e }) q6 S2 C J5 r. T1 s0 L' Z
if(fuhao==3)//乘法
/ j+ C" S) {: \ {' ^4 b9 j+ e! [; o" g9 `
write_com(0x4f+0x80);
" H2 x1 h! ~. n, b5 z7 d write_com(0x04);//设置光标左移,屏幕不移动9 _) Y8 s( g! d
c=a*b;
2 r, p! Z+ J/ X5 ` while(c!=0) //一位一位显示" }) l9 c* P# t# `5 z( A
{, j) y+ x/ M k, N7 ?4 O
write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置: N0 E" Q+ Q, S8 I# ]) ?% {
c=c/10;//取前面的结果数据 2 E- q+ r( r" r+ U3 V+ P
keyflag=1;
% I9 Z0 F4 y( x ^5 n }
* [6 p, G: C- s) L4 p4 I0 i$ X write_data(0x3d); //显示等于号=) l* o K% g+ i% v9 u# e/ A w
a=0;1 s- [6 |1 k% I' b! t$ e0 x0 F
b=0;
) y9 ?2 F8 I" V flag=0;
" d" J$ X3 ^' g/ Q$ a7 c4 B: Q fuhao=0;//全部清除为0 ) `4 X' V3 ?/ H
}" U- S* {+ w, |. F
if(fuhao==3)//乘法
' _0 b; v1 T& C- `9 O/ o {2 {5 l o1 r! \( c/ K5 G ~8 {
write_com(0x4f+0x80);
. }8 |5 _) B% }% ? write_com(0x04);//设置光标左移,屏幕不移动7 e( ^# R) G9 z$ x& p, c! Y
c=a*b;) I" W( K# x {8 T R7 m$ p R
while(c!=0) //一位一位显示/ H3 Y% S3 i$ v' T
{
1 N4 _) N0 C3 p0 C+ b1 @ write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
, |5 G- x5 ?7 v# p6 n c=c/10;//取前面的结果数据
g' B3 H# @0 `4 | keyflag=1;
6 X' D4 h. N9 s }
) V7 k% e+ N* c; g: F0 [ write_data(0x3d); //显示等于号=
1 t$ [: L) c- n8 z# v# p! G a=0;
. R m/ Z+ W3 X3 }1 B- t) J b=0;' U% D- i' _* R% k( D
flag=0;6 Z1 A* p: N& n. ]6 p- \
fuhao=0;//全部清除为0 $ i1 C# d/ r8 {! B3 I0 g3 S
}0 W/ F7 z! g1 `: u
if(fuhao==4)
7 o/ U- g: z6 Y* q& n) A. B5 j {
1 I, c. i' R) C: u k=0;
7 i Y' _ U8 c, ]! \ write_com(0x4f+0x80);: F; X ^0 q ?6 ?6 |6 |# I3 x
write_com(0x04);//设置光标左移,屏幕不移动
1 x9 v o6 n; t( I c=(long)(((float)a/b)*1000);//强制转换为long。
7 i W' Y5 c8 C4 E( g while(c!=0) //一位一位显示
* W: u3 D( `& P$ ^0 { {
) Q% K+ k( v9 c" o, w k++;
% k5 K5 H' c( c. A write_data(0x30+c%10);//显示结果的最后一位在0x4f的位置
# \1 S" E7 V/ Z$ X2 z3 B c=c/10;//取前面的结果数据& N' l+ V0 x* G9 s2 ^
if(k==3)8 F) L" h! c& y5 v0 G* o9 A' r
{
6 ]* S/ n$ R. F/ { write_data(0x2e);' d' k d- \0 w7 c
k=0;
! e( w6 Q2 Y! e& ?4 O; C1 b1 A2 ` }
' U" R5 M, D# W2 } keyflag=1;% K1 K7 r1 E) Z/ g& R5 {4 M
}9 T6 }7 u# r; p6 e! R" v
if(a/b<0) //如果a比b小的话那么除的结果最高位是04 V5 U8 M- ]( H/ d2 M/ p0 {% ^
{6 q' A- p, d- u8 J& ^" E
write_data(0x30);
$ A; N# T+ f; ]5 r. e }
% j' J5 f$ e3 A2 L6 U. m* c5 t write_data(0x3d); //显示等号' F" f) B6 n% _ H2 f* T
2 e4 M% I% k8 j+ o# F
…………限于本文篇幅 余下代码请下载附件…………
m, }8 @2 t% U9 A- R; n# b2 ]' A/ q4 {1 }$ e3 e
0 J3 Z8 K u6 ]& S6 |4 R8 y/ T |
|