⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 自己编写的凌阳SPCA61A与SPCA563A图象识别模块连接驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include"spce061a.h"
//_---------------液晶显示用变量
unsigned int kaishi=0,      shuju=0,      rsrw=0 ,			data1=0,data2=0,		  yejingzhan[100]={0};
			//发送计数器	发送的数据		发送的影响位	第一 次发送的真实调治数据	液晶显示的缓冲栈,地址是栈地址

unsigned int data3,						wancheng=1,					dsf8=0;
				//液晶写中断数据TEM		完成一个字符的发送标志		缓冲堆栈操作计数器
//-------------------------				



//---系统变量
unsigned int x[10]={0};






//*******************************************

//液晶使用的函数
//************************************
void cs(int a)  //端口初始化 定向液晶显示器串口定向到B口的012断口  CS BO
{
	if (a==0)*P_IOB_Data&=(0xffff-4);//B第san位等于零
	else
	*P_IOB_Data|=4;//B口第一位等于1
}

sclk(int a) //SCLK B口第yi 位
{
	if (a==0)*P_IOB_Data&=(0xffff-1);//yi位等于零
	else
	*P_IOB_Data|=1;//B口第二位等于1

}

std(int a)//STD b口第er位
{
		if (a==0)*P_IOB_Data&=(0xffff-2);//B第er位等于零
	else
	*P_IOB_Data|=2;//B口第san位等于1

	
}



void zuhe(void)//处理下达的命令数据到标准的数据方式 并缓冲到显示栈
{
	
	data1=shuju&0xff;
	if(rsrw==0)	data1&0xfcff;
	if (rsrw==10) data1|=256; //rs=1 rw=0 则数据的BIT8=1


	if (yejingzhan[0]<98)
	{
	yejingzhan[0]+=1; //栈深加一
	yejingzhan[yejingzhan[0]]=data1; //数据压栈
	}
	else
	yejingzhan[0]=0;
}




void xianshizhuangtai(unsigned x)  //设置显示状态
{

	rsrw=0;
	shuju=x;
	zuhe();
	
}


void whanzi(unsigned char x[]) //写汉字和CGRAM代码到RAM
{
	rsrw=10;		//写汉字码高位
	shuju=x[0];
	zuhe();
	
	rsrw=10;		//写汉字码的地位
	shuju=x[1];
	zuhe();
}

void wzifu(unsigned x)	//写字符编码到RAM---------------------------
{
	rsrw=10;
	shuju=x;
	zuhe();
}

void wddramdz(unsigned x)// 写DDRAM地址
{
	rsrw=0;
	shuju=x|128;
	zuhe();
}

//******************************************
//************************************







//图象识别模块用变量
unsigned int resttem=100;//图象传感器复位时钟=0自动开始复位30MS
//---------------




unsigned int ss,zz;//写入和读出的地址和数据



	// 函数 RDY 返回RDY的状态
int rdy(void)
{
return	*P_IOA_Data&0x02;	//RDY IOA1
}

//函数 SD 设置数据线的电瓶 1 和 0
void sd(int x)
{
	if (x==1)*P_IOA_Buffer|=4; //SD IOA2
	else
	*P_IOA_Buffer&=0xfffb;
	
}

//函数 DSD 读取数据线上的电瓶 返回 1
int dsd(void)
{
	
	return (*P_IOA_Data&0x04)&&1;//IOA2 SD
	
}

//函数 SCK 设置时钟线的电瓶 0 OR 1

void sck(int x)
{
	if (x==1)*P_IOA_Buffer|=8; //SCK IOA3
	else
	*P_IOA_Buffer&=0xfff7;
	
}

//函数rest  复位传感器逻辑电瓶
void rest()
{
	*P_Watchdog_Clear=0x01;
	*P_IOA_Buffer&=0xfffe;
	resttem=0;
	
	for(;resttem<50;);//拉低电瓶 50ms
	
	*P_IOA_Buffer|=1; //REST IOA0
	*P_Watchdog_Clear=0x01;
	resttem=0;
	for(;resttem<100;);
	*P_Watchdog_Clear=0x01;	
}

void out(void)//端口设置成为输出状态
{	
	*P_IOA_Dir|=13; //0 4 8 输出方式
	*P_IOA_Data&=0xfff;
	*P_IOA_Attrib|=13;
}

void in(void)//端口设置成为输入状态
{
	*P_IOA_Dir|=9; //0 4 8 输入方式
	*P_IOA_Data&=0xfff;
	*P_IOA_Attrib|=9;
	
}

//drdy 函数 等待RDY信号函数
unsigned int drdy(void)
{
	*P_Watchdog_Clear=0x01;
	resttem=0;
	for(;rdy()==0;) 
	{  
	*P_Watchdog_Clear=0x01;
	if(resttem>70){chushi();return 1;}
	}
	return 0;
	
}

