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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算
7 h8 B0 Z+ q: U  w" }#include <reg52.h>
. s% k6 H9 i6 E( Z) F" b/ q' d#include <intrins.h>: P  E' c* y+ E6 o  l9 z
#define  uchar unsigned char3 {6 l$ Z# ^& Z
#define   uint unsigned int ' x8 @( c) p% F6 {
uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //共阴字形码% E, r: f& l5 P
uchar code keycodemap[4][4]={% U5 V) ~( x2 p" O" o
    { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
$ n( O5 m) K8 l. k+ e    { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键
9 g/ b  r; I' d% _1 o    { 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键
, ?/ ?8 _! O: q# [& @    { 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、  回车键、 向右键};
4 l; [0 \: v. G$ k  \! ~% D! w9 i) fuchar 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 弹起0 C, p2 {' N0 ?% d8 q  L1 {
uchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00};                         //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位( {0 Z7 B/ M3 b# x3 [( T+ y) ?
long result=0;2 A6 U: W! n$ N. V! @
long adden=0;" g. ~6 k/ Z4 P: C( R9 l
sbit keyin0=P1^0;
  h! }6 o/ _, J! H+ \+ Rsbit keyin1=P1^1;
- ]4 L) @! j* _- Vsbit keyin2=P1^2;0 T/ G$ U) u8 P$ N3 {6 K0 a
sbit keyin3=P1^3;  p3 I3 w( n$ i; K

! Y8 u3 C5 o# Y# {sbit keyout0=P1^4;& C: t1 a, z; P) F- S
sbit keyout1=P1^5;  b+ D& ~( g- {9 k! w. B
sbit keyout2=P1^6;
9 G( X# Z, |9 O) a5 }  dsbit keyout3=P1^7;
) K7 v" ?9 r0 b' r7 E& ~0 G/ a
: Z8 k% S: }4 X: m$ @ void InitTimer1(void)        //定时1ms
/ D6 D& V/ A1 D( @, W" V{- f0 p' {& e6 G! o" a/ g$ }
    TMOD = 0x10;
; \4 X. Q% V1 N    TH1 = 0xFC;
% x/ a6 F3 Z' {( n1 f0 \3 n    TL1 = 0x18;0 [" R+ Z- W: a9 v, h: D! [
    EA = 1;. J' l9 \) @6 T% c  K8 Z4 m# z
    ET1 = 1;$ Y6 U+ q0 F; R4 C( a; p
    TR1 = 1;
/ f5 x: S. t0 p5 J6 }5 Y9 q8 S}0 B# d' Q; v1 V& z
/ g1 V4 O2 W4 P# t7 M
  void shownumber(long num)
5 ]" a3 a( @4 k# Z$ H. w7 y  o  {$ F" N! A8 v  t" g+ F# [3 R
     static uchar buf[5]={0,0,0,0,0};- g) Q1 t, o  S
         char i;( ~* U( p3 v/ H
         if(num<0)                  //负数为补码 取反加1得到原码+ T7 D9 {& R' K) Q/ N2 s
         {   num=~num;
* u# v7 y: {5 U. B" H( g, D6 o% @                 num++;; F8 m6 |3 s5 E6 y$ i& Q
                 Ledbuf[5]=0x40;
. G2 v) O  }$ |         }% j# D8 C. N- ?: @/ e* G1 u: H
          else
/ D6 z9 r  r- x+ B          {
- u6 t2 x' [2 N7 z           Ledbuf[5]=0x00;! y$ L9 ~! C2 {7 J: C
          }1 Q1 O) K$ C# m+ E* d, O  W
         for(i=0;i<5;i++)
