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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算
* ~& G: i: H6 o5 H& l4 N#include <reg52.h>
& ^5 F; e4 O8 l  w2 C#include <intrins.h>3 H; L4 I' y! Q/ E" O, Y$ x
#define  uchar unsigned char
) K/ k2 k2 w8 L4 R#define   uint unsigned int - [$ E9 e$ t4 ]- Y. i5 F
uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //共阴字形码& q. m. D% f- H% q7 e3 ~. i2 t7 R
uchar code keycodemap[4][4]={% x2 c: g( ?( v1 L+ l8 s$ d2 ?# ?
    { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
- N3 Y8 m  T) ]2 k5 F5 h8 q    { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键1 P. I1 p2 T0 H) y' L+ L/ A+ x
    { 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键
# u; i. J$ e) f- w, h4 x    { 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、  回车键、 向右键};
6 J- N6 u1 s5 S' Quchar 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 弹起- W8 t) W" t: H0 Q
uchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00};                         //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位1 A  b: f8 R+ _* I, E9 J1 D
long result=0;. h$ X, n0 U+ \, m/ P
long adden=0;
/ c- r& O' a4 G5 a! u$ ?# V8 A8 fsbit keyin0=P1^0;
7 B4 O5 m9 X  f# g- Bsbit keyin1=P1^1;4 O) o, [! O" j
sbit keyin2=P1^2;
8 B9 D2 ^/ w9 v4 j8 S2 A$ Gsbit keyin3=P1^3;
# x  {4 e: Z. y; r% k6 D: |& S& a! H% a9 j' X' m. v8 i
sbit keyout0=P1^4;, X% R8 [: i) N, j
sbit keyout1=P1^5;0 T( B' a" |% d- u7 E1 y8 b
sbit keyout2=P1^6;4 e8 s+ u/ `  |" H! z9 E
sbit keyout3=P1^7;
/ z* ~( x3 L2 [1 R* P9 ^9 R2 _1 P" A1 I' A* _3 O
void InitTimer1(void)        //定时1ms
8 h* |. L. U6 E; P{% V0 Q& U% m0 @! l
    TMOD = 0x10;: j, M3 F- b1 n- ~& K7 Z
    TH1 = 0xFC;0 `' w6 S& d" V; _
    TL1 = 0x18;
# o1 w; H, C, G/ }% \) V: h+ k1 @    EA = 1;
9 w: {+ g8 H, j* T, Z4 r3 ~6 l    ET1 = 1;0 m( S) f( X, M. y& ~
    TR1 = 1;2 j- O/ z9 B& f# h- ?6 P
}& b% _+ m" ?/ y9 n; i
) W* D( v1 m% U6 D, `
  void shownumber(long num)
8 H! I8 n7 h' `) Z  {
, h1 U) }: Z0 Y0 U/ p- N3 {4 Z/ c     static uchar buf[5]={0,0,0,0,0};
& Q! p3 z! A5 v; i# ?* m         char i;
9 z4 Z+ q2 M) w& x, m1 n. n/ ]+ }2 y         if(num<0)                  //负数为补码 取反加1得到原码/ \3 D. B0 C3 J/ O4 H
         {   num=~num;
" }5 T: R  i0 j* l2 V( C8 O                 num++;0 n5 B; n" i/ a/ q+ _
                 Ledbuf[5]=0x40;
5 {8 M1 a7 Z7 O% Y5 e         }
0 _, `  Y, M( h  g* T$ c, C. \          else8 E, E& R' W' g$ v; r! P3 l5 o
          {6 v; H% R# m: A
           Ledbuf[5]=0x00;5 q5 H8 {* t0 Y* c4 V+ G5 E  s! G
          }: c! [% I+ ]' ]/ P- Z
         for(i=0;i<5;i++)
, _- g& M( p) |9 z0 E5 b3 `6 o         {buf[ i]=num%10;3 y" b0 f( P' _, j! n/ w
         num=num/10; }  M1 R5 J4 v% r/ [1 X

2 A4 m# G1 @9 l$ ~1 Q! e  E2 c0 A" v            for (i=4; i>=1; i--)  //从最高位起,遇到0转换为空格,遇到非0则退出循环, G1 k/ }! R5 ?7 {* B, I2 A; n
    {8 ^  l) \0 F- f4 [5 s) T
        if (buf[ i] == 0)6 _3 c- a/ S+ R: S
            Ledbuf[ i] = 0x00;2 E  H2 z) o; N2 y$ E
        else
: W( E) [  k! E# }% q            break;9 ]) \) g. o" H" v" o1 B2 n
    }
$ |" _. a5 R/ x+ I
, r  _, F) j" T" g( N        for( ;i>=0;i--)2 c+ T/ F- J- X: M2 v' R
        {Ledbuf[ i]=table[buf[ i]];}
. Z; K+ n$ n4 G8 x  |. j1 o
4 L1 E4 M. p  {/ P- w  }
) ]7 q3 O* V  T+ a  void keyaction(uchar keycode)/ P0 g! F; ~9 k
  {
- P: I$ h& U9 Y& M; X7 t0 }7 \     long temp;
* R  U5 F# E; K! Q& u$ S0 E         static uchar yunsuanfuhao=0;+ Q9 z+ b0 B; w9 p" S6 T" N
     if((keycode>=0x30)&&(keycode<=0x39))                  //按下数字键
% f% z& T% o# A' |4 |# a% G         {
) F9 \. Y0 J- g% J& y) r/ w                temp=adden;4 O( H7 f) j5 B- V0 I) [
            adden=(adden<<3)+(adden<<1)+keycode-0x30;& d. m% \! R& x, D' T3 V
                if(adden>99999) adden=temp;
( ~  H& g- s, W  C/ O4 x. k8 f# m7 R                 shownumber(adden);, L( B$ q' {& ?5 }
         }% o2 [+ s! |7 P. }# m

" r( p( d! x2 R* ^         else if(keycode==0x26) //加号键
5 q' Y% n  w" z: }1 P         {, z# U5 N; B- Q9 [
            yunsuanfuhao=1;! B) |; [  u  q0 p5 k
            result=result+adden;! S( q  m% \8 |: B
                adden=0;
$ X$ r: u0 E4 a                shownumber(adden);
/ U* N1 ~3 |) l8 R+ E  l1 i* z+ v2 e         }* M# ^  d, t4 Z3 h0 F* L
         else if(keycode==0x25) //减号键
/ i6 Q; Z  n! d6 m         {
% R% _6 q' t/ g' [            yunsuanfuhao=2;
4 K' i/ }  V  c! }            result=result+adden;' W8 T7 W6 p4 N; m+ `7 ^9 H8 r
                adden=0;
, f8 F8 Q( ?: D" N                shownumber(adden);: L2 u8 Y5 |2 T! J' b4 m8 u5 ]9 E
         }, y4 S$ q  T6 D. z! S; {
         else if(keycode==0x0d) // 等号键
, Y  L( W" g' i+ _         {, Z; I4 w7 }. V
            if(yunsuanfuhao==1)           //加法) m5 l8 h1 ]" k6 ]# t& F8 j
           {        result=result+adden;
4 \; a3 M* m7 W7 T% H: ~                    adden=0;1 e4 r8 w& X# E( |' R1 c
           }5 o1 v) n+ V" X1 x0 E
            else if(yunsuanfuhao==2) //减法
: p" _( R: P: z' ~           {        result=result-adden;
! \2 C* i+ @; c+ a                    adden=0;
+ O7 l1 c3 @7 S  s# V7 Z* R           }. y  q3 R# u' k
& ], N2 X, j1 J- O3 o4 g7 I
                shownumber(result);+ G  k! T8 I4 m  f1 I3 ~
        //        result=0;
8 H8 `0 p& z6 _/ u% ]0 {# Y         }! J; d. A  ]. D
: T2 ?& _: P" x" ~- e6 f
        else if (keycode==0x1b)                         //清零键
9 N. K7 ^) \$ t) ]. _* T        {5 k) q6 f3 m' h# Q+ b" b
           result=0;9 L: N  a/ j( t. h
           adden=0;6 ~. L0 H: V7 j, b0 o( H6 [
           shownumber(result);        1 R; B: ^1 D. l" z
        }
$ t* B7 W0 o5 z& _1 i' Q
1 W) e9 W4 \: k" k& }- R  }7 \, r" y0 R: u5 |

; a! W, O' }0 t8 s5 [
4 h! k3 E8 z: c/ T- j
) }: a; r9 v$ b0 I2 Z% [" c
+ n2 j; j+ S! S# b
+ B  t! V2 a9 G/ j; _4 b' d# L2 ?
0 E9 _0 J$ z8 f9 t  void keydriver()
/ }* f4 X% L$ M/ \) m- B  {
! k% c* k' o: h* g: Z/ f                    uchar i,j;          //i行 j列! w( [6 L; N1 p. ^) k* o
                  static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
3 X0 u. M7 W' A! N                    for(i=0;i<4;i++)
- n. E2 y3 e) B) M           {
& Y' @* x) G# |7 a: p              for(j=0;j<4;j++)
% Z2 |" X7 w0 u! H: _                  {  u, x" C" i$ H6 A5 b4 l5 |7 X
                     if((backup[ i][j])!=(keysta[ i][j]))' \- t5 u! O- T. R, |1 Q
                         {
0 m) T( e7 h+ O% A                         $ d: z3 `3 ?$ Y7 a8 U3 Z
                                   backup[ i][j]=keysta[ i][j]         ;* H% @# c& {: ]* x! a
                                  if(keysta[ i][j]==1)
" w7 H" O7 I  r+ a                                  {2 L3 T9 W" F# H* }' }" S
                                    keyaction(keycodemap[ i][j]);
3 Q  |" t1 D; T2 o                                  }
5 Y$ |/ }$ I4 p                         }
4 {0 \7 H. l* \, v0 j! G, j                  }
" Y# A1 x& N" b7 g5 F           }
; ~$ e+ W/ b; j/ ?% ]* K3 |5 ?  }
) |+ n4 D, @2 a7 M+ E+ ?
) T5 P0 U- a" K9 n; n$ z" G: R
4 H2 i0 @) A( S6 n/ Y$ U) @" } void keyscan()9 q7 j: I9 T# I
{
$ D- {- Q1 R7 a3 Q    static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}; , c1 {5 B. O8 Y
        static uchar hang=0;& S$ w0 S9 A+ i
        uchar i;- c( g2 B7 m5 _2 F: K! @
         buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0);        //按行进行按键值的读取        读该行共4个键的键值 进入buf[hang][0-3]( E7 e0 e& Y; a/ ~& D" |/ b4 [
        buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);' [5 A0 _! b& b  I3 J- Z- ]- y
        buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
7 B. p( E* g, R" e) Q( O* m: k        buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);
+ [$ B$ J6 G( c) R
2 A4 H/ a6 U: Y# g8 {        for(i=0;i<4;i++)                                                                                                   //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X00
6 j! j" ], `( }( d        {
  V6 x/ V7 @4 d) a          if         (((buf[hang][ i])&0x0f )== 0x0f)   keysta[hang][ i]=1;+ {, z, ]. N3 {& ^- l4 }
          else if         (((buf[hang][ i])&0x0f )== 0x00)   keysta[hang][ i]=0;4 t( H) g/ _. a& ]/ X$ W9 _* @
         }6 r. o+ o7 p; ~# S! L
1 @# Z  Z+ ]5 @3 |
        hang++;7 m& P5 [3 s, ]* P* l9 u- V( e
        if(hang>=4) hang=0;
/ b+ _0 o! _+ y6 }% h, \' C' ~$ V. ?5 }% o1 O
        switch(hang)                        //按行扫描,选取第i行,该行线输出低电平' _2 U* p+ ?* Z5 W* ?  r7 F/ {/ }
        {3 d: e4 N: {3 [; u) J7 S
          case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;1 _. P1 t9 z  ^3 ]) Y, O
          case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;