//***************************************服务函数开始
//函数 whdizhi 完成写高地址的功能
void whdizhi(unsigned int  x)
{unsigned int dizhi=0;
	dizhi=x;
	
	out();//输出状态
	drdy();//等待RDY准许信号
	sd(1);
	sck(1);
	sd(0);
	sck(0);
	sck(1);//xie0
	sd(0);
	sck(0);
	sck(1);//xie0
	
	
	
	
	
	
	sd(0);	//开始写高位数据 0x0f
	sck(0);
	sck(1);//xie 1wei
	sd(0);
	sck(0);
	sck(1);//xie 2wei
	sd(0);
	sck(0);
	sck(1);//xie 3wei
	sd(0);
	sck(0);
	sck(1);//xie 4wei
	sd(1);
	sck(0);
	sck(1);//xie 5wei
	sd(1);
	sck(0);
	sck(1);//xie 6wei
	sd(1);
	sck(0);
	sck(1);//xie 7wei
	sd(1);
	sck(0);
	sck(1);//xie 8wei //标志位完成完成写

			
	sd(dizhi>>7&1);	//开始写高位地址
	sck(0);
	sck(1);//xie 1wei
	sd(dizhi>>6&1);
	sck(0);
	sck(1);//xie 2wei
	sd(dizhi>>5&1);
	sck(0);
	sck(1);//xie 3wei
	sd(dizhi>>4&1);
	sck(0);
	sck(1);//xie 4wei
	sd(dizhi>>3&1);
	sck(0);
	sck(1);//xie 5wei
	sd(dizhi>>2&1);
	sck(0);
	sck(1);//xie 6wei
	sd(dizhi>>1&1);
	sck(0);
	sck(1);//xie 7wei
	sd(dizhi>>0&1);
	sck(0);
	sck(1);//xie 8wei //高位完成写
		sd(1);
	sck(0);
	sck(1);

	
	
	
	
	
	
}



//________________________________函数 wdata() 写一个字节到地位地址

void wdata(unsigned int dizhi,unsigned int data)
{

	out();
	drdy();
	
	sd(1);
	sck(1);
	sd(0);
	sck(0);
	sck(1);//xie0
	sd(0);
	sck(0);
	sck(1);//xie0
		
		
	sd(dizhi>>7&1);	//开始写低位地址
	sck(0);
	sck(1);//xie 1wei
	sd(dizhi>>6&1);
	sck(0);
	sck(1);//xie 2wei
	sd(dizhi>>5&1);
	sck(0);
	sck(1);//xie 3wei
	sd(dizhi>>4&1);
	sck(0);
	sck(1);//xie 4wei
	sd(dizhi>>3&1);
	sck(0);
	sck(1);//xie 5wei
	sd(dizhi>>2&1);
	sck(0);
	sck(1);//xie 6wei
	sd(dizhi>>1&1);
	sck(0);
	sck(1);//xie 7wei
	sd(dizhi>>0&1);
	sck(0);
	sck(1);//xie 8wei //地址完成写
	
	
	sd(data>>7);	//开始写数据data
	sck(0);
	sck(1);//xie 1wei
	sd(data>>6&1);
	sck(0);
	sck(1);//xie 2wei
	sd(data>>5&1);
	sck(0);
	sck(1);//xie 3wei
	sd(data>>4&1);
	sck(0);
	sck(1);//xie 4wei
	sd(data>>3&1);
	sck(0);
	sck(1);//xie 5wei
	sd(data>>2&1);
	sck(0);
	sck(1);//xie 6wei
	sd(data>>1&1);
	sck(0);
	sck(1);//xie 7wei
	sd(data>>0&1);
	sck(0);
	sck(1);//xie 8wei //完成写
	sd(1);
	sck(0);
	sck(1);

}

//***************************从传感器地址内读一个字节函数 rdata();

int rdata(unsigned x)
{ unsigned int data=0,dizhi=0;
	dizhi=x;
	data=0;
	
	out();//输出状态
	drdy();//等待RDY准许信号

	sd(1);
	sck(1);
	sd(0);
	sck(0);
	sck(1);//xie0
	sd(1);
	sck(0);
	sck(1);//xie1
	
	sd(dizhi>>7&1);	//开始写低位地址
	sck(0);
	sck(1);//xie 1wei
	sd(dizhi>>6&1);
	sck(0);
	sck(1);//xie 2wei
	sd(dizhi>>5&1);
	sck(0);
	sck(1);//xie 3wei
	sd(dizhi>>4&1);
	sck(0);
	sck(1);//xie 4wei
	sd(dizhi>>3&1);
	sck(0);
	sck(1);//xie 5wei
	sd(dizhi>>2&1);
	sck(0);
	sck(1);//xie 6wei
	sd(dizhi>>1&1);
	sck(0);
	sck(1);//xie 7wei
	sd(dizhi&1);
	sck(0);
	sck(1);//xie 8wei //地址完成写
	sck(0);
	sd(1);
	sck(1);
	
	in();
	drdy();
	
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	
	for(x=8;x>0;x--)
	{
	sck(0);
	sck(1);//du 1wei
	data|=(dsd()<<(x-1)); //读8位数据
	}

	sck(0);
	sck(1);
	return data;
	
	
}

//初始化传感器程序chushi()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -