找回密码
 注册
关于网站域名变更的通知
查看: 192|回复: 2
打印 上一主题 下一主题

简易加减法计算器 单片机代码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-29 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算
( p6 x1 s; W& R7 {7 ^#include <reg52.h>' {) o  C4 ?% x: \& u
#include <intrins.h>
1 D$ }* I1 ~, `. y0 [3 m! Q# t#define  uchar unsigned char) P. D7 O9 `- \7 A# z- B- a
#define   uint unsigned int
/ \, Y$ s7 D5 L6 L% E2 juchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //共阴字形码; m4 ?' W( Z- O) [; w. G- U) v
uchar code keycodemap[4][4]={1 M  G$ }+ m6 x3 p5 l4 d8 y
    { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
' \; T: O9 n* ?* w% h    { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键2 W) N; @+ q) i3 E
    { 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键$ b" d( a0 n# X2 O7 P) K
    { 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、  回车键、 向右键};5 u( k- n: [7 |( ?2 Z
uchar keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};           //全局变量 记录四个键的状态 0按下 1弹起 当keysta反正变化时 说有按键动作 1变0 按下 0变1 弹起
& ~: L* ]3 ?! A- k' k$ puchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00};                         //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位
/ s0 w, k7 Z& K- K; glong result=0;
+ Y' r- {8 g9 c" |4 nlong adden=0;
1 x& l# Q/ W, b* o2 D. j! n" Ssbit keyin0=P1^0;
% W$ m) D; d7 a; L3 V; }1 }sbit keyin1=P1^1;
5 ^2 U9 n$ P4 P' t: l! l4 A; Hsbit keyin2=P1^2;( l; H# Q/ R- b# `2 j0 v' a
sbit keyin3=P1^3;
6 N& {; N! o4 e; B, C7 F; @" P" F/ {3 f7 e# {+ m
sbit keyout0=P1^4;2 `$ u; b* S) I3 m8 Z
sbit keyout1=P1^5;0 B0 X/ m2 ]. A0 z
sbit keyout2=P1^6;
; O' E( I1 l3 f, y* Psbit keyout3=P1^7;/ [+ H8 F- B2 G* `7 A; U+ F$ O: c

8 U$ I% R6 P9 k$ K void InitTimer1(void)        //定时1ms
5 O  J" H- F- B0 F, J{
! M' Y/ f5 B' V3 o    TMOD = 0x10;3 c9 i6 o% k1 z2 V. k& ]/ Y5 Y
    TH1 = 0xFC;
: r- v( X1 s) l4 }9 U8 j0 m$ y    TL1 = 0x18;
1 n4 n, R% z. p9 b    EA = 1;. @3 j  S3 h1 K2 ]2 Y
    ET1 = 1;" c/ |) z$ r' M0 E3 `" k
    TR1 = 1;$ \% ~: K  T+ W1 L4 e& R
}
0 x( [: O' O* v' F* C+ K, k7 ^0 X. f: \: S, [" p
  void shownumber(long num)/ e" K# L8 a' L, V9 k9 c. R
  {
5 ~, b3 Z4 d4 I0 I  A; j$ s     static uchar buf[5]={0,0,0,0,0};# P1 }/ l. ^. j4 M, f
         char i;% f; w- y2 N: s2 |; b" t
         if(num<0)                  //负数为补码 取反加1得到原码8 i- T9 [3 ~+ A" L3 H6 @
         {   num=~num;3 M1 W- f3 e, \5 r# ^- D8 H0 s
                 num++;$ |0 f( h4 |4 L4 Y
                 Ledbuf[5]=0x40;* G! F0 v, I1 H) W4 X
         }) \. O$ K; J5 v( L. ]. d* `
          else$ v, F. \1 M0 L! i1 Y, J
          {
, H* i4 R- n5 K           Ledbuf[5]=0x00;
- I5 k% `! P& |7 `" J          }
0 D# {, s9 E1 H$ \, D4 S         for(i=0;i<5;i++)8 i7 \. g% E* o/ d" l
         {buf[ i]=num%10;  M2 }9 r2 D0 x( W0 s* z" }  z+ s
         num=num/10; }2 ]6 o1 R% r$ B6 v! \8 t
1 C$ a' i! F! @- X0 T8 R7 j
            for (i=4; i>=1; i--)  //从最高位起,遇到0转换为空格,遇到非0则退出循环
9 _( F' [  S- a$ [; z4 \) E* B4 D7 P, u    {2 T8 U7 v6 M4 W% W4 `
        if (buf[ i] == 0)
# d7 z1 x6 U8 k$ M/ L3 F; H: Q            Ledbuf[ i] = 0x00;8 t. `6 f  s& p, l
        else- n" C4 M9 V% \7 m. z6 j
            break;
( g7 @$ d  P9 y3 D1 N8 m  V$ R4 H    }
7 V; E( |9 \; J8 k1 x. v- k9 p7 y- \2 W9 W
        for( ;i>=0;i--)
9 M6 W' R+ Q2 ], x& v, s8 t1 ^        {Ledbuf[ i]=table[buf[ i]];}
5 M3 E& d4 A5 O. y8 o" _2 n3 }
+ V% Q" ~, q+ {9 I$ {) Z  }
$ C( n8 \3 N& ]: ~6 O6 k3 R  void keyaction(uchar keycode)
5 C0 {- V' `5 r7 c$ E, }  {! s& A/ s" [5 t* w! I3 O
     long temp;' p# r% w7 U+ J# J+ w3 }
         static uchar yunsuanfuhao=0;% Q' h, ~2 e$ q7 H% c+ g: u. L
     if((keycode>=0x30)&&(keycode<=0x39))                  //按下数字键
! {& N5 f1 n" x7 G: k         {0 j# r+ B) g: q& E5 j" t& c
                temp=adden;* n  W% X- h1 ~. h. N0 r8 K
            adden=(adden<<3)+(adden<<1)+keycode-0x30;
+ o4 A* Y& g" D; f" h! Z& @; l                if(adden>99999) adden=temp;
7 w/ [7 H+ F1 T- f8 \4 ~+ @/ ]  o                 shownumber(adden);
) }" a# i  T0 o& E6 ^: @         }
- J$ l  p: h: F- B1 n! O: _
6 [5 Y6 ?9 Y" E  O; |  @         else if(keycode==0x26) //加号键 8 ~6 _4 t: Q- J, Z, L
         {
  L- q7 Q9 k9 W& Q7 n            yunsuanfuhao=1;. c% N4 h' e$ G5 P% H
            result=result+adden;( J! e9 t8 I+ @( P+ g9 t2 t: b) f
                adden=0;4 \( B4 {' Y+ e, u# D' ~$ T) N
                shownumber(adden);
$ o3 [# j& P" I' D% ]) Q6 @7 q         }% h/ n. T7 e5 N& W5 F
         else if(keycode==0x25) //减号键
8 U% ]9 ?/ _8 x         {
1 R8 r+ q& u' g) n: {2 {7 e- e            yunsuanfuhao=2;
( U+ h: c& G: J+ ~- M4 d3 }& Z            result=result+adden;) W; M& H: B' u2 R* N* O* F9 p
                adden=0;
* i  z0 Y' l! U( V$ N4 T7 M8 l9 W                shownumber(adden);6 t: Y9 h5 }! U* l
         }* @2 I- s/ e% B6 g- J9 Y$ Y  t7 j
         else if(keycode==0x0d) // 等号键) @. ^2 p1 a& ]+ j! `, j
         {% D! H. T2 j$ N6 O
            if(yunsuanfuhao==1)           //加法" G; T# T* }" }4 u/ Z+ T, K! g
           {        result=result+adden;
6 A: x( A* p7 Y+ h+ t! p' i9 n                    adden=0;4 \; @/ G' f6 `
           }! l. D# D; {5 Z# x9 x4 m( R3 d/ |
            else if(yunsuanfuhao==2) //减法
, a8 |. V0 T; j6 U+ S' \" c           {        result=result-adden;8 A3 u2 Y  t2 Z0 Y
                    adden=0;
0 H. ~1 m8 I7 v  R8 W           }
7 F. q& q0 g' X" B! M7 N- _! M; Y  s. \- Y
                shownumber(result);1 c! x! ^/ [2 Z9 x/ p
        //        result=0;: k" |& l, q4 H* e( s
         }
0 N# v8 c/ H! Z" p: v$ R* d9 C( ~
2 P& ~) h2 Z& J( s7 V; O% {        else if (keycode==0x1b)                         //清零键& s# @5 X! @# D* G3 `8 @3 w, `
        {8 _) O6 h3 I  a. R2 H+ x9 V
           result=0;2 t) x; H0 N" y  q: w
           adden=0;
" B0 ^5 n4 a4 i0 `           shownumber(result);        . C8 E: x% C8 I7 O; P* v% v$ H
        }1 p% _  n8 V( B( @) r

: w& L. l* a9 p( e  v, |) N3 x+ g* V, N  }
# m" J& J+ L. V! F- Z9 L% g5 e- L/ M% ]& f
$ k  s0 v4 t% f$ @; ^
/ h  Y/ A. g" f7 [2 l+ L, S
8 F9 K1 e9 v9 u5 y. l

4 T& K9 h; d( T/ q/ d5 ?& N$ p# t* m+ q  s; E3 e- ?
  void keydriver()8 }5 S# w: Q/ f  `
  {
- N9 h( G6 P& [( S! x8 }, ^                    uchar i,j;          //i行 j列0 ~2 R! e$ A* N! B, K& `; y
                  static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};) U# U. w2 s0 f# y4 g
                    for(i=0;i<4;i++)
5 I* C/ f* q; A- ?           {
8 Y2 r$ L; n& n$ Y5 \" M              for(j=0;j<4;j++)
3 k* L' w6 w7 e2 H' l5 S# g                  {1 M3 D( U" V2 X$ b( B; Q1 M4 c
                     if((backup[ i][j])!=(keysta[ i][j]))1 ^9 T" m! v" t' ?
                         {
/ M& }( V  N6 d' x1 T% ?                         ; A2 B5 b# C* N3 U; A4 Q2 S! g/ `" Y
                                   backup[ i][j]=keysta[ i][j]         ;! h# D1 W0 {9 V. Z; z: c
                                  if(keysta[ i][j]==1)
1 Z# \" W: z& a! m. Z+ x                                  {* u" ]- P" W) G; Q9 e  x9 P( v) n" C
                                    keyaction(keycodemap[ i][j]);  q6 c3 o7 ^$ t; j& v* Q
                                  }9 U8 k1 G, r0 o5 f- q( ]( ^
                         }
3 z. u" s# j2 C' z0 `. W% q                  }
- f% C) d' `5 L8 Z+ m  P* l3 W$ Y" ?/ \           }, C! V/ ^( \1 n: H5 j' `
  }
/ {: G8 B1 f0 n* ^
0 p0 v. Q: b0 |" x
4 G( k5 {+ \! E. ^0 ^# i void keyscan()5 c# G- C+ ~# N# M
{
5 h4 l" W. f! Q    static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};
: m3 S2 ~- i- d. I7 U        static uchar hang=0;; W( q( a6 U. e) M
        uchar i;
% R+ x7 p, e$ f% i; u( t$ \0 X         buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0);        //按行进行按键值的读取        读该行共4个键的键值 进入buf[hang][0-3]
+ S5 H2 a% j& `  e& o/ z5 A        buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);7 s! f: n# u# R0 w
        buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
: F/ [4 J* v- }6 n$ i        buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);+ j. R, q6 @3 Z9 X4 q8 A

( I9 E- \$ ]& q, c        for(i=0;i<4;i++)                                                                                                   //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X00* U4 _9 m2 o2 e/ I2 ]" j/ m
        {8 {; O4 p$ b- f8 ~' a2 j
          if         (((buf[hang][ i])&0x0f )== 0x0f)   keysta[hang][ i]=1;
) t/ E9 h, e$ O2 `3 _) A# D7 `: T          else if         (((buf[hang][ i])&0x0f )== 0x00)   keysta[hang][ i]=0;
/ P& l8 p! @0 D) W         }
# I) |' o- }3 P
' k: i# S6 h) |, H        hang++;7 ^; p* Z6 V& j& k, _/ ~0 w. n
        if(hang>=4) hang=0;
6 }& I, C* ]: S3 w3 I
, e4 `  i9 V' F8 G        switch(hang)                        //按行扫描,选取第i行,该行线输出低电平
# |, T* y- b  z+ h& T% [9 w        {
) t) e+ E, t4 I' C2 m) H: [  L9 K          case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;
9 P- Q2 I& Q6 x: Q          case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;
9 C; c0 Q* @, g% N' U          case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;0 ~  o6 ~3 j& c, a+ Z, Q
          case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;
' @6 f) U+ m# C5 M          default: break;
8 H+ u  ~! {: L3 ]: ^9 D( \3 e        }% M# y% ~! y) v
        & L( ?; t* N5 ^. L

/ L# P0 \6 d5 ]( o- `1 o }
5 t- D1 {$ c: J3 K void ledscan()! P# }. S2 s; V$ G& u9 K2 I+ _
{1 D; J7 i3 ?8 C# r8 o' Z
     static uchar i=0;8 ^+ n! z. u- k2 g% t% f+ ~4 F- O
         P2=~(0X01<<i);+ a8 R8 C4 c( Q+ B3 f# X
         P0=Ledbuf[5-i];) s5 Y! g7 I$ B0 m4 N
          i++;$ W, C5 j  e- s4 x2 f. d
         if(i>=6) i=0;
; K+ Q' C; m6 J+ [* U4 x/ j, f; k3 Y! i/ L; d$ g& V
}% C2 q( _* m  A
  void main()8 O% [" W7 {' I! X4 p! b
{
7 m0 g, i# A, L        InitTimer1();
% O. u$ J+ n$ `        while(1)
3 Q% T! C* @0 L) |5 P5 O" g6 l        {
0 b2 ]( D  R0 `4 }2 k+ H( H          keydriver();: ]% n; L8 n- F2 {) \6 j% a& n
        }- {# C+ _% y& p3 ?6 p/ r# R
}0 O* {; T- Q& i
void timer1(void) interrupt 3
" S) G6 [8 ~% G" y4 n. L {
2 p3 B6 \0 ^5 V    TH1 = 0xFC;/ K5 t9 _0 N0 v& b! t7 I
    TL1 = 0x18;                                       
( y" k4 z0 A  w/ Y) P7 H    keyscan();
" [- q+ E8 i. B5 A9 ~: Z) ]    ledscan();
- H! T9 x6 i$ G2 S4 d7 L8 K }6 q6 B* D  T: U) E/ n

该用户从未签到

2#
发表于 2022-6-29 11:18 | 只看该作者
看看,学习||ヽ(* ̄▽ ̄*)ノミ|Ю

该用户从未签到

3#
发表于 2022-6-29 15:54 | 只看该作者
学习||ヽ(* ̄▽ ̄*)ノミ|Ю
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 23:04 , Processed in 0.203125 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表