IIC通信以及今日代码练习2023/10/20

首先写一下今日的代码练习:

可逆的素数,要求一个素数顺序倒过来的数也是素数。

感悟:要先判断这个数是否为素数,然后把这个素数的每一位取出来,组合一下判断新的数是否为素数并且是否大于原来的素数。

这里面取每一个数的代码很好,但是要注意这会导致原来的数变化,所以设一个中间变量u,这样子就可以保持i不变。

	u =i;
		if(ss(i)==1){
			while(u>0){               //取出每一位数 ,并打印出来 
				a[j]=u%10;	
				u=u/10;           //问题在这里,你的i已经变了 
				j++;
			}

下面是整体的代码:

#include <stdio.h>

#define N 10

int ss(int i) //判断一个数是否为素数
{
	int j;
	if(i<=1)
		return 0;
	if(i==2)
		return 1;
	for(j=2;j<i;j++)				//判断大于2的数是否为素数
	{
		if(i%j==0)
			return 0;
		else if(i!=j+1)
			continue;
		else
			return 1;
	} 
	return j;
} 

int main(){
	int i,a[N]={0},j=0,n=0,u;
	for(i=1000;i<10000;i++){
		u =i;
		if(ss(i)==1){
			while(u>0){               //取出每一位数 ,并打印出来 
				a[j]=u%10;	
				u=u/10;           //问题在这里,你的i已经变了 
				j++;
			}
			j=0;
		if(ss(1000*a[0]+100*a[1]+10*a[2]+a[3])==1&&1000*a[0]+100*a[1]+10*a[2]+a[3]>i){
			printf("%d,",i);
			n++;
			if(n%10==0)
				printf("\n");
		}
		}
	}
	return 0;
} 

IIC通信协议

IIC可以挂载多个设备,可以一主多从

首先配置IIC的接口,然后写IIC的开始协议,发送地址,发送数据,应答,停止发送这几步,并且每次发送完数据要有应答位。

起始条件:(因为不清楚此时两条线的状态,为了确保正确,先拉高,再拉低)SDA(1) SCL(1),SDA(0),SCL(1)。

终止条件:SDA(0),SCL(1),SDA(1),先拉低SDA,再拉高SCL,再拉高SDA

void MyI2C_W_SCL(uint8_t BitValue)   //配置SCL写,也就是配置相关引脚
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);
	Delay_us(10);
}

void MyI2C_W_SDA(uint8_t BitValue)  //配置SDA的写
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValue); //bitactiion就是一个枚举类型的变
                                                          //量,表示这个位是高电平还是低电平                                                                                                
	Delay_us(10);  //为了写进去
}

uint8_t MyI2C_R_SDA(void)               //配置SDA的读,因为要接收数据
{
	uint8_t BitValue;
	BitValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);
	Delay_us(10);
	return BitValue;
}

发送一个字节:

void MyI2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i ++)
	{
		/*Byte & (0x80 >> i)这里是取出Byte的每一位*/
		MyI2C_W_SDA(Byte & (0x80 >> i));   //0x80,0x40,0x20,0x10,0x00,右移一位
		MyI2C_W_SCL(1);                // 数据传输完毕后SCL拉高,读取SDA的数据
		MyI2C_W_SCL(0);                   //数据读取完毕,拉低SCL,传输下一个数据到SDA上
	}
}

接收一个字节(注意接收别的函数的数据,都要有个返回值):

uint8_t MyI2C_ReceiveByte(void)
{
	uint8_t i, Byte = 0x00;  //Byte是篮子
	MyI2C_W_SDA(1);                   //拉高SDA可以读取数据,此时SCL也要是高电平
	for (i = 0; i < 8; i ++)
	{
		MyI2C_W_SCL(1);
		if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}  //读为真,则给Byte最高位置1
                                                //如果是假,就置0,每次取一个数据,取八次
		MyI2C_W_SCL(0);
	}
	return Byte;
}

发送一个应答位,接收一个应答位:

void MyI2C_SendAck(uint8_t AckBit)
{
	MyI2C_W_SDA(AckBit);
	MyI2C_W_SCL(1);
	MyI2C_W_SCL(0);
}

uint8_t MyI2C_ReceiveAck(void)
{
	uint8_t AckBit;
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	AckBit = MyI2C_R_SDA();
	MyI2C_W_SCL(0);
	return AckBit;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值