|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算
2 g! r7 O* L( g1 R- _#include <reg52.h>
# n1 e& \3 N4 i! N#include <intrins.h>
5 r1 v* x1 f; G4 ]9 X' S- L#define uchar unsigned char. [8 k x) b4 u7 G3 m* U
#define uint unsigned int 8 i" s. ^2 O5 ?& g. A6 ~
uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴字形码; A( f* D6 L) S- c2 L- B. n* L# [! S
uchar code keycodemap[4][4]={
+ p: Z& ?: h' i5 S- \ { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
$ d, C4 g! ?% }$ L; k# w6 z$ ~ { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键, M1 |3 O. _# Z9 n1 a
{ 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键# Z: v0 X% O/ o2 u. _% V$ T
{ 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、 回车键、 向右键};
/ ~' s" O9 C$ L9 V4 }/ ]) ]$ G) t4 Uuchar 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 弹起
$ n+ n7 _ @2 U [$ j6 Iuchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00}; //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位& Z5 t% p1 C* r4 p: f" z! m/ i4 M
long result=0;4 f* \+ d* @2 Y8 y1 W
long adden=0;! e5 a) {& a% I5 i
sbit keyin0=P1^0;
: _) m; b5 X: |; ~: O. Msbit keyin1=P1^1;5 t! q. f* K; ~0 W( p, |9 H
sbit keyin2=P1^2;, A" u! [5 r7 W& S9 s8 y
sbit keyin3=P1^3;* i! ~: t0 O. u5 ?
! C' Y2 d3 @: \; J9 e" f3 \
sbit keyout0=P1^4;2 Y" F" ?6 J) C) D
sbit keyout1=P1^5;
- q- U% C9 y$ @ f& J' R/ O) c' Osbit keyout2=P1^6;# g( I$ E2 @8 ]( B' a# m) L8 X
sbit keyout3=P1^7;
4 U5 z% w: G$ q s
7 n9 I0 b8 i1 d! U7 ? void InitTimer1(void) //定时1ms
; @. D7 p6 C4 s4 W{7 Y" A6 M6 M) ^1 r8 l' L
TMOD = 0x10;
9 R7 Q5 K. M3 o p# Y+ X& y TH1 = 0xFC;
0 G. U* y# c8 U TL1 = 0x18;/ E! g& t3 B- K7 a' D
EA = 1;
a2 b" z- {$ ^" q2 u ET1 = 1;& m& i& v. ?4 e
TR1 = 1;
+ x- P2 g( C3 M, S) m6 y}. F2 {' T! G& ~7 ]# i- `
. u4 B8 I. S9 K4 V6 \& O1 x
void shownumber(long num)
4 P. P7 I- b& u( e- x5 v% c: l+ f {
( Y V9 l V3 C, ^% [& Z static uchar buf[5]={0,0,0,0,0};
& @- d7 I6 H9 ]" p3 _ char i;
1 f# p: C2 Z/ w8 [! ]" P7 z if(num<0) //负数为补码 取反加1得到原码
' p; d5 B2 ^5 l { num=~num;5 g( t* m& R! ^# \4 Q" T6 w
num++;
Y0 S7 h0 E* z* ]4 k' E$ x1 g% L Ledbuf[5]=0x40;9 L, ?! Q- J6 r9 _+ |
}
& k9 g- D3 c5 t2 e3 |! G( G8 Q U else
7 i: R* F0 z+ ~$ B {
/ i1 Y$ c' @; }* t Ledbuf[5]=0x00;
' G2 q" M0 `( w }1 d9 O- P3 b: E. B/ U& B8 X/ B- d
for(i=0;i<5;i++)) O. K' q& U$ i' |6 ]" A
{buf[ i]=num%10;8 h$ I$ Q/ }- U3 i% {1 \, F
num=num/10; }1 B2 M2 I7 H. b6 W
) s# f( b5 ~ m- R J+ P
for (i=4; i>=1; i--) //从最高位起,遇到0转换为空格,遇到非0则退出循环! z0 b4 p2 M$ N7 V4 ]' K" T9 E
{) Z2 g- _' F' [8 p5 j8 x' j
if (buf[ i] == 0)
5 o7 a" Q3 q. H7 g8 M' O+ H Ledbuf[ i] = 0x00;
7 Y7 P) ^! P. R+ \* a else, ^! |/ I1 Y) g6 G: c
break;# L2 S. M' ~5 r) x' j5 t3 \, E
}
2 I8 I2 D! A c' o1 q" M8 H
- ]& S# x# }5 m/ L3 [/ P. p6 J M for( ;i>=0;i--)
3 u. E- w& p6 `. w2 o {Ledbuf[ i]=table[buf[ i]];}1 B0 i( U- U' t
5 w# c. R7 b& ]" ~
}5 d" J+ q, y, P, k2 [: O
void keyaction(uchar keycode); f" p% k. e3 i2 O0 D* t( r1 e/ V
{
7 h. S4 x$ r% L& G: S/ K4 r3 o long temp;( `5 \( A7 D5 O, X9 G8 }
static uchar yunsuanfuhao=0;
- ]8 ]- n# u R- n5 w" e- Q9 Y& @2 E if((keycode>=0x30)&&(keycode<=0x39)) //按下数字键* V* L" [4 U8 f8 g4 o& q
{5 l4 O _& L( s! N: N" r8 V8 h
temp=adden;' K# n# X1 p; \4 K* c p% f
adden=(adden<<3)+(adden<<1)+keycode-0x30;
$ l0 q) N3 F' g if(adden>99999) adden=temp;
+ Y( a8 r4 D7 G5 R9 c- O shownumber(adden);
0 X5 N" J* x g/ T1 Z. C }
( ^% O5 O5 u2 a0 t, S6 Y9 l/ D
- N* Q* M) X. e* R# V3 @* e7 P( \ else if(keycode==0x26) //加号键
2 Q% @0 A( L- }4 f2 O {
" C/ ?; q5 w2 U2 ] yunsuanfuhao=1;0 Z! ~" o% a* v3 r
result=result+adden;) _1 A4 V b+ ^# E5 X7 X
adden=0;
3 [' i& `, L+ R, d shownumber(adden);
+ E5 b+ ~* @0 j9 b }0 R% H. M4 S* ]. B
else if(keycode==0x25) //减号键 ( Z$ a, w& Q9 r- F
{) d8 m( ?" E) V2 V' N
yunsuanfuhao=2;
' J8 s* z) P0 j4 e8 f result=result+adden;) f7 y; Z4 [. U# v
adden=0;
/ O2 A0 T6 K. |9 O! s0 A y: L shownumber(adden);
- k8 j! C* t* ^- `: M+ G/ n }
% f. _+ T) j/ P! }" r1 P& i else if(keycode==0x0d) // 等号键# ~* I* g1 g: ]6 c! P3 Y' Y9 D
{; _9 k* T, |! [
if(yunsuanfuhao==1) //加法
5 q$ P3 ^6 _- n$ l, m( e { result=result+adden;
6 t! \; E m T! q8 d: @" U9 d; b adden=0;
" Q1 D. S# l5 ] }
; ]2 }# f( x, i5 {! E5 D% |% R else if(yunsuanfuhao==2) //减法
) N* q4 ?1 v4 Z8 _" m& p { result=result-adden;2 H" }# Q) W& {3 L- t! O( C/ b
adden=0;4 ~* ^5 k5 U8 |0 Q$ [" g5 F8 f, l9 o. \
}
; f; A) u3 b( E2 P7 g& `5 Q. J1 k
shownumber(result);
% h1 j' T+ M4 { // result=0;
" H. U2 z( a. \9 w5 e: \ }0 ]5 J+ q) X% C" K' g+ y) Z
3 V" w# g6 v* V7 r) Q+ ]4 A else if (keycode==0x1b) //清零键
2 j2 @7 w5 \3 i$ H {1 P6 R H+ z( `: o3 Z
result=0; p4 r2 n( |! E6 v' C- e+ X+ b7 n
adden=0;& P3 Y9 q2 Y+ K
shownumber(result);
& m2 L. F6 Q/ c2 _3 w+ C }
3 H' [ Y0 s z
0 U" J/ l% r' S1 ?, X }
- V$ Y( A+ p7 _/ s
* Q+ f1 o! X2 ^- T1 x
4 d7 B1 Y7 k: R1 a' G
5 D8 c3 ~7 \8 l; B' J5 Y: Q+ A
( ^" U+ J0 c c# B
& z/ s0 B3 ~9 |1 E; Y9 ~
$ P, {1 Q9 F/ a! l2 r/ g void keydriver()
* t/ X# Y% G' B; g( p$ o. H# s& f { g. w& l0 K6 h) R1 ]2 }. [
uchar i,j; //i行 j列6 H# [" k2 n4 ?; [" _
static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
5 q8 Y. g. k* {( e7 M% g2 d" z- D7 _ for(i=0;i<4;i++)
$ k* |4 _+ ? T8 v7 l {5 v& T" y: r8 ~: `
for(j=0;j<4;j++)4 a7 {& a! Q" z: N
{
/ Z1 H8 s' `( [! A" \6 k if((backup[ i][j])!=(keysta[ i][j]))
w: O7 ^( g& ^4 s, s" ^. H3 Z {7 r2 j# F( [' g
# C! C# r, u6 [& G# k
backup[ i][j]=keysta[ i][j] ;
$ a9 V! ]9 S, ~( V7 G if(keysta[ i][j]==1)
# E; h' y' F& |! C* H {
1 g3 ]& Q$ W; e4 B$ |" n/ u2 y7 f keyaction(keycodemap[ i][j]);. w* T6 `! h& B% h
}
3 ~, s6 }/ w9 ^ }
7 \* k. `0 d; s; ^, v2 ? }
% f2 w7 Z+ }9 m" @ }
1 w6 Q) U: r( \. {! a: l, n6 O }' ]4 @2 W/ A! X- e8 e
. a: i0 s+ x: b! ~8 e! G
; Z" X5 u, [3 }$ s5 _ void keyscan()3 ^6 V: G+ C1 [* z5 \* v4 `( x
{8 D: n% C. I7 x8 W+ Q) ~
static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}; O/ ]7 T3 h/ S+ B
static uchar hang=0;$ ^3 s- e) F) h2 r
uchar i;2 s' }0 A2 L* s9 W" m
buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0); //按行进行按键值的读取 读该行共4个键的键值 进入buf[hang][0-3]
2 @ R, j3 ?1 F" R1 D' T) z buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);: p- J4 u, v, Y% D3 P& b
buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
6 O+ k. ?5 x; m- q/ `8 x buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);
K5 ?# J5 c5 X: P1 j* |" k" c; @% y! t( G* z
for(i=0;i<4;i++) //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X00+ k$ ~! S( A i; o$ F. Z$ v1 J
{- ]3 ]" S2 e8 y3 H4 M( W
if (((buf[hang][ i])&0x0f )== 0x0f) keysta[hang][ i]=1;0 k9 N) u o0 t3 h7 \9 x
else if (((buf[hang][ i])&0x0f )== 0x00) keysta[hang][ i]=0;
& m' i+ o1 r4 p, S* y- S }0 {, U7 g5 x6 e$ Q6 ]
! S( }/ B9 G6 j5 q/ C; k
hang++;
8 S! h6 n7 e& X y# F6 ]! J if(hang>=4) hang=0;! [( c# M2 W$ y) N# _) ?( T) X
) @: X) }1 m& s6 ?+ T! [& {& Z
switch(hang) //按行扫描,选取第i行,该行线输出低电平0 e% s; a' t' ]* O2 ~7 m% T
{
- E# A" C; y0 i2 X6 ]: T case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;$ I, V _5 z7 y
case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;
9 ` M6 s5 j+ K7 J4 W' ?3 B. p4 M case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;
- Q6 e# T8 k/ n! I9 S case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;+ \ F" {3 y' S0 u4 y
default: break;& g# Q4 @' z2 s) c: l$ @: z
}7 M8 F4 n1 v' F2 K. Q
/ e( P$ ~% L$ q6 n4 _! U
5 r8 |+ a8 p" N+ q8 Q( u }3 J6 R% \8 G$ w! z, D6 L$ w
void ledscan()/ o" [7 b# n s" ]
{
/ U# f3 O0 L5 k1 @! k) I static uchar i=0;, y! ~5 V4 m% p' O1 a7 ?0 G" G* O
P2=~(0X01<<i);/ s* Y, m" |+ V
P0=Ledbuf[5-i];
- i% R( Z+ C- z i++;: u. h# f2 W& Z" A }$ H' p6 X8 \) a% f
if(i>=6) i=0;
' Y( }5 `( ~! `2 t" X0 O( a/ U, r6 ?. O3 P- |/ k
}2 c# F, E0 `& _3 j/ g* a/ A
void main()
# [6 U! l# S' d' } {# O) E' `+ o, l
InitTimer1();% X3 d+ C$ S9 Y/ l$ p4 x j
while(1)
" A: ?9 d( ]$ z8 ?9 b9 R {+ G1 N1 e1 o8 r# F E# ]
keydriver();; M& ^* \9 E5 c' T) o9 I
}
% ]1 ?2 A+ N) X }; p# ]: i9 h. `; Z5 R% M7 e
void timer1(void) interrupt 3$ d+ f0 \0 X( n" `& X
{) |( o4 o( U1 Y |4 |0 \
TH1 = 0xFC;+ O# w1 ~$ X) t$ Y' C
TL1 = 0x18;
# Z- e! j/ I) z7 l! {+ U, x5 t keyscan();9 P! k' Y( D* L8 X1 l' \7 J9 D% q
ledscan();% m3 G1 f- a" x/ m# B w! L% \0 |# \
}: \+ v* y! p: q3 A1 {" u
|
|