首先写一下今日的代码练习:
可逆的素数,要求一个素数顺序倒过来的数也是素数。
感悟:要先判断这个数是否为素数,然后把这个素数的每一位取出来,组合一下判断新的数是否为素数并且是否大于原来的素数。
这里面取每一个数的代码很好,但是要注意这会导致原来的数变化,所以设一个中间变量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;
}