php sspi应用,SPI串行通信模块应用(一)

原标题:SPI串行通信模块应用(一)

// 应用

//★★★★★★★★★SPI★★★★★★★★★★★\\

//实验目的:熟悉SPI以及9346EEPROM的读写

//型号:PIC16F877A

//功能描述:RBO键按下时把DATA和DATA2写入到EEPROM中以EE—ADDR为地址的单元内,

// 完成后,单个数码观显示“9”做为完成标志

// RB1键按下时,读取EEPROM中以EE—ADDR为地址的单元,并送数码管显示

#include //调库函数

__CONFIG(0xf73a); //芯片配置字

#define cs RC2 //特殊引脚的定义

#define clk RC3

#define d_i RC5

#define d0 RC4

#define ee_addr 0x5 //6位地址码

#define nop() asm("nop") //空操作符的定义

const char ee_data_write[]={0x56,0x78}; //要发送数据初值的定义

unsigned char ee_data[4]; //定义存储数据段

const table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//0~9译吗

unsigned int temp; //数据暂存器

void init(); //初始化

void ee_write(); //写操作

void ee_read(); //读操作

void display(); //显示子程序

void delay(); //延时子程序

void ee_write_enable(); //写操作使能子程序

void spi_comm(unsigned char x); //数据传送及存储子程序

//===============================================================================

//函数功能:主函数

//函数名称:void main()

void main()

{

init();

while(1)

{

if(!RB0)

{

ee_write();

}

if(!RB1)

{

ee_read();

while(1)

{

display();

}

}

}

}

//===============================================================================

//函数功能:初始化

//函数名称:void init()

void init()

{

ADCON1=0X07;

TRISA=0X30; //PORTA口作为数码管的位选控制口

TRISB=0X03; //RB0,RB1作为按键输入,别的作为输出

TRISC=0X10; //RC4即DO作为输入口,别的作为输出口,CS--RC2;CLK--RC3;DI--RC5

TRISD=0X00; //PORTD口作为数码管的段选控制口

PORTD=0XFF; //开始清数码管显不,数码管为共阳

SSPSTAT=0X80; //同步串行状态寄存器;清空缓冲区,在时序信号中间采取数据

SSPCON=0X31; //使能串口功能,时钟先fosc/16,空闲时时钟为高电平

INTCON=0X00; //禁止所有中断

PIR1=0X00; //清中断标志位

cs=0; //清CS为0

}

//===============================================================================

//函数功能:写操作函数

//函数名称:void ee_write()

void ee_write()

{

int i,j;

ee_write_enable();

cs=1;

spi_comm(0x1);

spi_comm(ee_addr|0x40); //6位地址加上两位操作码01XXXXXX 写指令

for(i=0;i<2;i++)

{

j=ee_data_write[i];

spi_comm(j);

}

cs=0;

nop();nop();

cs=1;

nop();nop();

while(!d0);

cs=0;

nop();nop();

PORTD=0x90; //数据传送完以后数码管显示9

PORTA=0x3e;

}

//===============================================================================

//函数功能:读操作函数

//函数名称:void ee_read()

void ee_read()

{

int i;

cs=1;

nop();nop();

spi_comm(0x01);

spi_comm(ee_addr|0x80); //6位地址加上两位操作码,10XXXXXX 读指令

for(i=0;i<2;i++)

{

spi_comm(0);

ee_data[i]=temp;

}

nop();

cs=0; //结束时清CS为0

nop();

}

//===============================================================================

//函数功能:写操作使能子程序

//函数名称:void ee_write_enable()

void ee_write_enable()

{

cs=1;

spi_comm(0x01);

spi_comm(0x30); //写入操作码0011XXXX 写使能指令

cs=0;

nop();nop();

}

//===============================================================================

//函数功能:数据传送及存储子程序

//函数名称:void spi_comm(unsigned char x)

void spi_comm(unsigned char x)

{

SSPBUF=x; //把返回的数送到数据缓冲器

while(!SSPIF); //中断标志是否为1,即数据有没有发送完

SSPIF=0; //软件清零中断标志

temp=SSPBUF; //暂存接收到的数

}

//===============================================================================

//函数功能:显示子程序

//函数名称:void display()

void display()

{

int i;

i=ee_data[0]&0xf0; //将存储器中的第一个数和0XF0相与,存到i

i=i>>4; //将i右移四位,即将高四位移到低四位,得到十位上要显示的数

PORTD=table[i]; //查表

PORTA=0x3e; //选通数码管

delay(); //延时以保证亮度

i=ee_data[0]&0x0f; //将存储器中的数和0X0F相与,存到i

PORTD=table[i]; //个位上的数不用移位,直接查表

PORTA=0x3d; //选通数码管

delay();

i=ee_data[1]&0xf0;

i=i>>4;

PORTD=table[i];

PORTA=0x3b;

delay();

i=ee_data[1]&0x0f;

PORTD=table[i];

PORTA=0x37;

delay();

}

//===============================================================================

//函数功能:延时显示子程序

//函数名称:void delay()

void delay()

{

int i;

for(i=100;i>0;i--);

}

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值