* R: D+ }9 Q# u5 J. Q5 b         {buf[ i]=num%10;
( Z, _: T. `) o% j* \         num=num/10; }2 a) M, K3 [: ]

5 {6 S2 d# y  V0 d% |* h5 y  f            for (i=4; i>=1; i--)  //从最高位起,遇到0转换为空格,遇到非0则退出循环
! c+ W% e/ m- @; j! A* S, X7 r# N1 P    {/ R* c* R6 }4 z$ `, ^
        if (buf[ i] == 0), I4 o, R3 x1 D- S% B
            Ledbuf[ i] = 0x00;
. @. W* q) h7 r- _        else  v+ y  X2 N. W' {* A& f
            break;$ S9 P+ A& m2 r. V) l. l
    }0 k9 u7 k( v  G6 F2 s$ G& h4 G6 ~
: x/ S5 e3 k9 k) G
        for( ;i>=0;i--)
) z2 H, K9 m, H2 Y  @/ i# I( i        {Ledbuf[ i]=table[buf[ i]];}
0 Q7 e. ~5 B# P  f9 o
0 ~0 G' y6 o5 `' E& ~  }
3 ^% _/ [, i- `& i5 k; w* v, U  void keyaction(uchar keycode)
' U" c. v" j2 L2 E3 O" f& J  {# R3 @1 E/ b* @0 I. {3 t4 c
     long temp;
& p2 a! f- l  g* m7 k         static uchar yunsuanfuhao=0;
; F; o' l9 S+ g4 a5 F/ K  Q2 \     if((keycode>=0x30)&&(keycode<=0x39))                  //按下数字键) x) O% W. B5 L0 l# w$ f
         {
# b# e2 \1 o9 O/ z; O! p1 k                temp=adden;" w$ H% j" V) N8 [+ k' c, T# a
            adden=(adden<<3)+(adden<<1)+keycode-0x30;
+ c3 i! `. o/ W                if(adden>99999) adden=temp;( i  o3 I' i. S0 p4 x# z' C" ~
                 shownumber(adden);
4 L% l9 h% z+ L         }
3 k8 r4 _& Q& {% [& d
$ S& B: w$ [6 V# \1 n' A         else if(keycode==0x26) //加号键
3 g, V! Q- I; _) s* X         {
8 d7 D7 i8 u3 H; S0 I            yunsuanfuhao=1;& p6 B9 d( T4 V8 [7 v9 O2 j( X
            result=result+adden;7 ?& E9 R7 r+ ?6 I
                adden=0;: ~! f9 x1 @7 |+ F  `. e
                shownumber(adden);
: O, S+ W- g% s/ W3 R9 U         }# a' Q+ t# q, \8 ?* j9 v
         else if(keycode==0x25) //减号键
1 l+ Z1 X' j7 ~7 A6 T, M         {* H) R" C( ?3 ^' @4 _4 r
            yunsuanfuhao=2;) z9 d! h9 v* n' N) R; _: M: P
            result=result+adden;
& x% F) S" X* {$ k                adden=0;
; s6 t/ m* k- ]* m- v                shownumber(adden);# ~" O  k4 C% l- b9 t( E% y/ Z
         }
  p. s/ o! }4 Q5 @: a, V+ H         else if(keycode==0x0d) // 等号键
, Q7 k+ v/ y. C         {
7 i% j  W, x- d4 z2 C$ h            if(yunsuanfuhao==1)           //加法0 d. Z4 \7 k* v6 b
           {        result=result+adden;# Q" V0 C% z  i' j7 a
                    adden=0;
/ a0 Z/ `& V5 F           }
3 t. ~# F7 L% F; ?( K" Z" e6 }5 v            else if(yunsuanfuhao==2) //减法/ b( ~" V% ~3 N( P, m
           {        result=result-adden;
- J8 b" P& r& b                    adden=0;4 }0 b3 [' P4 E, p* E6 M0 u
           }% Y) x$ ~( L$ Q2 k! R
6 z) p9 u2 A$ l' |/ ?; d
                shownumber(result);- X2 D- r! {1 S& e  A& i. |( B
        //        result=0;
2 n3 @& G  ]2 X! ^, ^         }
4 {3 M1 Q# \4 v; _+ i# V: @6 z" ]1 r! S# Z$ Z% E
        else if (keycode==0x1b)                         //清零键  B1 W8 S! u) ?; D1 L
        {
5 p+ u, m$ K& N3 H1 [3 ~$ F           result=0;) |( N1 `1 B- M4 n0 c
           adden=0;" p  G& E' d  X' K- d, A* E' ~
           shownumber(result);        : ?6 r& R* W- X2 `5 |
        }
- ], j. _, V& F
$ B; W4 |  S) n! k# O7 Y  }: W/ m/ I4 K! ~+ p2 b

% U0 ?( ?+ k5 w# C$ u
* S: j4 v2 G7 l& k  ^
8 z% [) Q% ^+ }! l
; e6 w: g/ L  R/ Q  U2 H& v/ D& s: d* E! h0 ^! m
; z" [+ ^& T1 }
  void keydriver()
  ^  ?5 c" ~1 E1 O: Q  w  {
+ L8 c5 T$ q0 s8 G0 A1 Q' D7 x                    uchar i,j;          //i行 j列2 @, T/ W2 r( P; `  |, B
                  static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};+ l0 h' r) G/ M" P6 X
                    for(i=0;i<4;i++)
6 E" U+ S$ s0 {           {. c- p* h! p+ D" }6 ~
              for(j=0;j<4;j++)
+ T: j6 ?$ M  q) |- E4 d                  {
& Y: i4 a( u0 M; V1 z0 V                     if((backup[ i][j])!=(keysta[ i][j]))* E& m& v3 H/ N$ K" q
                         {
( L3 f0 f1 F+ J9 z                        
+ j4 ^, O/ a! [4 k6 p6 C                                   backup[ i][j]=keysta[ i][j]         ;, n$ p2 G/ s" }6 R
                                  if(keysta[ i][j]==1)
' r: I9 [+ N* C' N( T" m$ g" C                                  {
0 B% ~: Y* B# Q                                    keyaction(keycodemap[ i][j]);
/ a+ Y( y' O: u0 T# ~% n                                  }
" o5 B* w) m2 d2 V" L1 \                         }" L/ ~. _7 q0 G( T8 E" a
                  }' v: Y1 c3 Y# H7 F9 P* y
           }
$ T! w7 H: a4 X; U) ~  }
6 f0 ]$ h! `1 T2 V4 F2 `( g) K# _  z$ N6 Q. }

/ T. K0 C# z0 @- j# g3 o void keyscan()
2 z: k* J8 ^# L {, P6 ?5 [! A7 v, v3 _
    static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}; 7 O( r5 ?% A% W4 e) v1 m3 _& |
        static uchar hang=0;
2 u7 l( I, H6 T  g7 K7 G        uchar i;5 v4 @$ e: [7 m. L& q  Y
         buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0);        //按行进行按键值的读取        读该行共4个键的键值 进入buf[hang][0-3]
! N5 d9 z3 D. j2 m        buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);! r8 T0 [  c; z) N( d. B
        buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
- M: F2 P6 G1 _8 y  a; L" @9 L" M        buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);* r& S' b9 _2 S

! }" s: ^. W. r, e# m5 J0 P& n        for(i=0;i<4;i++)                                                                                                   //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X00
! g' _+ J/ e7 u4 |        {0 B4 j' y; P( \! r2 o. m
          if         (((buf[hang][ i])&0x0f )== 0x0f)   keysta[hang][ i]=1;
/ u* F( r8 \0 @, Q: G6 z$ s/ ?/ h          else if         (((buf[hang][ i])&0x0f )== 0x00)   keysta[hang][ i]=0;( x% z8 L- x* r0 V+ {* ^8 ?
         }
  O% j& {, f7 F
3 T) \) s3 i& Z3 x2 V" d        hang++;
4 U7 V1 j) ^  e' m        if(hang>=4) hang=0;0 F) @& o" F  L7 B& U
9 F  v3 H1 o# |+ A
        switch(hang)                        //按行扫描,选取第i行,该行线输出低电平) E$ B7 k4 g$ \9 A: u
        {
& O  b  o) g2 o" F6 p          case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;
- z9 C% O* l1 M; i# ?% C6 [- }& t          case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;7 d0 i7 t# Y: r( N, {( v  x4 J  l
          case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;1 N/ z& X' v/ q% \
          case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;
! l  P; I+ o; x% ^  r; \( [. {7 f          default: break;+ g& Y( y5 `7 U
        }
& k. a: a& N( y- m0 e" [        4 }' x. b( X5 f5 n9 R0 u
) T# t- q1 l; K- P, O
}7 y$ o& s/ X- I  l' K: g! {1 Q8 q
void ledscan()
5 _& F6 ?0 X& u" z1 O# j0 X2 n {
+ W: o2 |7 y# n8 W6 J3 U5 H7 K     static uchar i=0;. g; c' N2 ?# b* Y) P
         P2=~(0X01<<i);! o/ Y& [. t- H6 ?$ X( n+ g
         P0=Ledbuf[5-i];
' r/ V" j2 x/ q          i++;9 V8 c' G3 a2 [# _) E; A- A, H
         if(i>=6) i=0;; h9 d6 B1 @5 J/ L7 m. k; m$ [

( t6 O( r/ o, }" u! x4 O }0 h/ U: o8 V$ y9 R: S
  void main()
" O6 j4 l4 l! }7 [9 D! }$ t; a {0 u! \. i' q" @/ _6 Y0 q! H
        InitTimer1();
/ P/ a6 B5 @+ T' M; T7 o" g        while(1)
! G; ?2 Z2 B$ [% {8 j        {; q6 j* k; [) E# s, \3 t- Y3 ^
          keydriver();
* j: N1 q5 c, p% i  T        }  j% L" f7 _0 L/ D5 l
}9 W; \9 O, c2 N/ e* ^: ]7 ?5 R
void timer1(void) interrupt 3
  j/ b# U* C* R, ~& b: \ {
) w1 ?" f/ x6 Y( S1 o    TH1 = 0xFC;4 z& B7 T7 J2 f0 a, f
    TL1 = 0x18;                                       
0 `. e: I* ]( H# B) S* ~3 |( x* o    keyscan();! V6 k3 I7 P8 v, V. k
    ledscan();
" R- @7 o$ H# K1 K7 D0 f3 B( m4 K }
! I. I, w0 s0 l2 g

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 11:07 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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