×
单片机 > 单片机程序设计 > 详情

51单片机-按键部分(3)

发布时间:2020-06-19 发布时间:
|

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


#define uchar unsigned char
#define uint unsigned int
sbit dula = P2 ^ 6;//定义位选IO口
sbit wela = P2 ^ 7;//定义段选IO口
sbit s2 = P3 ^ 4;//按键IO口
sbit s3 = P3 ^ 5;
sbit s4 = P3 ^ 6;
sbit s5 = P3 ^ 7;
uchar num, num1, num2, num3, a, b, flag;
uint aa;
uchar code table[] =
{
    //0   1    2    3
    0x3f, 0x06, 0x5b, 0x4f,
    //4   5    6    7
    0x66, 0x6d, 0x7d, 0x07,
    //8   9    A    B
    0x7f, 0x6f, 0x77, 0x7c,
    //C   D    E    F
    0x39, 0x5e, 0x79, 0x71,
};//数码管编码
void display(uchar number);
void delay(uchar z);
void chushihua();
void main()
{
    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; //启动或者暂停

        }

    }
}
void t0t() interrupt 1//中断函数
{
    TH0 = (65536 - 50000) / 256;//重新装初值的高八位
    TL0 = (65536 - 50000) % 256;//重新装初值的低八位
    num++;//计数器加一
    if(num == 20)//二十个中断
    {
        num = 0;//将中断周期清零
        aa++;//数码管数字加一
        if(aa == 60)//数码管数字溢出判定
            aa = 0;//数码管数字清零
    }

}
void display(uchar number)//显示函数
{
    uchar a, 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);//个位的显示
}
void delay(uchar z)//延时函数
{
    uchar x, y;
    for(x = z; x > 0; x--)
        for(y = 110; y > 0; y--);
}
void chushihua()//初始化函数
{
    TMOD = 0x01;//设定定时器工作模式
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;//定时器赋初值
    EA = 1;//打开总中断
    ET0 = 1;//打开定时器中断0
    // TR0 = 1;//打开定时器0
}


关键字:51单片机  按键部分 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式