找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3667|回复: 1
打印 上一主题 下一主题
收起左侧

stm8 SPI双机通信主设备与从设备源码

[复制链接]
跳转到指定楼层
楼主
主机使用8S103F3 带两个按键用于加1和减1操作(范围0-99)
丛机使用8S208MB 带1602液晶用于显示当前数值
注意两个机子要共地处理
图片显示的是实际效果


SPI主设备 - 8S103F3源码见附件
SPI从设备 - 8S208MB 单片机源程序如下:
  1. /********接收到的数据通过1602显示  俩设备要共地******************/

  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显示计数函数
  60. {
  61.   write_com(0x80+0x40+add);
  62.   write_data(0x30+data); //0x30表示字符表内0-9数字的八位为0011 0000
  63. }

  64. void LCD_DIS2(void) //LCD初始化结束后显示内容
  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 配置为从设备
  101.   SPI_CR2=0x02; //软件开启从设备
  102.   SPI_ICR=0x00; //禁止所有中断
  103.   SPI_CR1|=0x40; //SPE=1 开启SPI
  104. }

  105. void main(void)
  106. {  
  107.   int i=0; //会判断负数所以用带符号的整形 第一次任意键按下为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. }
复制代码

所有资料51hei提供下载:
spi主从通信源码.rar (483.27 KB, 下载次数: 65)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:454023 发表于 2020-1-4 11:19 | 只看该作者
有没有从机发数据的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表