& s2 N# [! _/ b, n' @( \  E- o3 _          case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;/ b9 p& a2 _: Q0 ^# H2 _
          case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;
$ \% p8 b4 H) [7 [$ p0 H          default: break;
! e8 w" U: c3 V, |6 E        }
+ J1 x# ]" x2 p! ?        
) k3 E: T" r: c- W; i+ {4 b  X/ S. d: @) ^1 v; e
}! y- Y) L% S% }- B7 C
void ledscan()+ m/ M  P& j, Q
{- e! u% C8 j6 J; _
     static uchar i=0;
' a% \' |; K1 Z" f4 p         P2=~(0X01<<i);/ v. K. `' x0 f* C3 O
         P0=Ledbuf[5-i];
4 _0 D6 v# z: z  I. Y. O  k          i++;! |8 Y: z0 r# S  u
         if(i>=6) i=0;% A( K1 H4 O1 Z
0 `% _! L1 M' e4 f/ ^, Q, b
}
9 O0 X. l- w4 I  D$ L, U1 s8 a/ n  void main()% D& i" l" k; W" g/ N/ ~9 K
{$ A; b% m  O* v/ ^, I( Y6 |
        InitTimer1();8 }; q. t  n' _+ w- t4 ^
        while(1)9 a( H; d. b( R! Z# j  T2 [
        {
' l+ S( X; q3 n3 q          keydriver();" ~: @; V" m4 I* P1 E
        }
4 i; Z; I( y; |" n  E! h; J }  x/ X) l1 q8 x4 @! b. L. c
void timer1(void) interrupt 3
4 J3 U; @0 _) ` {) }3 x$ W3 c2 e! G' A0 J
    TH1 = 0xFC;4 r' N+ Z% t/ e- V! I+ X8 h9 p/ I8 u4 w+ v
    TL1 = 0x18;                                       
, t! k& e/ o4 g  c6 e) L    keyscan();6 A/ {* R7 _9 D- `# Z- q+ \# i
    ledscan();
4 D0 V! _7 o4 q+ t: |/ S* C }
+ H8 ~: d, A2 r4 i

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-29 08:15 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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