blob: 43f1f7a27f445266cd56e8875c791ad6bd699b42 (
plain) (
blame)
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
|
#include "hw.h"
#define BUFSIZE 16
#define T0H 0xfc
#define T0L 0x67
unsigned char buf[BUFSIZE];
unsigned char first_free= 0, last_occupied= 0;
bit transmitting, overflow;
volatile int t0cnt;
void ser_it(void) __interrupt (4)
{
unsigned char temp;
if (RI) {
buf[first_free]= SBUF;
first_free= ((temp= first_free)+1) % BUFSIZE;
if (first_free == last_occupied) {
first_free= temp;
overflow= 1;
}
RI= 0;
}
if (TI) {
transmitting= 0;
TI= 0;
}
}
void t0_it(void) __interrupt (1)
{
TL0= T0L;
TH0= T0H;
if (t0cnt)
t0cnt--;
}
char empty(void)
{
return(first_free == last_occupied);
}
unsigned char get_ch(void)
{
unsigned char c;
c= buf[last_occupied];
last_occupied= (last_occupied+1) % BUFSIZE;
overflow= 0;
return(c);
}
void send_ch(unsigned char c)
{
while (transmitting) ;
transmitting= 1;
SBUF= c;
}
void send_str(char *str)
{
while (*str) {
send_ch(*str);
str++;
}
}
void process(void)
{
unsigned char c;
c= get_ch();
if ((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z'))
c^= 0x20;
send_ch(c);
}
void wait(int delay)
{
t0cnt= delay;
while (t0cnt)
PCON|= 1;
}
char test(char c)
{
return(c+1);
}
void main(void)
{
t0cnt= 0;
transmitting= overflow= 0;
SCON= 0x7c;
TL1= TH1= 250; /* 9600 baud */
TH0= T0H;
TL0= T0L;
TMOD= 0x21;
TR0= TR1= 1;
ES= ET0= 1;
EA= 1;
send_str("\nOK\n");
test(0);
wait(1000);
test(1);
send_str("delay off\n");
for (;;) {
if (!empty()) {
if (overflow) {
send_str("Overflow!\n");
}
process();
}
}
}
|