C51 4*4键盘扫描程序(c语言)
发布网友
发布时间:2022-05-20 01:29
我来回答
共3个回答
热心网友
时间:2023-10-22 01:12
键盘为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
热心网友
时间:2023-10-22 01:13
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语言的,可是效果不好。汇编的效果很棒的,我也围着个问题发愁那!反转
法扫描
热心网友
时间:2023-10-22 01:13
代码
字符
代码
字符
代码
字符
代码
字符
代码
字符
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码输出就可以了
C51 4*4键盘扫描程序(c语言)
先显示第一位,延时一定时间后在显示第二位依次类推。。。 共有17个按键。按下按键后数码管显示相应的数字,并左移一位。uchar kbscan(void) /*键扫描函数*/{uchar j; uchar sccode,recode; P2=0x0f; /*发0行扫描码*/ if((P2 & 0x0f)!= 0x0f) /*若有键按...
关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误...
功能: P1外接4×4按键, 按照扫描法读出键值 输出: 按键值0~15/如无键按下, 返回16 / uchar Keyscan(void){ uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};for(j = 0; j < 4; j++) { //循环四次 P1 = Buffer[j]; //在P1高四位分别输出一个低电平 te...
C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示...
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、...
按键扫描的keil.c51程序
//第一部份,用扫描来读取键盘,j=0xfe;key=0xff;//设定初值 for (i=0;i<4;i++){ P0=j;//P0口低4位循环输出0,扫描键盘 //leday();if ((P0&0xf0)!=0xf0){//如果有键按下,P0口高4位不会全为1,key=P0;//读取P0口,退出循环,否则循环下次 break;} j=_crol_(j,1);/...
C51单片机,C语言编程四位共阳极数码管静态显示1234 求程序和proteus仿真...
用51单片机组成四位共阳极数码管显示1234 ,proteus仿真图如下所示,P0口输出段码,P2口输出位码。
请问大家:C语言和C51有什么区别?
(1)含义不同:1、C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。2、C51是nVIDIA公司推出的首款K8平台整合芯片组的产品系列代号,使用C51系列芯片组的北桥芯片分为两个版本:GeForce6150和GeForce6100,它们与Nforce 400系列的南桥芯片...
怎么用C语言/C51程序实现单片机按键长按开机与长按关机?
软件:首先是长按判断。这个最好用按键扫描。就是检测按键按下时候,定时器计时,如果松开就立即清零。在设置一个功能函数检测定时值,大于两秒后,就表示长按。按键按下单片机供电开始计时,如果达到长按标准,就输出引脚控制持续供电,这时候按键松了也不会断电。运行期间,按键再次按下并符合长按,那木...
用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器...
用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。用proteus做的时钟 可以显示年月日时分秒 可调整时间 有图 / includereg52.h
C51和标准C语言的主要差别是什么?
c51是标准c的扩展,使用专用的编译器,如keil与franklin等;c51特有的有以下几点,可能不全:bit型变量,bdatacodexdatapdataidata存储类型控制字,interrupt中断函数,最主要的是c51主要面向的是硬件,程序的编写思路与标准c差别很大。
用KIEL-C51的C语言编写一个键盘的管理程序,每个按键必须占用一根I/O线...
void main(){ if((S0==0)&(S1!=0)&(S2!=0)) function_SE();else if ((S0!=0)&(S1==0)&(S2!=0)) function_SR();else if ((S0!=0)&(S1!=0)&(S2==0)) function_ST();} void function_SE(){ } void function_SR(){ } void function_ST(){ } ...