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

单片机开发板附带键盘检测源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-4 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
单片机开发板附带键盘检测源程序
) t& H( Z4 n, }2 K6 ]* t9 ~  O$ A2 H$ A, U6 Z. P
: ]" H8 e9 `) C9 O3 z
#include <reg51.h>
9 V% e; H8 F0 u  o4 e#define uchar unsigned char
3 b5 l( T  w& [: S$ ?& `#define uint unsigned int
3 v0 p9 m" _0 ]uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
9 e" C2 d  F9 y& p                     0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
* G4 P& p6 S$ y" _' q$ `" xvoid delay1ms(uchar x)
: t& \& s$ Y. t0 ^{
5 v5 W+ n2 a) L, z$ s, q$ h        uint i,j;" L0 X3 l3 G: J, K
        for(i = x;i > 0;i --), w1 `% c! n9 j& }$ i9 p
                for(j = 110;j > 0;j --);  G) J+ [8 Z" c9 S( e, [/ \
}+ a* ~/ n$ Y: C+ U+ q
void display(uchar num)
1 a5 _' c4 M! S1 n{5 G7 q4 @, O* }* [
        P0 = ~table[num];# [$ |  Y# M# }' s; H% ^
}# T4 c6 d9 _2 Y3 `$ N  j4 F
/*' W. l/ i! ?. q* N2 ~4 q+ U3 o
*键盘扫描程序9 H- i; C5 u7 ?3 p0 m
*/1 ?) P+ j3 q7 x
void keyscanf()2 F7 ?2 ^, [1 x1 v0 h
{
& p1 N4 B% B4 E) j/ q: j- L        uchar temp, key;' i! V; ]$ K4 X
        P2 = 0Xef;
# i+ c2 y4 ]4 v9 F! V1 a        temp = P2;8 n5 Y. O$ K8 n9 s3 Q* U
        temp = temp & 0x0f;8 ?' q0 _4 S! B, ^) ~- a' m# @
        if(temp != 0x0f)
3 U9 ~1 B- {; x4 @3 l' W# l) ]/ w, u        {
# p2 r0 o! V: ]* {                delay1ms(5);//去抖动! E  o3 U) Z* x( t
                temp=P2;7 P# a1 y7 g7 x( k. b( L
                temp = temp & 0x0f;
5 s( V. B* f9 Q3 D) D3 H5 O                if(temp != 0x0f)
; `" T/ \5 L% Q. }' s6 c* P                {
0 K: l0 Z6 F3 L- Y  p  g                        temp = P2;& j$ g9 j' g5 `! J: b3 R
                        switch(temp)//此时按键已经定位到第一行了
9 G% D$ I( ]3 b                        {+ k+ y$ X& ]- y) @
                                case 0xe7: key = 0; break;//此时代表第一行的第一个按键按下,即11101110  @# D  m5 m2 w/ o
                                case 0xeb: key = 1; break;% U4 ?; I+ S* H3 Z2 E9 T
                                case 0xed: key = 2; break;5 V8 p( D# z% r; |, n* v
                                case 0xee: key = 3; break;
; y7 K2 `4 b3 j9 f2 D% Z1 [                        }$ d  v3 x6 O5 R( h$ i
                        while(temp != 0x0f)//按键松开# n6 p7 C- m! d; Q# v; t
                        {
: {: {$ m! X9 W- `: G6 K' y6 p                                temp = P2;5 G4 n% A: v* D( ]) t6 _
                                temp = temp & 0x0f;
- m) I' S' N' G* }( `+ l# q: Y                        }
8 g! c) n' d! R2 i7 ?0 o                        display(key);, S& D! {: a6 N9 v/ ^  t1 y
                }) u+ C, w% Z9 \3 O# R2 n
        }
$ w; K, l4 d  h( ]4 z9 v, J        P2 = 0Xdf;9 m% T! \9 _8 ]( @
        temp = P2;
+ _1 E, w4 |# a$ D" q        temp = temp & 0x0f;
2 m4 O0 q; H% v  N# D        if(temp != 0x0f)
  v; Q# N5 M, \. y9 [        {) Y1 Y) Y$ e# m6 H
                delay1ms(5);//去抖动9 x5 V& g( y! n
                temp = P2;9 q  C5 s) _8 Q/ L7 a% R5 S: C1 a
                temp = temp & 0x0f;: ~, }$ m& U- ?3 R) c8 l! E, }; s8 R
                if(temp != 0x0f)
# w1 B5 f. g; a& D$ G) d: T                {
, O$ j/ C- S$ j/ h5 a                        temp = P2;5 Y: ~- ]) p! }" m/ a5 B& i$ {
                        switch(temp)//此时按键已经定位到第er行了4 ^' O. i7 q0 t9 ^  i: {6 l5 {
                        {5 G2 O/ N  Q  C0 S4 }& i$ F
                                case 0xd7: key = 4; break;//此时代表第一行的第一个按键按下,即11011110
9 }' N1 o( H. c- V& `* }( `5 n2 J+ y                                case 0xdb: key = 5; break;. g; U8 S( M0 n
                                case 0xdd: key = 6; break;
