📄 serial.lst
字号:
80 ********************************************************************/
81 //
82 uchar getchar(void)
83 {
84 1 idata uchar c,c1,i,j;
85 1 idata uchar ch1,ch2,ch3;
86 1 bit iskey=0;
87 1 idata uchar t=0;//延时
88 1 uchar code dout[4]={0x7f,0xbf,0xdf,0xef};
89 1 uchar code key[4][4]={{'1','5','9','s'},{'2','6','0','f'},{'3','7','e',0x08},{'4','8','d',0x0d}};
90 1 while(1)
91 1 {
92 2 re_scan: for(i=0;i<4;i++)
C51 COMPILER V6.23a SERIAL 08/24/2003 16:21:16 PAGE 4
93 2 {
94 3 P1=dout[i];//01111111,0x7f
95 3 //10111111,0xbf
96 3 //11011111,0xdf
97 3 //11101111,0xef
98 3 c=P1&0x0f;
99 3 if(c!=0x0f)
100 3 {
101 4 if(!(c&0x01)) j=0; //00001110
102 4 else if(!(c&0x02))j=1; //00001101
103 4 else if(!(c&0x04))j=2; //00001011
104 4 else if(!(c&0x08))j=3; //00000111
105 4 c1=(key[i][j]);
106 4 iskey=1;
107 4 if(t==220)
108 4 ch1=c1;
109 4 if(t==230)
110 4 ch2=c1;
111 4 if(t==240)
112 4 ch3=c1;
113 4 }
114 3 }
115 2 t++;
116 2 if(t==0xff)
117 2 if(iskey)
118 2 {
119 3 if((ch1!=ch2)||(ch2!=ch3)||(ch3!=c1))
120 3 {
121 4 t=0;iskey=0;
122 4 goto re_scan;
123 4
124 4 }
125 3 else
126 3 return(c1);
127 3 }
128 2 }
129 1 }
130
131 //*****************************
132 /*放入一个字节到发送缓冲区
133 putbyte(unsigned char c)
134 {
135 SBUF=c;
136 while(!TI);
137 TI=0;
138 }
139 */
140 //******************************
141 /*放n个字节数据到发送缓冲区
142 putbytes(uchar *outplace,uint j)
143 { int i;
144 for(i=0;i<j;i++)
145 {
146 putbyte(*outplace);
147 outplace++;
148 }
149 }
150 */
151 //***************************************
152 /*发送一个定义在程序存储区的字符串到串口
153 putstring(uchar *puts)
154 {
C51 COMPILER V6.23a SERIAL 08/24/2003 16:21:16 PAGE 5
155 for(;*puts!=0;puts++) //遇到停止符0结束
156 putbyte(*puts);
157 }
158 */
159 //*************************************
160 /*发送一个字节的hex码,分成两个字节发。
161 uchar code hex_[]={"0123456789ABCDEF"};
162 puthex(unsigned char c)
163 {
164 int ch;
165 ch=(c>>4)&0x0f;
166 putbyte(hex_[ch]);
167 ch=c&0x0f;
168 putbyte(hex_[ch]);
169 }
170 */
171 //*************************************
172 //从接收缓冲区取一个byte,在调用前检测inbufsign是否为1。
173 char getbyte (void)
174 {
175 1 char idata c ;
176 1 while (!inbufsign); //缓冲区空等待
177 1 ES=0;
178 1 c= *getlast; //取数据
179 1 getlast++; //最后取走的数据位置加一
180 1 inbufful=0; //输入缓冲区的满标志清零
181 1 if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
182 1 if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
183 1 ES=1;
184 1 return (c); //取回数据
185 1 }
186 //*****************************************
187 //串口中断处理
188
189 serial () interrupt 4
190 {
191 1 if (RI)
192 1 {
193 2 RI = 0;
194 2 if(!inbufful)
195 2 {
196 3 *inlast= SBUF; //放入数据
197 3 inlast++; //最后放入的位置加一
198 3 inbufsign=1;
199 3 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
200 3 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
201 3 }
202 2 }
203 1 }
204
205 //*****************************
206 //串口初始化 0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200 110592
207 void serial_init (void)
208 {
209 1 //用t1作波特率
210 1
211 1 SCON = 0x50; // mode 1: 8-bit UART, enable receiver
212 1 TMOD |= 0x20; // timer 1 mode 2: 8-Bit reload
213 1 //SCON1 = 0x70;
214 1 //PCON |= 0x80;
215 1 TH1 = 0xfa;//fa, //baud*2 /* reload value 19200 baud
216 1 TR1 = 1; // timer 1 run
C51 COMPILER V6.23a SERIAL 08/24/2003 16:21:16 PAGE 6
217 1 //用t2作波特率
218 1 /*
219 1 T2CON=0x30;
220 1 RCAP2H=0xFF;
221 1 RCAP2L=0xb8;//70=4800,b8=9600,dc=19200,ee=38400,f4=57600,fa=115200
222 1 TR2=1;ET2=1;
223 1 SCON=0x50;//SCON=0xd0;
224 1 */
225 1
226 1 ES = 1;
227 1 REN=1;
228 1 EA=1;
229 1 SM2=1; //SM2=1时收到的第9位为1才置位RI标志
230 1
231 1 //TMOD |=0x01; //th1 auto load 2X8,th0 1X16
232 1 //TH0=31; TL0=0; //X 32 =1S
233 1 //TR0=1; ET0=1;
234 1 //putstring("com is ready!");
235 1 }
236 //*****************
237
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 310 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = 36 9
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -