历史上的今天
返回首页

历史上的今天

今天是:2024年11月24日(星期日)

正在发生

2021年11月24日 | C51键盘检测相关问题总结

2021-11-24 来源:eefocus

附注:

原理图各接口连接关系可参考代码中的端口定义;

P0口数据锁存器为两片74HC573芯片;

1.对独立键盘的检测


/*--------------------------

功能:用数码管实现60s计时器

上电时,数码管显示00

key4控制开始/暂停计时

暂停状态下,key1进行加1操作

key2进行减1操作

key3进行清零操作

---------------------------

Author: Zhang Kaizhou

Date: 2019-5-19 19:14:20

--------------------------*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit key1 = P3^4;

sbit key2 = P3^5;

sbit key3 = P3^6;

sbit key4 = P3^7;

sbit wei_address = P2^7;

sbit duan_address = P2^6;

uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f,

  0x66, 0x6d, 0x7d, 0x07,

      0x7f, 0x6f, 0x77, 0x7c,

      0x39, 0x5e, 0x79, 0x71}; // 定义一个无符号字符型数组table[],存放在单片机内部的ROM或Flash中


uchar n1 = 0, n2 = 0;

void init();

void display(uchar num);

void keyScan();

void delay(uchar xms);

void main()

{

init();

while(1)

{

keyScan();

display(n1);

}

}


/*初始化函数*/

void init()

{

TMOD = 0x01; // 定时器0,方式1

TH0 = (65536 - 45872) / 256; // 定时50ms

TL0 = (65536 - 45872) % 256;

EA = 1; // 开全局中断

ET0 = 1; // 开定时器0溢出中断

}


/*定时器0中断服务程序*/

void T0_interrupt() interrupt 1

{

TH0 = (65536 - 45872) / 256; // 定时器0重装初值

TL0 = (65536 - 45872) % 256;

n2++;

if(n2 == 20) // 定时到1s

{

n2 = 0;

n1++;

if(n1 == 60)

{

n1 = 0;

}

}

}


/*数码管显示函数*/

void display(uchar num)

{

uchar shi, ge;

shi = num / 10;

ge = num % 10;

duan_address = 1; // 在数码管上显示十位的数字

P0 = table[shi];

duan_address = 0;

P0 = 0xff;

wei_address = 1;

P0 = 0xfe;

wei_address = 0;

delay(5);

duan_address = 1; // 在数码管上显示个位的数字

P0 = table[ge];

duan_address = 0;

P0 = 0xff;

wei_address = 1;

P0 = 0xfd;

wei_address = 0;

delay(5);

}


/*键盘扫描函数*/

void keyScan()

{

if(!key1) // key1按下,加1

{

delay(10);

if(!key1) 

{

n1++;

if(n1 == 60)

{

n1 = 0;

}

while(!key1);

}

}

if(!key2) // key2按下,减1

{

delay(10);

if(!key2) 

{

if(!n1)

{

n1 = 60;

}

n1--;

while(!key2);

}

}

if(!key3) // key4按下,暂停或开始定时器0

{

delay(10);

if(!key3) 

{

n1 = 0;

while(!key3);

}

}

if(!key4)

{

delay(10);

if(!key4)

{

while(!key4);

TR0 = ~TR0;

}

}

}


/*延时函数*/

void delay(uchar xms)

{

uchar i, j;

for(i = 0; i < xms; i++)

for(j = 0; j < 110; j++);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

2.对矩阵键盘进行扫描


/*------------------------

功能:扫描4x4矩阵键盘

Author: Zhang Kaizhou

Date: 2019-5-21 21:37:31

-------------------------*/

#include

#define uchar unsigned char

sbit wei_address = P2^7;

sbit duan_address = P2^6;


uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f,

  0x66, 0x6d, 0x7d, 0x07,

        0x7f, 0x6f, 0x77, 0x7c,

  0x39, 0x5e, 0x79, 0x71}; // 定义一个无符号字符型数组table[],存放在单片机内部的ROM或Flash中


uchar buffer, key;

