|
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
|
|