標(biāo)題: stm8 SPI雙機通信主設(shè)備與從設(shè)備源碼 [打印本頁]

作者: 叫我紅領(lǐng)巾    時間: 2018-7-30 21:38
標(biāo)題: stm8 SPI雙機通信主設(shè)備與從設(shè)備源碼
主機使用8S103F3 帶兩個按鍵用于加1和減1操作(范圍0-99)
叢機使用8S208MB 帶1602液晶用于顯示當(dāng)前數(shù)值
注意兩個機子要共地處理
圖片顯示的是實際效果


SPI主設(shè)備 - 8S103F3源碼見附件
SPI從設(shè)備 - 8S208MB 單片機源程序如下:
  1. /********接收到的數(shù)據(jù)通過1602顯示  倆設(shè)備要共地******************/

  2. #include"iostm8s208mb.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define LCD_EN PF_ODR_ODR4
  6. #define LCD_RS PF_ODR_ODR0
  7. #define LCD_DATA PB_ODR

  8. uchar tab1[]="=SPI Slave Test="; //初始化后顯示畫面
  9. uchar tab2[]="The Number is:  ";

  10. void delay(uint z) //約1ms延時
  11. {
  12.   uint i,j;
  13.   while (z--)
  14.   {
  15.     for(i=0;i<50;i++)
  16.       for(j=0;j<20;j++);
  17.   }
  18. }

  19. void LCD_GPIO_init(void)
  20. {
  21.   PF_DDR_DDR4=1;
  22.   PF_CR1_C14=1;
  23.   PF_CR2_C24=1;
  24.   
  25.   PF_DDR_DDR0=1;
  26.   PF_CR1_C10=1;
  27.   PF_CR2_C20=1;
  28.   
  29.   PB_DDR=0xff;
  30.   PB_CR1=0xff;
  31.   PB_CR2=0xff;  
  32. }

  33. void write_com(uchar com)
  34. {
  35.   LCD_RS=0;
  36.   LCD_DATA=com;
  37.   delay(5);
  38.   LCD_EN=1;
  39.   delay(5);
  40.   LCD_EN=0;
  41. }

  42. void write_data(uchar data)
  43. {
  44.   LCD_RS=1;
  45.   LCD_DATA=data;
  46.   delay(5);
  47.   LCD_EN=1;
  48.   delay(5);
  49.   LCD_EN=0;
  50. }

  51. void LCD_init(void)
  52. {
  53.   LCD_EN=0;
  54.   write_com(0x38);
  55.   write_com(0x0c);
  56.   write_com(0x06);
  57.   write_com(0x01);
  58. }

  59. void LCD_watch(uchar add,uchar data) //LCD顯示計數(shù)函數(shù)
  60. {
  61.   write_com(0x80+0x40+add);
  62.   write_data(0x30+data); //0x30表示字符表內(nèi)0-9數(shù)字的八位為0011 0000
  63. }

  64. void LCD_DIS2(void) //LCD初始化結(jié)束后顯示內(nèi)容
  65. {
  66.   uchar num;
  67.   write_com(0x80);
  68.   for(num=0;num<16;num++)
  69.   {
  70.     write_data(tab1[num]);
  71.     delay(5);
  72.   }
  73.   write_com(0x80+0x40);
  74.   for(num=0;num<16;num++)
  75.   {
  76.     write_data(tab2[num]);
  77.     delay(5);
  78.   }
  79. }

  80. void SPI_GPIO_init(void)
  81. {
  82.   PC_DDR_DDR5=0; //SCK  弱上拉輸入模式
  83.   PC_CR1_C15=1;
  84.   PC_CR2_C25=0;
  85.   
  86.   PC_DDR_DDR6=0; //MOSI  弱上拉輸入模式
  87.   PC_CR1_C16=1;
  88.   PC_CR2_C26=0;
  89.   
  90.   PC_DDR_DDR7=1; //MISO  低速率輸出
  91.   PC_CR1_C17=1;
  92.   PC_CR2_C27=0;
  93.   
  94. //  PE_DDR_DDR5=0; //NSS 此時NSS引腳要置0
  95. //  PE_CR1_C15=1;
  96. //  PE_CR2_C25=0;
  97. }

  98. void SPI_init(void)
  99. {
  100.   SPI_CR1=0x03; //MSTR=0 配置為從設(shè)備
  101.   SPI_CR2=0x02; //軟件開啟從設(shè)備
  102.   SPI_ICR=0x00; //禁止所有中斷
  103.   SPI_CR1|=0x40; //SPE=1 開啟SPI
  104. }

  105. void main(void)
  106. {  
  107.   int i=0; //會判斷負(fù)數(shù)所以用帶符號的整形 第一次任意鍵按下為00
  108.   uchar num=0;
  109.   LCD_GPIO_init();
  110.   LCD_init();
  111.   LCD_DIS2();
  112.   SPI_GPIO_init();
  113.   SPI_init();
  114.   while(1)
  115.   {
  116.     while((SPI_SR&0x01)==0);
  117.     num=SPI_DR;
  118.     if(num==0x66)
  119.     {
  120.       i++;
  121.       if(i>99)
  122.         i=0;
  123.       LCD_watch(14,i/10);
  124.       LCD_watch(15,i%10);
  125.     }
  126.     if(num==0x99)
  127.     {
  128.       i--;
  129.       if(i<0)
  130.         i=99;
  131.       LCD_watch(14,i/10);
  132.       LCD_watch(15,i%10);
  133.     }
  134.   }
  135. }
復(fù)制代碼

所有資料51hei提供下載:
spi主從通信源碼.rar (483.27 KB, 下載次數(shù): 65)



作者: jotliu    時間: 2020-1-4 11:19
有沒有從機發(fā)數(shù)據(jù)的?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1