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