C51 4*4键盘扫描程序(c语言)

想写些一个 4*4键盘扫描程序(C 语言),可是不知道怎么写,刚刚入门,有谁可以提够些参考!谢谢!

1 2 3 NC
4 5 6 NC
7 8 9 NC
0 NC Shift NC

Shift:为复合键可以与其他15个键进行组合,单独按此键无效!!
最新回答
楚楚可人

2024-04-17 19:07:02

键盘为4*4矩阵式连接,一共有16个按键。 工作原理为。P1端的低四位为列,高四位行。所先置低四位为低,高四位为高,当有按键按下时高四位就会有某位被拉低。只要判断高四位不为全高就说明有按键按下。判断有按键按下后就要判断是某位按下的,方法为,选将高四位的某一位置低。判断低四位是否有低电平出现。依次对高四位的每位置低并判断低四位出现的低电平。如高四位某位置低后低四某也有出现低电平。这样就能判断出低四位与高四位相连的位某位按键被按下了。通过定义好的编码就可以查出是某个按键被按下了,程序将按键值通过查表并发送到LED上显示。 6位LED为动态扫描方式 。先显示第一位,延时一定时间后在显示第二位依次类推。。。 共有17个按键。按下按键后数码管显示相应的数字,并左移一位。uchar kbscan(void) /*键扫描函数*/{uchar j; uchar sccode,recode; P2=0x0f; /*发0行扫描码*/ if((P2 & 0x0f)!= 0x0f) /*若有键按下*/ { dlms(); if((P2&0x0f)!= 0x0f) /*逐行扫描初值*/ { sccode=0xfe; for(j=4;j>0;j--) { while((sccode&0x10)!=0) { P2=sccode; /*输出行扫描码*/ if((P2&0xf0)!=0xf0) /*本行有键按下*/ { recode=(P2&0xf0)|0x0f; return((~sccode)+(~recode)); /*返回特征字节码*/ } else sccode=(sccode<<1)|0x01; /*行扫描码做移一位*/ } } } } return(0); /*无键按下,返回0值*/}参考链接:
http://www.picavr.com/news/2008-07/6869.htm
铭华丶族丿主宰

2024-04-17 00:01:15

unsigned char readkey()
{
static data unsigned char old_key;
unsigned char new_key;

new_key = NOT_KEY ;

c1 = 0 ;
if( !r1 ) new_key= 1;
if( !r2 ) new_key= 4;
if( !r3 ) new_key= 7;
if( !r4 ) new_key= 0x0b;
c1 = 1;

c2 = 0 ;
if( !r1 ) new_key= 2;
if( !r2 ) new_key= 5;
if( !r3 ) new_key= 8;
if( !r4 ) new_key= 0x0a;
c2 = 1;

c3 = 0 ;
if( !r1 ) new_key= 3;
if( !r2 ) new_key= 6;
if( !r3 ) new_key= 9;
if( !r4 ) new_key= 0x0c;
c3 = 1;

if( new_key != NOT_KEY)
{
if( new_key == old_key)
{

old_key=NOT_KEY;
return new_key;
}
else
{
old_key=new_key;
return NOT_KEY;
}
}
return NOT_KEY;
}

看法 [tongliangl] 2005-7-21 22:13:23
我把汇编的改成c语言的,可是效果不好。汇编的效果很棒的,我也围着个问题发愁那!反转
法扫描
孤独儛埗

2024-04-17 08:13:25

代码
字符
代码
字符
代码
字符
代码
字符
代码
字符

32

52
4
72
H
92
\
112
p

33
!
53
5
73
I
93
]
113
q

34

54
6
74
J
94
^
114
r

35
#
55
7
75
K
95
_
115
s

36
$
56
8
76
L
96
`
116
t

37
%
57
9
77
M
97
a
117
u

38
&
58
:
78
N
98
b
118
v

39

59
;
79
O
99
c
119
w

40
(
60
<
80
P
100
d
120
x

41
)
61
=
81
Q
101
e
121
y

42
*
62
>
82
R
102
f
122
z

43
+
63
?
83
S
103
g
123
{

44
,
64
@
84
T
104
h
124
|

45
-
65
A
85
U
105
i
125
}

46
.
66
B
86
V
106
j
126
~

47
/
67
C
87
W
107
k

48
0
68
D
88
X
108
l

49
1
69
E
89
Y
109
m

50
2
70
F
90
Z
110
n

51
3
71
G
91
[
111
o

对照相应的ASCII码输出就可以了