void init_digitron();

void array_scan_oneline(uchar address);

void array_scan();

void display(uchar key);

void delay(uchar xms);

void main()

{

init_digitron(); // 初始化数码管

while(1) // 循环逐行扫描按键是否按下

{

array_scan();

}

}


/*数码管初始化函数*/

void init_digitron()

{

P0 = 0; // 关闭所有数码管

duan_address = 1;

duan_address = 0;

P0 = 0x00; // 选中所有数码管

wei_address = 1;

wei_address = 0;

}


/*矩阵键盘扫描函数*/

void array_scan()

{

array_scan_oneline(0xfe);

array_scan_oneline(0xfd);

array_scan_oneline(0xfb);

array_scan_oneline(0xf7);

}


/*矩阵键盘扫描一行的函数*/

void array_scan_oneline(uchar address)

{

P3 = address;

buffer = P3;

buffer = buffer & 0xf0;

if(buffer != 0xf0) // 有键按下

{

delay(10); // 消抖

buffer = P3;

buffer = buffer & 0xf0;

if(buffer != 0xf0)

{

buffer = P3;

switch(buffer)

{

case 0xee: key = 0; break;

case 0xde: key = 1; break;

case 0xbe: key = 2; break;

case 0x7e: key = 3; break;

case 0xed: key = 4; break;

case 0xdd: key = 5; break;

case 0xbd: key = 6; break;

case 0x7d: key = 7; break;

case 0xeb: key = 8; break;

case 0xdb: key = 9; break;

case 0xbb: key = 10; break;

case 0x7b: key = 11; break;

case 0xe7: key = 12; break;

case 0xd7: key = 13; break;

case 0xb7: key = 14; break;

case 0x77: key = 15; break;

}

while(buffer != 0xf0) // 等待按键释放

{

buffer = P3;

buffer = buffer & 0xf0;

}

display(key);

}

}

}


/*延时函数*/

void delay(uchar xms)

{

uchar i, j;

for(i = 0; i < xms; i++)

for(j = 0; j < 110; j++);

}


/*数码管显示函数*/

void display(uchar key)

{

P0 = table[key];

duan_address = 1;

duan_address = 0;

}

推荐阅读

史海拾趣

Corsair Memory Inc公司的发展小趣事

Corsair Memory Inc公司,由Don Lieberman、John Beekley与Andy Paul于1994年在美国加州佛利蒙创立。起初,公司专注于为英特尔系统生产Cache-On-A-Stick (COAST)模组。然而,随着英特尔将快取内存由主板移至处理器晶体中,Corsair迅速调整战略,将注意力转向电脑内存市场。这一转变不仅使Corsair避开了潜在的市场风险,更为其后续的内存业务奠定了坚实的基础。

统宇电研(Coilmaster)公司的发展小趣事

随着电子行业的快速发展,统宇电研始终保持着技术创新的步伐。公司不断投入研发资源,积极引进先进技术和设备,提升产品性能和质量。同时,统宇电研还与多所高校和研究机构建立合作关系,共同开展前沿技术研究。这些努力使得统宇电研在行业内树立了技术创新的标杆,引领着行业的发展方向。

Anvo-Systems公司的发展小趣事

Anvo-Systems在发展过程中始终注重企业文化建设和社会责任履行。公司倡导创新、协作、诚信的企业精神,为员工创造了一个积极向上的工作环境。同时,Anvo-Systems还积极参与社会公益活动,关注环保和可持续发展等问题。通过这些举措,Anvo-Systems不仅提升了企业的社会形象,也为社会的和谐发展做出了积极贡献。


请注意,以上故事纯属虚构,不代表现实中任何公司或行业的真实情况。在实际应用中,应根据具体公司的历史和发展情况进行调整和完善。

Gamma Microelectronics ( APM )公司的发展小趣事

