📄 sio36.c
字号:
#include <reg51.h>
#define uchar unsigned char
uchar xdata r_buf[32]; /* item */
uchar xdata t_buf[32];
uchar r_in,r_out,t_in,t_out; /* queue pointer */
bit r_full,t_empty,t_done; /* item2 */
code uchar m[]={"this is a test program\r\n"};
serial() interrupt 4 using 1 { /* item3 */
if ( RI && ~r_full) {
r_buf[r_in]=SBUF;
RI=0;
r_in=++r_in&0x1f;
if (r_in==r_out) r_full=1;
}
else if( TI && ~t_empty) {
SBUF=t_buf[t_out];
TI=0;
t_out=++t_out&0x1f;
if (t_out==t_in) t_empty=1;
}
else if (TI) {
TI=0;
t_done=1;
}
}
void loadmsg(uchar code *msg) { /* item */
while((*msg!=0)&&((((t_in+1)^t_out)&0x1f)!=0)) {
/* test for buffer full */
t_buf[t_in]=*msg;
msg++;
t_in=++t_in&0x1f;
if(t_done) {
TI=1;
t_empty=t_done=0;
/* restart if all finished */
}
}
}
void process(uchar ch) {return;} /* item5 */
/* user define */
void processmsg(void) { /* item6 */
while(((r_out+1)^r_in)!=0) {
/* not empty */
process(r_buf[r_out]);
r_out=++r_out&0x1f;
}
}
main() { /* item7 */
TMOD=0x20; /* timer1 mode 2 */
TH1=0xfd; /* 9600 baud 11.0592MHz */
TCON=0x40; /* start time1 */
SCON=0x50; /* enable receive */
IE=0x90; /* enable serial interrupt */
t_empty=t_done=1;
r_full=0;
r_out=t_in=t_out=0;
r_in=1; /* r_buf and t_buf empty */
for (;;) {
loadmsg(&m);
processmsg();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -