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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机开发板附带键盘检测源程序
' \9 l# l* Q: y% z7 n2 c9 Q0 G7 s
7 s5 h0 ]2 \. R/ M% e+ @+ u
#include <reg51.h>) m( Q. @: [) `1 E0 {8 Y5 w5 o
#define uchar unsigned char% `- k) ~! `) z! p
#define uint unsigned int
! Z1 V" h8 t7 V* f; Yuchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
! C5 m" c0 B) w+ j# F                     0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};+ o' h, K: E. L% x
void delay1ms(uchar x)* b7 O0 ~9 {& e0 L# i
{
4 k6 p8 `1 o4 K/ O( [) j" ]        uint i,j;. N! u; L: x/ j
        for(i = x;i > 0;i --)
& j: Z$ `' k" D7 s0 \1 `/ l! J                for(j = 110;j > 0;j --);( U9 k* l' m+ p6 j
}
% c: d* H- V- B7 C. R7 w7 Pvoid display(uchar num)
2 P! h' U; v+ s# W1 s: r{1 w' e# F0 ?2 P
        P0 = ~table[num];" P6 ]  ?8 N! T" {6 t
}
$ {0 Z+ t: H0 d/*
' a8 k1 V4 z& \0 I4 M1 G4 `*键盘扫描程序, m) Q% V5 G9 w: K5 |9 B
*// z! h: _( i* m% a3 S
void keyscanf()
5 f  B/ Q3 D/ P: b{1 l7 z/ c! q  X: E$ o
        uchar temp, key;
0 J1 o4 L8 h/ U( ]4 r        P2 = 0Xef;
: y/ f( a+ q' _- v, D        temp = P2;
) t, r0 u* q4 S% ]        temp = temp & 0x0f;  n0 m: f0 q: s2 o4 p7 p4 _+ j7 N* l
        if(temp != 0x0f)9 _# `' Y$ o% |
        {5 m' B7 X& N$ m" K
                delay1ms(5);//去抖动: w, ?, P- X' X8 [. n1 w8 c7 W
                temp=P2;
$ F  u! X$ y3 }; f& V                temp = temp & 0x0f;
' Y# b8 N6 m9 {) N                if(temp != 0x0f)
3 v- x) g% P3 U. I) ]$ n                {
* s2 Z+ h& c/ D# S                        temp = P2;; m! V* s/ F4 F8 M% D) Y6 h
                        switch(temp)//此时按键已经定位到第一行了
+ U& B  ]! {4 \" z* U* n4 U                        {
1 f  q( n: F& J( H& V, F                                case 0xe7: key = 0; break;//此时代表第一行的第一个按键按下,即11101110; z# S1 @- N' ?/ d& g- c
                                case 0xeb: key = 1; break;1 R9 |; k: |( [; T& M9 n
                                case 0xed: key = 2; break;" S# R( _  ]( P! ]! \+ m- V
                                case 0xee: key = 3; break;
. o1 p8 \( I9 e6 ^                        }3 i8 v# F5 y+ r, d3 e
                        while(temp != 0x0f)//按键松开
5 Y" ]  j- J$ a* Y6 J9 R                        {
) ?! `' }  ?# N% ~/ R( E% `# Q0 Y, b                                temp = P2;1 r# j4 g2 ^3 E. ^( k( z
                                temp = temp & 0x0f;+ R, e7 i+ O: K  C; u, u' R1 C3 ?$ u
                        }
. e( z/ u4 @5 M2 c/ a& [  i( a& T                        display(key);
6 i# J# _7 O* `0 G7 c# i. c                }
, ~4 C0 N) o% S! R: @        }. S! Z6 l; B! _. b
        P2 = 0Xdf;+ ?% M/ V6 y7 B- V, l" B  J$ b
        temp = P2;
7 C0 ?9 B0 y9 J/ d' X9 B        temp = temp & 0x0f;" x. w6 h5 |- E/ F0 j& m) s" W) u+ N
        if(temp != 0x0f)
3 m$ |5 f. I; @4 U9 k' f, k        {2 e0 `2 S4 e, I) `8 W$ z  v6 T
                delay1ms(5);//去抖动8 B$ I9 e' B0 g7 C! B, B8 w- C* m: D
                temp = P2;) i: j4 x# i0 r  O( m
                temp = temp & 0x0f;
6 P2 d( a2 @" i' E1 o0 w3 h                if(temp != 0x0f)" |$ Q/ H$ {+ K$ o- f& d
                {
2 V" k' m( g0 r! I( N. J                        temp = P2;
# E# Z% C7 M" O3 Q) n                        switch(temp)//此时按键已经定位到第er行了
; Q4 l( h# g7 y7 g1 y6 z3 G0 E                        {
  p# }7 v; i  d, f9 i7 a9 B$ |% q                                case 0xd7: key = 4; break;//此时代表第一行的第一个按键按下,即11011110
3 v. N1 W1 V- f/ B, g                                case 0xdb: key = 5; break;; ~! J8 E6 v0 q6 d
                                case 0xdd: key = 6; break;* ?( T( K" e4 ^# v" f% x
                                case 0xde: key = 7; break;
$ d0 R! ~. S3 v# P* b                        }
# Z5 ^0 i8 F1 c: d" x' I                        while(temp != 0x0f)//按键松开- e6 o- h  G- ]
                        {& p8 @* S1 }! F* ?; @
                                temp = P2;( n5 M" K" ~1 _0 b# D0 @" d
                                temp = temp & 0x0f;
3 C9 R* ]% s2 B- V/ z1 F: A                        }
( O( i8 j. v7 |/ B                        display(key);
; ]5 X9 k2 U1 a% x' ?                }" v6 V( X% k. q
        }" s; w2 N% @7 K5 I2 _' L# l6 h
        P2 = 0Xbf;
( ?8 X" }9 Q: ~# y7 e        temp = P2;3 b0 n9 v* h4 v. ?. N( a
        temp = temp & 0x0f;" Z% N4 E7 o/ {+ y9 ]1 y
        if(temp != 0x0f)% d+ A$ F+ m0 C" p2 Q/ @5 h4 n, z% f
        {9 P& Q# I$ C3 ]5 a5 D
                delay1ms(5);//去抖动
% |' [! i8 |$ r) t9 j                temp=P2;1 ?1 h5 F7 E( H- z
                temp = temp & 0x0f;
3 ]3 D& O3 ?5 v9 }% e5 \7 ~7 }1 K                if(temp != 0x0f)4 h2 F$ L+ w* a
                {; V/ q: i3 _  f# J1 p
                        temp = P2;8 y$ J: v$ ^! E& V
                        switch(temp)//此时按键已经定位到第san行了
6 l+ Z7 W: s/ Z- l4 H                        {
+ Z( U! b! V4 @                                case 0xb7: key = 8; break;//此时代表第一行的第一个按键按下,即101111102 x3 f3 j5 B4 v1 K
                                case 0xbb: key = 9; break;
. U9 t  i$ V: Z0 o, f                                case 0xbd: key = 10; break;
" b3 P7 d& j4 X* t6 g                                case 0xbe: key = 11; break;2 O0 H3 U+ z$ O- d6 X
                        }
& |9 C3 p/ h3 y0 n! H2 N! ], W2 s                        while(temp != 0x0f)//按键松开5 s; N: s- E8 }/ f
                        {
* \! i/ w& a/ p2 \                                temp = P2;
; O# F, C( v9 W$ f* p: C; W" d* h                                temp = temp & 0x0f;& u# a4 U( I; n% w
                        }
% D+ y: U# Q2 u8 ?                        display(key);+ g& |9 r: }; [, m8 N. M, S( S; n
                }
! ]' U8 O8 J5 N! G% c3 S        }
1 T% J" V9 w0 E/ C4 R1 v        P2 = 0X7f;
: |3 N/ M+ }% b$ I: t+ e        temp = P2;2 s' F7 _+ j) f  r
        temp = temp & 0x0f;
# {0 D' D) l6 T: U% G- z8 O8 i        if(temp != 0x0f). i0 s( y, u! r. ]
        {0 f% b) K" G3 x3 |7 B
                delay1ms(5);//去抖动
" J# k: \* Z% {+ `6 y  v0 t                temp=P2;& G4 K6 M  M2 a4 n0 r- n  v
                temp = temp & 0x0f;
* n: s/ ]* ^2 Q+ _5 G; d/ W4 G                if(temp != 0x0f); `$ r8 o& }7 j! ?
                {: b6 q' P9 n8 c! o( U) N/ g: q: R+ W
                        temp = P2;
  q( O. F1 ]' @# I" C                        switch(temp)//
: c" G* S$ m+ U/ K* M  ^/ i                        {" M) ~; U" X: i5 |. z: T6 U
                                case 0x77: key = 12; break;//此时代表第一行的第一个按键按下,即01111110. y) o, \- G' K3 U% D, d8 |
                                case 0x7b: key = 13; break;6 [. R% E( a5 y! V+ k( m2 r. k2 Y
                                case 0x7d: key = 14; break;
' a3 E- [" b& S                                case 0x7f: key = 15; break;" p; M- ~( G! V/ w+ t5 s
                        }% t5 k5 Z+ Y, Q: ]
                        while(temp != 0x0f)//按键松开$ y* F5 d- X; t: x/ U/ d
                        {
& C$ o$ Z+ u8 J1 ]( I2 j                                temp = P2;
/ [1 g: ^5 P: [- W' d( k% I4 I                                temp = temp & 0x0f;0 ^( M7 t$ N8 @; L% c
                        }. g% c' C3 s( j/ |8 L
                        display(key);
; O6 Y- X; _  k4 h7 l) w                }
& f! K9 r6 Y. I/ Q; q5 c( U        }. [+ J# ?  V- }
}
8 ~$ Z& L5 f  t' w5 Ivoid main()
! V+ e; k% s5 d% d- Y* m9 v1 O{% ?* _+ L3 w5 ~- D0 m$ _. S! X
        P0 = 0xff;- F) d( \- |% G' ~; G) l& f
        while(1)- P( M* {3 T; |( A) Q. m5 |
        {
! B2 }) e5 `9 L. v! x$ a) z8 C                keyscanf();
/ X# j6 n5 \& n/ M$ }9 X* I        }8 n8 r# @  m& k4 ^+ U1 i
}: d$ I" a1 [; n+ k- n9 s. ]8 l
游客,如果您要查看本帖隐藏内容请回复

1 ^; q3 a& P! o
* V# ^( _4 R1 M, E4 P

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 14:46 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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