G24i在发展过程中始终注重国际合作与市场拓展。公司董事长Mr. Edward J Stevenson及其团队多次访问国内外知名科研机构和企业,就DSSC技术的研发、产业化等方面进行深入交流。同时,G24i还积极参加国际太阳能展会和论坛,展示其最新的技术成果和产品应用。这些努力不仅提升了G24i在国际市场上的知名度和影响力,也为公司赢得了更多的合作机会和市场份额。通过国际合作与市场拓展,G24i正逐步成为全球DSSC领域的领军企业之一。

BUSSMANN公司的发展小趣事

1985年,库柏工业收购了Bussmann公司,成立了新的事业部——“Cooper Bussmann熔断器”。这一收购为Bussmann带来了更广阔的市场和更多的资源,同时也带来了新的挑战和机遇。在库柏工业的支持下,Bussmann开始了更加积极的创新和市场拓展,逐渐成为了全球熔断器行业的领导者。

BSI公司的发展小趣事

在全球化的背景下,电子行业的国际合作日益加强。BSI作为国际标准化组织的重要成员,积极推动了电子行业的国际合作和交流。通过组织国际会议、研讨会等活动,BSI为各国政府、行业协会和企业提供了一个交流和合作的平台。这些活动不仅促进了电子行业的国际合作和交流,还推动了电子行业的全球化发展。

虽然以上并非具体的发展故事,但通过这些描述,可以看出BSI在电子行业发展中扮演了重要角色,通过标准制定、产品测试与认证、推动绿色发展、支持技术创新以及促进国际合作等方式,为电子行业的健康发展做出了积极贡献。如需更多关于BSI公司具体发展故事的信息,建议查阅公司官方发布的资料或相关新闻报道。

问答坊 | AI 解惑

大赛有好的测速方案

各位GG,MM大家测速都用什么方案啊,有意的交流下,呵呵…… 流传有很多小车题目,觉得可行吗 本人认为爬坡的可能性很大 有意的交流下哈………

查看全部问答>

帮忙具体分析一下这个开关电源

此开关电源属于复合式开关电源,采用TL431的精密基准和PC817组成反馈电路。整个工作过程:交流输入经滤波、整流后成为直流高压,再由功率开关管斩波、高频变压器降压后得到高频矩形波电压,最后经过输出整流滤波器,获得所需要的直流输出电压。此开 ...…

查看全部问答>

如何简化开关电源设计

中心议题: 如何简化[url=]开关[/url]电源设计解决方案: 性能评估电气仿真与热仿真测试原型电源设计的思路 过去15年来,开关电源的设计逐渐成为主流。现在,开关电源的设计已不再是专家的任务,任何参与系统设计的人员都能够最终设计出自己的开关 ...…

查看全部问答>

在WinCE6.0操作系统上,用户如何注册自已的动态库

在WinCE6.0操作系统上,用户如何注册自已的动态库(像XP系统上一样regsvr32.exe \\xxx\\XXX.dll )…

查看全部问答>

wince下的thread message丢失问题?

这样的 线程A不停地malloc数据,通过PostThreadMessage()把数据块的指针发送给另外一个线程。 线程B while地GetMessage(),将数据块保存至文件,并free掉。 现在发现这样做的情况下,会发生内存泄露,后来我设置了一个变量,每次PostThreadMessa ...…

查看全部问答>

EVC 开发 设计提示声音

我现在设计串口数据采集程序,希望每次数据采集完后能发出想MESSAGEBOX弹出的提示声音,请教各位该如何设计?…

查看全部问答>

www.kingofcoder.com --- 编程文章网

www.kingofcoder.com --- 编程文章网 …

查看全部问答>

MSP430F2274 ADC10模块_ADC10介绍

模块实现了一个10位SAR核、采样选择控制、参考电压发生器和数据传输控制器。 数据传输控制器DTC可以将ADC采样结果存储在内存的任何位置。 ADC10特点: l         高于20万次/秒的转换速率; l &n ...…

查看全部问答>

求助啊

最近搞这个LPCXpresso这个软件,发现要自己添加头文件的,麻烦啊,不知哪位有关于LPC1343的一些头文件库,可否共享一下,谢谢…

查看全部问答>