📄 5045_spi_c.lst
字号:
241 4 {if(flag_k12_first==1)
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 5
242 5 {
243 6 Addr--;
244 6 ChangeAdr(Addr);
245 6 QdorYsh=20;
246 6 }
247 5 else
248 5 {
249 6 Addr--;
250 6 ChangeAdr(Addr);
251 6 flag_k12_first=1;
252 6 QdorYsh=200;
253 6 }
254 5 }
255 4 else
256 4 {if(flag_k12_first==1)
257 5 {
258 6 Data--;
259 6 ChangeData(Data);
260 6 QdorYsh=20;
261 6 }
262 5 else
263 5 {
264 6 Data--;
265 6 ChangeData(Data);
266 6 flag_k12_first=1;
267 6 QdorYsh=200;
268 6 }
269 5 }
270 4 flag_k=0;
271 4 break;
272 4 case 0x2c: //K3键处理程序
273 4 P1_5=1; //再一次有键按下,P1_5LED熄灭
274 4 if(flag_k3_first==1)
275 4 ;
276 4 else
277 4 flag_k3_first=1;
278 4 DorW=~DorW; //读或写位取反,显示也取反
279 4 P1_0=~DorW;
280 4 P1_1=DorW;
281 4 flag_k=0; //键盘处理完
282 4 break;
283 4 case 0x1c: //K4键处理程序
284 4 if(flag_k4_first==1)
285 4 {
286 5 K4_Count++;
287 5 // flag_k=0;
288 5 }
289 4 else
290 4 {
291 5 flag_k4_first=1;
292 5 K4_Delay=25; //延时判断功能的设置,根据具体的实验板实验而得
293 5 K4_Count=0x01;}
294 4 // flag_addr_data=~flag_addr_data;
295 4 flag_k=0;
296 4 break;
297 4 default:
298 4 break;
299 4 }
300 3 }
301 2 else
302 2 {
303 3 flag_k=1;
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 6
304 3 flag_k_enter=1; //设置有键按下标志
305 3 QdorYsh=2; //延时去抖设计时间
306 3 }
307 2 }
308 1 else
309 1 {
310 2 if(flag_k_enter==1)
311 2 {
312 3 flag_k=0;
313 3 flag_k12_first=0;
314 3 flag_k3_first=0;
315 3 // flag_k4_first=0;
316 3 flag_k_enter=0;
317 3 }
318 2 // else
319 2 // ;
320 2 }
321 1 }
322 /***************地址字节变换***********/
323 void ChangeAdr(unsigned char Adr)
324 {
325 1 uchar i,j;
326 1 i=Adr/16;
327 1 j=Adr%16;
328 1 DisData[0]=GYshjzh[i]; //将要显示字符的地址送给指针
329 1 DisData[1]=GYshjzh[j];
330 1 }
331 /***************数据字节变换***********/
332 void ChangeData(unsigned char Data)
333 {
334 1 uchar i,j;
335 1 i=Data/16;
336 1 j=Data%16;
337 1 DisData[4]=GYshjzh[i]; //将要显示字符的地址送给指针
338 1 DisData[5]=GYshjzh[j];
339 1 }
340 /******************显示子程序********************/
341 void Display(void)
342 { if(ds>6)
343 1 {
344 2 P2=DisBit[ds-6];
345 2 }
346 1 else{
347 2 P2=DisBit[ds];}
348 1 P0=DisData[ds];
349 1 mDelay(10);
350 1 ds++;
351 1 if(ds==0x0c) //显示位超出LED显示范围
352 1 ds=0;
353 1 }
354 /**************************************************
355 函数名称: SPISendByte
356 入口参数: ch
357 函数功能: 发送一个字节
358 ****************************************************/
359 void SPISendByte(unsigned char ch)
360 {
361 1 unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
362 1 SCK = 1 ; //时钟置高
363 1 CS = 0 ; //选择从机
364 1
365 1 while(n--)
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 7
366 1 {
367 2 delayNOP();
368 2 SCK = 0 ; //时钟置低
369 2 if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
370 2 {
371 3 MOSI = 1; // 传送位1
372 3 }
373 2 else
374 2 {
375 3 MOSI = 0; // 否则传送位0
376 3 }
377 2 delayNOP();
378 2 ch = ch<<1; // 数据左移一位
379 2 SCK = 1 ; //时钟置高
380 2 }
381 1 }
382 /**************************************************
383 函数名称: SPIreceiveByte
384 返回接收的数据
385 函数功能: 接收一字节子程序
386 ***************************************************/
387 unsigned char SPIreceiveByte()
388 {
389 1 unsigned char idata n=8; // 从MISO线上读取一上数据字节,共八位
390 1 unsigned char tdata;
391 1 SCK = 1; //时钟为高
392 1 CS = 0; //选择从机
393 1 while(n--)
394 1 {
395 2 delayNOP();
396 2 SCK = 0; //时钟为低
397 2 delayNOP();
398 2 tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
399 2 if(MISO == 1)
400 2 tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
401 2 else
402 2 tdata = tdata&0xfe; // 否则数据的最后一位置0
403 2 SCK=1;
404 2 }
405 1 return(tdata);
406 1 }
407 /************延时子程序***********/
408 void mDelay(unsigned char Delay)
409 {
410 1 unsigned char i;
411 1 for(;Delay>0;Delay--)
412 1 {
413 2 for(i=0;i<124;i++)
414 2 {;}
415 2 }
416 1 }
417 /**************读状态寄存器*******************
418 unsigned char ReadStatus(void)
419 {
420 unsigned char i;
421 SPISendByte(RDSR);
422 i=SPIreceiveByte();
423 CS=1;
424 delayNOP();
425 return(i);
426 }
427 ***********写状态寄存器*******************/
C51 COMPILER V7.50 5045_SPI_C 05/10/2009 09:56:48 PAGE 8
428 void WriteStatus(void)
429 {
430 1 SPISendByte(WREN);
431 1 CS=1;
432 1 delayNOP(); //如果CS不变高,下面的写WRSR操作会被忽略
433 1 SPISendByte(WRSR);
434 1 SPISendByte(0x33); //写状态寄存器,不保护写地址,不设置看门狗
435 1 CS=1; //解除对5045的选择
436 1 delayNOP();
437 1 }
438 /**************从EEProm中读取数据************************/
439 unsigned char ReadEEP(void)
440 { unsigned char i;
441 1 SPISendByte(READ_L);
442 1 SPISendByte(Addr);
443 1 i=SPIreceiveByte();
444 1 CS=1; //解除对5045的选择
445 1 delayNOP();
446 1 return(i);
447 1 }
448 /**************向EEProm写入数据***************************/
449 void WriteEEP(void)
450 {
451 1 SPISendByte(WREN);
452 1 CS=1;
453 1 delayNOP(); //理由同写状态寄存器
454 1 SPISendByte(WRITE_L);
455 1 SPISendByte(Addr);
456 1 SPISendByte(Data);
457 1 CS=1; //解除对5045的操作
458 1 delayNOP();
459 1 }
460 /************检测写操作**********************************
461 bit CheakWrite(void)
462 {
463 unsigned char j;
464 j=ReadStatus();
465 CS=1; //解除对5045的选择
466 delayNOP();
467 if((j&0x01)==0)
468 return(0); //表示闲,可以写入数据,写数据前需检查其闲或忙的状态
469 else
470 return(1); //表示忙,须等待
471 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 716 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = 12 2
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -