51单片机-按键部分(3)
扫描二维码
随时随地手机看文章
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
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;//定义位选IO口
sbitwela=P2^7;//定义段选IO口
sbits2=P3^4;//按键IO口
sbits3=P3^5;
sbits4=P3^6;
sbits5=P3^7;
ucharnum,num1,num2,num3,a,b,flag;
uintaa;
ucharcodetable[]=
{
//0123
0x3f,0x06,0x5b,0x4f,
//4567
0x66,0x6d,0x7d,0x07,
//89AB
0x7f,0x6f,0x77,0x7c,
//CDEF
0x39,0x5e,0x79,0x71,
};//数码管编码
voiddisplay(ucharnumber);
voiddelay(ucharz);
voidchushihua();
voidmain()
{
while(1)//程序一直运行
{
display(aa);//数码管先运行
if(s2==0)//判断是否S2是否按下
delay(10);//延时10ms消抖
if(s2==0)//再判断
{
TR0=0;
aa++;
if(aa==60)//到了设定时间就重置
aa=0;
while(!s2);//抬手检测
}
if(s3==0)//判断是否S3是否按下
delay(10);//延时10ms消抖
if(s3==0)//再判断
{
while(!s3);//抬手检测
TR0=0;
if(aa==0)//到了设定时间就重置
aa=60;
aa--;
}
if(s4==0)//判断是否S4是否按下
delay(10);//延时10ms消抖
if(s4==0)//再判断
{
while(!s4);//抬手检测
aa=0;
TR0=0;
}
if(s5==0)//判断是否S4是否按下
delay(10);//延时10ms消抖
if(s5==0)//再判断
{
while(!s5);//抬手检测
chushihua();//初始化函数
TR0=~TR0;//启动或者暂停
}
}
}
voidt0t()interrupt1//中断函数
{
TH0=(65536-50000)/256;//重新装初值的高八位
TL0=(65536-50000)%256;//重新装初值的低八位
num++;//计数器加一
if(num==20)//二十个中断
{
num=0;//将中断周期清零
aa++;//数码管数字加一
if(aa==60)//数码管数字溢出判定
aa=0;//数码管数字清零
}
}
voiddisplay(ucharnumber)//显示函数
{
uchara,b;
a=number/10;//十位
b=number%10;//个位
dula=1;
P0=table[a];
dula=0;
P0=0Xff;
wela=1;
P0=0xfe;
wela=0;
P0=0XFF;
delay(5);//十位的显示
dula=1;
P0=table[b];
dula=0;
P0=0XFF;
wela=1;
P0=0xfd;
wela=0;
P0=0XFF;
delay(5);//个位的显示
}
voiddelay(ucharz)//延时函数
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidchushihua()//初始化函数
{
TMOD=0x01;//设定定时器工作模式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时器赋初值
EA=1;//打开总中断
ET0=1;//打开定时器中断0
//TR0=1;//打开定时器0
}