8 A- ]* `8 p* O/ X( z                                case 0xde: key = 7; break;+ K2 Q5 N3 G5 D6 d. B! U
                        }
+ T9 c/ W  N9 _9 ^+ ~5 x, ]- j& r                        while(temp != 0x0f)//按键松开. [6 v( v/ i5 \
                        {+ k- L0 N' R: P/ r
                                temp = P2;
6 j& d* t; J; O3 V" x0 J$ R' e' k                                temp = temp & 0x0f;
4 A( q; w  P0 T9 E! f4 W                        }8 F4 S4 }9 ?4 C' J
                        display(key);6 ?/ r& r5 `3 U, y$ W8 O
                }
! O7 v  w% z: u( w        }: m* ~- w* E" ?1 n
        P2 = 0Xbf;
$ e! ]) z- G/ H0 m9 x        temp = P2;
1 w, H0 g7 t0 X' L' x        temp = temp & 0x0f;
! ~8 s4 ^7 l, g% s5 Q3 p* h1 v        if(temp != 0x0f)) r* N) Y0 x& Q3 H
        {$ w) G) V8 P0 R' j& b- b
                delay1ms(5);//去抖动
* F& N" p5 f5 o+ @! H: _$ x                temp=P2;2 V3 x  Z. c; ]
                temp = temp & 0x0f;2 }8 [" x5 H" Z7 d3 m5 r: p6 z5 s
                if(temp != 0x0f)2 L; g, a2 E2 J  H+ f# @* E7 w
                {
4 S' X! {. L5 Y* W- c                        temp = P2;
) f5 i* L: p9 ~' X0 F: t                        switch(temp)//此时按键已经定位到第san行了
8 p1 s! l/ Y# g: e$ X6 H                        {% ]: e% U; h) |+ a( y3 D
                                case 0xb7: key = 8; break;//此时代表第一行的第一个按键按下,即10111110$ r- Y1 ^, M* d4 y* y
                                case 0xbb: key = 9; break;
  P$ d$ k) v# e) y" `0 w: U: H; Q5 z                                case 0xbd: key = 10; break;! P% A9 ]0 ~" E0 M! }
                                case 0xbe: key = 11; break;
2 |' m5 ^: d4 r- ~3 A0 i5 Z  V( P                        }9 N* O& a" l1 P2 @
                        while(temp != 0x0f)//按键松开; R3 n  c. j/ P. S
                        {
: {, h6 ]+ u0 ]                                temp = P2;8 P4 m' i3 `" H6 _8 S( C6 Q5 C% }
                                temp = temp & 0x0f;" p1 s4 {# `0 w* Y( I
                        }- t- q% k: j& X
                        display(key);% f7 ]$ v/ w7 w
                }, ~( @$ W7 w2 `
        }
, u2 R' A9 t4 t: ]* ?8 c4 z        P2 = 0X7f;8 q+ {; \' f6 ]5 T
        temp = P2;& W; g/ U1 x! J2 P! \& @3 d
        temp = temp & 0x0f;/ X* A, j+ O: N" \
        if(temp != 0x0f)
7 P/ H( K6 p. }5 e        {
& x! t5 k# K$ N" G! ~. b                delay1ms(5);//去抖动
$ S2 \2 ^  V% ]& d/ c                temp=P2;5 F# W8 Q2 j! H4 o. t& @+ `5 Q
                temp = temp & 0x0f;
+ ?2 s# m) i( T% C0 t- U8 o& M+ F                if(temp != 0x0f)- x+ f% C3 _) o* W. `+ ~# a& h- ^5 M
                {. t3 D0 \3 y+ a7 ?" {  i
                        temp = P2;9 w2 `# X$ Z  x$ F" e2 d5 L' `  i
                        switch(temp)//4 J- X( ]7 P% Y2 [+ C
                        {8 ^" E+ c' O5 R7 p1 d- g
                                case 0x77: key = 12; break;//此时代表第一行的第一个按键按下,即01111110; Z. C, l2 p* j
                                case 0x7b: key = 13; break;
9 B! c. G1 e$ P( A) `. W                                case 0x7d: key = 14; break;
! [$ Q3 s; ]% _( @                                case 0x7f: key = 15; break;3 b, ]# H1 r/ L& L
                        }* F$ T: W. B+ [: p8 b
                        while(temp != 0x0f)//按键松开
4 v1 O7 e9 d% r9 @; Z$ P                        {# [) q# C' f! t1 D% C
                                temp = P2;! d1 G# L9 H1 |
                                temp = temp & 0x0f;% E0 v) F$ m+ O/ S* @6 J5 D& _: r
                        }. L) _; x  \+ \* P; e
                        display(key);
. L1 Y& x6 F" `& g' {6 Z                }% c& P* {. d* P
        }
+ u6 R: @1 n% Y- s}' J% O* m; w9 @4 `) y* A) o
void main()
8 B8 t- p$ ?$ S2 e4 V( M! A! Y{- a1 x8 c; q" H: q& N; V
        P0 = 0xff;
0 q3 u0 D9 O* M: ?$ Z1 |5 f        while(1)
% l6 C- y1 J& j6 u2 |        {* C! V' c4 w8 l/ _* t8 e' s+ v
                keyscanf();
/ _- g" U+ V# k# X) f        }! l& h' L$ {/ y3 ?2 L1 V& W
}. s+ V4 p2 }7 L2 h1 l/ a
游客,如果您要查看本帖隐藏内容请回复
1 D& x8 I/ L: [$ E( V
: V+ Y2 `7 J, ~( w! F4 u% M& v

该用户从未签到

2#
发表于 2019-1-4 18:15 | 只看该作者
好东东,谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 06:04 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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