|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于单片机设计的简易计算器 能实现基本的加减乘除和清零
# `1 f2 z& ~+ {8 @- g
) S, S( c4 P! Y% D6 Q& Y( b
8 {; J$ }' \) \$ }) W. K% k: {5 f7 y" j2 R$ `; i. u' C" y
这是用STC59C52单片机做的计算器,使用数码管显示,能实现基本的加减乘除和清零
. ~- @1 [! Q5 Y' b5 U- v7 e9 K6 x
- E# k, Z3 O( w! K4 c% m
0 G$ h0 b) ?! |3 d, b: r
2 b* [3 I% o6 ?" w
+ J9 ]6 g: A* }6 h! l1 H
源程序:
( P# P9 v# N$ W: C9 M1 K/*****利用单片机设计的简易计算器********/+ [, |5 w* E, ^
/***** 单片机型号:STC59C52 ********/0 u* S. u* Q6 e" k: b% M
/*
0 t6 a" ?3 e! L* U8 e L- p *采用4*4键盘,4行线,4列线' z2 c4 q* Q( L( U J/ E9 {3 C; _
*键盘行线列线接P1 IO口
2 O1 d/ ~4 C+ ~/ c' |3 a* r" | *数码管接P0口8 d' Z8 h, E& S1 d5 O; u- V
*/
, Z4 y4 O3 h5 B8 K#include <reg52.h>
* G! s7 G$ {& R#define uchar unsigned char# K$ d+ O3 l& n" [' e; a1 n, Y' T
#define uint unsigned int
6 @4 A( b. F% L X: H& osbit dula=P2^6;//573段选使能+ j9 t% O" A5 z r! K
sbit wela=P2^7;//573位选使能- g# ~% e- c, Q3 b& A2 x- G4 _
0 e8 r1 e; r: O _/ C
. X N& B- I5 L6 H2 C
sbit beep=P3^2;//蜂鸣器- o0 D0 r' ]# c$ |! Y) Y9 r
% Q) U1 m+ g: {
0 A1 G, {. }; m2 M, {* N8 K# | z* e
( @: f& y* E0 o R
uchar temp,key;//按键变量
; Q1 v2 A1 X! T C5 ?uchar fun;//加,减,乘,除,标志位- n! F$ T8 S" d; V+ |. b) L% [
long int num1,num2,res;//num1与num2是2个要运算的变量,res是结果
* @! l. Z# |$ S/ @4 `" r( K/ muchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
' U5 X7 r4 e( W5 v9 t& Zuchar code table[]={ - L; ]% g% L6 G, L3 B
0x00,0x3f,0x06,0x5b,
' n- t5 U% x/ {! p# H7 t1 K 0x4f,0x66,0x6d,0x7d,
* q* E! F% ?" J/ j" \ 0x07,0x7f,0x6f,0x77,
+ v! l* h/ e4 U3 I$ ^. ^+ N 0x7c,0x39,0x5e,0x79,0x71};//数码管段码( \, ^9 t' l5 k3 ]- g7 S8 @. X7 \
uchar code weixuan[]={
4 }2 D3 i0 I" V5 j6 r- N 0xdf,0xef,0xf7,
/ @* X% _& t5 L; F4 V 0xfb,0xfd,0xfe};//数码管位码
3 ]( t5 Q7 H4 C" y6 R4 u$ A) S) f6 u0 D$ p9 V
1 C& C$ o2 [; b5 O8 E8 U0 n& p
void delay(unsigned char i)//延时
9 Z* Y( h% y! r" \! D, l$ t{
. P" o) c3 h( C. O9 x# s. r$ \uchar j,k;
7 k' ~ l5 m0 e; k$ [ for(j=i;j>0;j--)- U2 [/ v1 E7 U v
for(k=125;k>0;k--);% Z+ Z9 b$ E, g3 K
}5 A5 w2 J" s2 |' K
& N F! X( Z$ d' D1 b* D- y8 A; h3 x1 Q7 H4 T2 x/ J
void bee()//蜂鸣器9 U# \7 p5 _2 X/ e8 G9 J
{% {+ p$ ]- W& G, W; [
beep=0;
* }+ A/ Q# A d* Z2 ?" O delay(255);3 |5 Z6 G% I( M/ f
delay(255);
5 }, G& g5 w6 D3 c beep=1;
% Q: ^% X0 f. K$ Q, P8 S! o}& Y. r- J i3 F1 r
) z1 A7 L8 o$ m, \5 b2 K; }0 H9 l. P
//按键检测# a- n7 X7 e4 l$ d
//如果没有按键按下,则key取Init()函数中所赋值为16
r' C, v- o9 w- i% d cvoid key_scan()3 V4 z% p" Z/ h1 c
{
$ U& x+ i8 ?( O- h P1=0xfe;//先置第一行线为低,其余为高
' D/ l) V4 r2 J7 W- a: ? //高四位为列线,低四位为行线
# c/ X! u4 k% a# E temp=P1;
" A9 E; W% b% M. t8 J0 D6 [; f temp=temp&0xf0;
1 Z6 P9 ?' k/ O& O( ] //进行与运算,把结果赋给temp9 B* G/ h$ h& a) B+ C P
//此时temp = 0xf07 Y8 d s! P. B! K2 d& f' V2 [
if(temp!=0xf0) /*判断temp的高四位是否有0,如果有零的话,则此时temp != 0*/
* {+ B: j; e2 \ {
9 C c) N/ H- I$ u delay(10);& L' Z, ]( g$ w& S8 K% O
temp = P1;
/ C9 W$ H$ u C temp=temp&0xf0;
& X; |# T1 o, Z9 m; y2 Y9 J if(temp!=0xf0)' p: e# p7 z2 i
{
+ W0 @, K& [. }0 y' D7 O; @ @; ?& \ temp=P1;
) Z( H7 O' H$ T2 Q& \ switch(temp)6 u) q6 V3 q2 e! ] S% k, d
{
H& f2 B* N, [5 c# N case 0xee: //此时按键坐标为1行1列
- V, h. j7 t# F+ M. r3 v5 u; [ key=1;
% R2 ^% j+ ]$ L$ X3 A' ^6 m9 P break;
6 C. V5 x2 ~, J) k9 I case 0xde:9 M' y& G2 v- O$ @; @1 {+ E
key=2;
% }- a5 K4 s/ L8 e% Q break;% K) w& p8 S# _/ W0 {6 \; t
case 0xbe:1 |. |! j: ^7 {& O8 `
key=3;2 B3 f* v6 d3 C1 { i
break;( i! `0 G$ c) i+ J* {8 d4 G. S
case 0x7e:9 O2 e- F+ o) u) M2 y) W
key=12;
6 b/ C" d) I+ e/ |. h2 ]6 d1 n break;5 {3 ^. x; m# X' @/ y/ M4 S( f5 o6 F
}
' \* Y( L! k/ } while(temp!=0xf0) //等待按键释放
+ X4 ~4 }5 `+ m, \# q# |. S% l {
- W1 ?( T" o" e( U temp=P1;
: k' e. f0 y( `, h$ {. ~8 K. o temp=temp&0xf0;6 m+ w$ [$ f# \! a3 @' }4 ]$ L
}3 p' n5 [6 }' P0 {3 f. l# Q6 @
}3 @; C# v9 Z% W5 `9 e, L9 z) ^2 D4 z
}
9 X% v Q0 B1 Z; l" W P1=0xfd;
$ S0 {* ?5 I$ f! R, h! } temp=P1;
+ X. V+ l o! r1 y' S9 }6 E temp=temp&0xf0;
. w+ ^, F K! n5 p if(temp!=0xf0)0 J% j" V# d1 q- z* J" k3 l
{
% ]: p7 p. a: Z! N' r delay(10);
8 w- i3 ~1 c# n5 q! P8 ? temp = P1;
* G, ^4 t% V) v% C. P6 ?- _) Z temp=temp&0xf0;
, a% z3 q; D" u! y; l' T* n1 J if(temp!=0xf0)
9 w) ^! G; k8 y* b0 k! l$ b {2 c, s* r4 H$ g! V% ]
temp=P1;
) ?9 ?/ ^9 R c' @7 ?; a- \ switch(temp)8 S D- i# ~# F7 n; E8 f
{ [! i* s$ i0 D4 {/ Z
case 0xed:
8 i; C" Q# p* K( X/ g; _ key=4;
# y& S; Y6 r# A4 p# o% [ break;
6 p: m) W q4 D N) { case 0xdd:) g4 C( K5 ?& c. E9 K
key=5;8 {2 o: |' g6 a
break;
+ D% a6 \: p u5 J0 c6 D case 0xbd:. K; }0 O( V# @0 Q, U7 u' D$ a
key=6;* R7 S$ L& ] }3 [
break;
; ^7 u6 S$ Q. G4 g3 x: m case 0x7d:
8 u& j5 m. T, Y- \3 ` key=13;
/ @9 ^9 q. Q1 ~ N$ [. f break;( f% }' z; ^ ~: h, V* L. H
}6 ~$ K' y! [4 [6 J
while(temp!=0xf0), K7 ]3 O5 O$ K# P1 R1 c# G
{9 y# ~1 }1 d* v$ q
temp=P1;
3 l! f+ g9 M- } m temp=temp&0xf0;
+ b+ u3 Y( _( w& X3 @) ^ F }
3 z4 E c% F) a, j; R) o: i }7 }! f1 ], c" i @6 c! O/ f
}
; i' D: Y' ?* E( c1 l P1=0xfb;
+ z' R$ h1 W: Y temp=P1;" a* p9 R/ q$ O, E* K" k
temp=temp&0xf0;& [5 T- Y2 y" J5 h$ h
if(temp!=0xf0)6 w. G; M3 E. V- e6 H
{/ u5 Q/ S0 q! t1 g( N" ]+ B3 V8 j
delay(10);& W2 Y2 ~4 F/ z4 J2 M6 V
temp = P1;8 J6 I0 T) ^, F) p
temp=temp&0xf0;
u- a5 p! J' d+ y4 F0 { if(temp!=0xf0)4 A B1 \1 _4 o' W$ m0 w
{
- L: p* l) R, a/ T/ b1 f5 [ temp=P1;7 `0 C$ d( g& W2 y& j& @8 _& U
switch(temp)2 U x- f3 f7 z( o" M' L
{ d- a! z q+ G, Y
case 0xeb:; B; s3 e# C% H- k, g8 M
key=7;
+ f1 s% n6 Z% }5 S2 ~3 Z8 k( W: Q1 W- t break;( k" O, K5 Q) ^* R
case 0xdb:
( V) [: S, F3 z key=8;8 N' t M, p* r/ Y8 @6 @- u
break;
6 \. Q7 Z3 N' ]3 C9 ]+ d' N case 0xbb:
& {" |: v( B/ i1 F3 h. Y key=9;1 L9 g0 [9 D C* w+ U
break;
1 c5 s+ {' [: I" E! A' \: E4 E case 0x7b:
7 K8 R& ~6 t e6 |( G- v# ? key=14;) T6 k* E9 b# \1 i% X G8 C) B W: u# A
break;
, _. P1 V$ h E. y7 g; R9 P }6 Q* D/ e5 U: K5 e8 U' z* Z/ A/ G: S% i
while(temp!=0xf0)
+ W1 ^3 H4 u! @- u5 a {
9 O, |. G _4 o* }( k6 ~" x* ? temp=P1;
. Z! m9 N+ h. N- R5 D$ W temp=temp&0xf0;
2 k! M. P2 t; a9 H! E- f }
$ E7 e# C7 B3 r7 ?# D* S. G }
' L" D. `# {; V( o' I5 k }
4 z7 }7 U9 Y0 }4 J P1=0xf7;* @6 z& W0 V9 ^6 z, `
temp=P1;
( O( f# _& r* |* H temp=temp&0xf0;
2 b8 n7 U% o2 D3 C( C6 H if(temp!=0xf0)
- p4 p0 |. N% T3 ?8 N! ?: o Z/ l {! u" Q2 W( h- Z3 ]; D
delay(10);4 G6 B" D P% x$ g' T
temp = P1;
( K l/ f6 l2 m, z- B/ j. I temp=temp&0xf0;
5 v9 I. b# f4 e2 R if(temp!=0xf0)
" @5 J" \' A' @' O {
" u$ H" y6 {) u, m. d temp=P1;
P) r5 O) c; x1 y7 E; V7 u% Z2 c switch(temp)& Y" s3 |" n. p
{
6 d& Y/ _, _0 R( Y u) ?) c3 ~ case 0xe7:
( \- F# I; ^$ T' P key=10;3 e% J: A }% h1 G! F
break;
: Q/ T8 Y8 p( | case 0xd7:! p7 N8 Z$ _' J s
key=0;7 C. J" v* z# e- s% c
break;
/ `' M- z9 f4 C6 p case 0xb7: ^' H; @* p& G- a
key=11;: j- ]" J; ]: }/ [9 q
break;
- t" ?0 Z; e U( w case 0x77:' @0 U' ^6 Y( [' z$ L5 c
key=15;0 G, H/ {% a: `8 _. x9 t4 B
break;
: v5 y. L5 S7 Z$ s) k }8 I/ H+ P7 [5 X* m6 J$ C; y
while(temp!=0xf0)
" X9 ^; U' h6 t. X( k& s' a {
5 S% P5 w6 E2 j, b& G2 E temp=P1;+ B( d/ e# F/ v$ k' a0 W/ V8 H: p5 j
temp=temp&0xf0;
6 G7 I" L1 A$ ?% j* ` }4 v( q( {0 E& V' Y5 l, Q2 v
}
/ h1 c( R4 L2 c+ x3 G }
& _* S f9 z* k! I}! t$ d1 m0 L# [: R. z& o3 y7 D4 _
/*uchar temp,key;//按键变量
" ~) P+ `7 [) |4 Tuchar fun;//加,减,乘,除,标志位) W" I. b5 t* |5 Y& D; b
long int num1,num2,res; //num1与num2是2个要运算的变量,res是结果
: L2 s! t1 V% k* y. S# I( H) Kuchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
/ b' K' \6 Q9 n$ B: g*/. g9 a3 S% G$ f2 {
void Init()//初始化
7 S- B& i- L* x{ L, e( N2 G+ } D( e
num1=0;
& p9 {* @) @2 x$ S# d; V; @ num2=0;
: I: P$ _( U( B( R 9 e) v: {4 ]( @% W6 [
//P0 = 0; //关闭所有段选$ v: m/ r* u3 K* M U" H
wela=1;
# o; E: B3 t, n$ m6 O# H1 i P0=0xdf;//11011111
8 S. ^2 l0 _; L* L! Q* { wela=0;! R8 w H5 [ g7 ], h4 c$ H: v- q
( j$ j5 j; N# y% b; L$ {, o9 F dula=1;, n4 }8 q' ]; R r# w7 ^
P0=table[1];//显示0( T$ V0 v# z: h
dula=0;: `8 A. C9 r2 K% {$ V2 u c
; @+ g2 }6 e5 B* b2 g key=16;' F N4 J; s2 ^( ]! t( \: z# O! L& x* w2 v
aa=0;
% G) _5 S- F) A dis=0;
; v7 {& U* {/ u- q& }3 i* E res=0;" \. K" @5 X) Y2 s' o! g
}
' a: J- x+ o& k8 [9 E
% w2 g) y3 Q- j: \) |" F
! `* r; h3 P: \0 _# x- K# qvoid dis_play(long int nm)//显示函数. s3 f0 i% l$ t9 m+ y* M
{7 u' O2 z6 ^% J2 M3 Q7 R* ?
uchar a1,a6;//a1位段选变量,a6为位选变量
% \% q" s# C4 [ long int shu;/ J' M" J5 u# z9 x7 v. M8 g
shu=nm;
; C0 B/ j2 }8 w0 V4 r4 m if(shu==0)' W4 L6 `+ `+ O8 m* ~
{/ `: D% V5 o) w3 U
wela=1;% y; y) x9 c( [3 X: w2 c* ^$ F
P0=0xdf;! Q& x! ]/ Q% l) i8 f" W
wela=0;9 m5 e. O e; _( z, V
dula=1;
" L' _6 X0 \6 G+ r+ f( ]- O' Y P0=table[1];
' a: u/ h1 i( G9 ^4 Y3 z: W, t1 M dula=0;
, ~( P+ F, p4 `1 Y3 g& }! L }
5 v; w% R% h/ u, r% n% o else' F5 J: J/ K# A$ ]) ]
{: c' t9 y a, Y8 G: o; t( N
for(a6=0; a6<6; a6++)
( g* b$ L7 W$ z- V% q/ R) G {( F% i- m9 C( @, s9 Z [5 i3 R
a1=shu%10;//shu%10 shu比10小 a1=shu本身
# n0 g, D+ y+ b4 f if(shu!=0), C* }- C+ ^+ v; V# s; C9 O
{. | m; T; }2 d n; k* g
a1=a1+1;& P5 a e2 k% {8 h1 ^8 V
}, W+ u2 u/ z& m! l. B* ?
shu=shu/10;//shu/10 shu比10小 shu为0
8 Q4 J. D( r# F* _ P0=table[a1];. T- F5 z! @4 o( A. s9 U `) S
dula=1;
% \1 Q3 [7 d, S" f/ M' E4 {0 z% d dula=0;! T" e2 h1 l$ l) e0 h1 R4 W- E
P0=weixuan[a6];
; [& }7 u. Q' R wela=1;8 Z( [! _- h/ g, {; @
wela=0;
/ g6 `2 e+ r- f# L7 e. y delay(5);9 f1 A+ C) i. Y- j9 p$ R' S
}
7 f+ p" C: g2 {8 J8 R% P }8 `4 A' b7 G+ I/ m
}: H$ s) ~* j9 L
void display()//显示选择函数,dis 0或1显示运算数,dis为2显示结果
3 o# d9 e# U: Z0 i- p# I{
/ S6 i9 k4 ~& H, s switch (dis)
' V0 Q* w* W" q" V) t, R4 {6 x# z2 S {
2 ]$ n( K7 _. z" O' O9 J/ z8 j+ J case 0:' W/ z$ T b+ s3 z3 g
{
# v0 i Z! _* |; }) u dis_play(num1);
1 }( E+ \8 J7 j$ \: { M7 R }
3 i8 ^$ G+ r8 e; K: W$ b7 t4 y break;
( P' U! ?6 P# V: _3 {) M case 1:
) C& h K z4 q0 t& Z- n0 R {7 I2 c& s) _) v1 ?7 s9 j' v
dis_play(num2);! W* a' o. m& B% H) z
}
7 K/ b+ m% r, A& K break;
' d! ~$ v" t8 l# a; M8 h( i# a* U- C case 2:+ A3 c& B1 K; L0 {( h1 G; E
{
7 I$ x7 }; D4 F* [ dis_play(res);
0 _6 P/ n1 q p$ y2 Z } r% ?3 \6 K- c1 M
break;
/ S0 {1 p( E5 W. H$ a }
, V& k% Q9 z; I}
+ L, D3 i# P3 G* s- {# z% {% R; v5 _* y$ G* Q5 r
0 V7 k/ n% W' d
void shanshuo()//数码管闪烁
) Y. D4 I/ M/ t: r& w8 u{
% {/ l0 _$ }2 b c2 b- ^/ X ~' Q wela=1;. a* d0 P3 Z, s Y8 D B
P0=0xff;! ?" _/ D9 Y0 }" q7 y/ L2 k& Q- m
wela=0;2 S5 `4 Z8 s9 V
delay(255);
" J' _; P* o& g- v' w7 a; I$ b+ P}6 _; a' v. G3 |- J
7 p% _$ E& [# U8 l7 Q: b
1 ?& R+ g5 V6 v3 c) F/*uchar temp,key;//按键变量/ z6 R6 A: X: u* N D
uchar fun;//加,减,乘,除,标志位# ~* e4 M6 |, w# y! d
long int num1,num2,res; //num1与num2是2个要运算的变量,res是结果( R- Q! \; S9 a7 Q5 ^
uchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志: L1 q: V7 _0 q% x
*/6 _' Z3 `' h1 o( P& h
void check()//运算函数) x4 m# F' D( S* h% K
{* T& e1 S0 g; Z2 A7 j8 i
if(key!=16)/ b9 _. \9 M; D( K3 z `
{
0 t9 [3 K2 T. s- X bee();
( o/ f3 G; ~$ Z- O if(key>=10)/ }! j: p/ @) A$ q
{: u+ G, G4 N! {5 d* ?+ m
switch (key)
6 t% Z; i: l6 S5 P1 ] {
/ |3 |' E0 j" h ^, B# w* ? // CE
' X' s: \: [) l. }4 a" E) f case 10:+ U* n6 D7 Z4 s |9 L3 ^
Init();% ~& b1 y! i0 f0 s' R
break;
3 W( ?. X9 u% R! c6 t! c // =. v3 a& U) T# ?, q8 l b+ M8 J; H
case 11:8 G4 W" p- m, @& g4 s
{
2 J' k/ b5 v& P, n% ] switch (fun)//加,减,乘,除选择标志位
1 |9 p5 ]8 b% m n- @6 {1 F" x2 q. W {3 v8 j; u$ y {' V; i8 w
case 0:
6 s" x% r" {5 P8 h res=num1+num2,dis=2;- p/ J% Z* R1 ?$ r
break;//加法
8 z& v2 o6 ]3 P case 1:; S3 \/ x% L# H& d
res=num1-num2,dis=2;
3 B2 X5 |, w& @) x break;//减法
6 O" z* C) c: E5 n: d% R% E4 q% L case 2:res=num1*num2,dis=2;: q/ B s3 f# Z% c9 m1 o; s
break;//乘法
8 a) `7 J8 ]4 H( x, V, ] case 3:res=num1/num2,dis=2;
, _" N8 Q r1 W8 ?* I B: y break;//除法: X% ?% X0 X- {4 y; y
}
$ [, N9 d1 S& o! S };. Q3 v. m$ A$ w: E. ^/ U
break;* @6 k" ?* Z3 _. j2 Z7 ]
// +8 i9 { _2 ]1 w/ A4 t+ G+ A% F: B
case 12:/ a& V: @! G8 K: x4 f
fun=0,aa=1,shanshuo();
! M& g2 B: R! w break;2 j. S8 h5 u# } r+ h9 ?, Q9 ~' v w
// -
2 I; J) u1 e, a8 q, x+ U& Z case 13:) F2 c5 B% ]- G# M- v
fun=1,aa=1,shanshuo();1 R: I& m) Z- j" H! S* m
break;
+ i9 f+ D3 A$ B2 Y // *
, n5 A( a+ f+ ~" o1 t case 14:; R6 \! }# Z$ s
fun=2,aa=1,shanshuo();
0 }1 U- p# G) A- I; a break;) a6 A# M6 H7 V% B0 Q0 L
// / + ~& h( T: ?( ]0 {: w2 |
case 15:
! t8 [* I; ^& Q6 t fun=3,aa=1,shanshuo();
5 S4 |8 a1 {2 G' R( f C3 c break;
( b. ^6 i. p- B( j* w+ T }5 `% Y2 k. J2 X! K* Z4 y
}! F0 y3 e1 N/ W+ C0 J6 o* X- H! v# r
else
+ _) q, U! z9 i q) y {
: C5 O, ~& o5 W/ U' w: x5 L* Y switch (aa)//运算变量赋值标志位
$ c& T: }, \7 G {9 H$ Z1 Q/ E. [
case 0:7 w0 _/ }) L% g# c4 j
{
- G: k9 l. m# S0 h% K num1=num1*10+key;//把按键检测到的值赋给num1运算变量1 & |: M$ D% d" C
};
. u( F& {6 C4 ]# Z break;
% a. F3 e5 g8 }- n# B* b" ? case 1:& |* M. b0 Q7 `9 w( }
{2 D @9 {% ~. ^0 Q
dis=1; U9 o0 y' i! y. K# Z
num2=num2*10+key;//把按键检测到的值赋给num2运算变量2' r+ Z) a3 E, Z" N$ _
};
& r# W7 z' l$ b' _4 I3 u* U6 X. j6 a+ m
9 K1 k) R, k/ p: i% e& P# j( @5 c/ m- X* f1 r/ T
6 {2 }/ n) Y. b* ^% s6 `+ ^ b9 t& P! [) f) R
…………余下代码请下载附件…………/ d1 F5 j# q/ n7 A8 F3 e
5 F& S V Y4 A* T6 r+ z6 R' _$ n% }9 E* ^. [
下载:
: b0 ` Q9 b8 p. z2 G
# c. ]8 o( Z& q1 X8 D& S% l, U |
|