forked from MetalSeed/stc51_demo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path4.3.c
143 lines (137 loc) · 3.06 KB
/
4.3.c
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
/********************************************************************
* 文件名 : 独立按键.c
* 描述 : 这个代码相对于初学者比较麻烦一些。
在数码管上显示全是0.
当按下S18,这个时候是选择某一位数码管,数码管会稍微亮一些。
当按下S19或S17, 这时被选择的那位数码管可以进行加减控制。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
//数码管的段码编码
uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar SLED[8]={0};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 16ms * del ,
在延时函数中加入了数码管的操作,
这样按下按键后延时,数码管不会闪烁。
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uchar temp)
{
uchar i,j;
for(j=0;j<temp;j++)
{
for(i=0;i<8;i++)
{
P0 = 0;
P2 = i;
P0 = table[SLED[i]];
Delay_1ms(2);
}
}
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay(2); //20毫秒软件防抖
if(KEY1 == 0)
{
Delay(10);
return 1;
}
if(KEY2 == 0)
{
Delay(10);
return 2;
}
if(KEY3 == 0)
{
Delay(10);
return 3;
}
Delay(10);
return 0;
}
return 0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar temp,i=0,j=0,cs=0;
while(1)
{
temp = KEY();
if(temp == 1)
{
if(SLED[cs] != 0)
{
SLED[cs] = SLED[cs] - 1; //被选数码管的值减1
}
}
if(temp == 2)
{
if(cs != 7)
{
cs++; //被选数码管右移一位
}
else
{
cs = 0;
}
}
if(temp == 3)
{
if(SLED[cs] != 9)
{
SLED[cs] = SLED[cs] + 1; //被选数码管的值加1
}
}
for(i=0;i<8;i++)
{
if(i != cs)
{
P0 = 0;
P2 = i;
P0 = table[SLED[i]];
Delay_1ms(1);
}
else //如果是被选择的那个数码管,进入下面控制
{
P0 = 0;
P2 = i;
P0 = table[SLED[i]];
Delay_1ms(10); //延时时间长一点,这时,数码管更亮
}
}
}
}