-
Notifications
You must be signed in to change notification settings - Fork 0
/
timer.c
130 lines (117 loc) · 2.92 KB
/
timer.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
#include "timer.h"
#include "lcd1602.h"
#include <REGX51.H>
//TimerSetting g_ts[2] = {0};
TimerCallback t0_callback = 0;
unsigned int t0_rate_counts = 0; // 定时器设置频率,hz
TimerCallback t1_callback = 0;
unsigned int t1_rate_counts = 0; // 定时器设置频率,hz
void TimerInit(unsigned char index, unsigned int rate_hz, TimerCallback fun_ptr)
{
if (index == 0)
{
Timer0Init(rate_hz, fun_ptr);
}
else
{
Timer1Init(rate_hz, fun_ptr);
}
}
void Timer0InitRaw()
{
// 时钟设置
TF0 = 0; // time overflow
// 定时器模式
TMOD &= 0xf0;
TMOD |= 0x01;
// 初始计数值
TL0 = 64535 % 0xff;
TH0 = 64535 / 0xff;
// 设置允许中断
ET0 = 1;
EA = 1;
PT0 = 0; // 默认即为最低优先级
TR0 = 1; // timer run
}
void Timer0Init(unsigned int rate_hz, TimerCallback fun_ptr)
{
t0_rate_counts = 1000 / rate_hz;
// 时钟设置
TF0 = 0; // time overflow
TR0 = 1; // timer run
// 定时器模式
TMOD &= 0xf0;
TMOD |= 0x01;
// 初始计数值
TL0 = 64535 % 0xff;
TH0 = 64535 / 0xff;
// 设置允许中断
ET0 = 1;
EA = 1;
PT0 = 0; // 默认即为最低优先级
// 设定中断回调函数
t0_callback = fun_ptr;
}
//void TimerInitWithSetting(TimerSetting *ts)
//{
// // 保存全局配置
// g_ts[ts->index_] = *ts;
// // 设置定时器
//}
// 单次进入为1ms
// void OnTimer0() interrupt 1
// {
// static unsigned int count = 0;
// TF0 = 0;
// TL0 = 64535 % 0xff;
// TH0 = 64535 / 0xff;
// if ((++count % t0_rate_counts) == 0)
// {
// t0_callback();
// }
// }
void Timer1Init(unsigned int rate_hz, TimerCallback fun_ptr)
{
t1_rate_counts = 1000 / rate_hz;
// 时钟设置
TF1 = 0;
TR1 = 1;
// 定时器模式
TMOD &= 0x0f;
TMOD |= 0x10;
// 初始计数值
TL1 = 64535 % 0xff;
TH1 = 64535 / 0xff;
// 设置允许中断
ET1 = 1;
EA = 1;
PT1 = 0; // 默认即为最低优先级
// 设定中断回调函数
t1_callback = fun_ptr;
}
void OnTimer1() interrupt 3
{
static unsigned int count = 0;
TF1 = 0;
TL1 = 64535 % 0xff;
TH1 = 64535 / 0xff;
if ((++count % t1_rate_counts) == 0)
{
t1_callback();
}
}
// void LED0() { P2_0 = ~P2_0; }
// void LED1() { P2_1 = ~P2_1; }
// void TimerDemo0() // 通过两个定时器使LED0,1以不同频率闪烁
// {
// TimerInit(TimerIndex0, 1, LED0);
// TimerInit(TimerIndex1, 5, LED1);
// }
// unsigned int number = 0;
// void UpdateData() { ++number; }
// void UpdateView() { LCD_ShowNum(1, 1, number, 5); }
// void TimerDemo1() // 通过两个定时器,一个高频更新数据,一个低频刷新显示
// {
// TimerInit(TimerIndex0, 10, UpdateData);
// TimerInit(TimerIndex1, 1, UpdateView);
// }