#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()
void chushi(void)
{unsigned x=0;
rest();
whdizhi(0x70);
x=rdata(0xe1);
// wdata(0x81,0x00);//cpu call
wdata(0xe1,x|8);//初始化光源频率为50HZ
x=rdata(0xe2);
wdata(0xe2,x|8);//初始化自动色彩调整功能
whdizhi(0x74);
x=rdata(0x80);
//wdata(0x80,x|3);//初始化分类模式
//wdata(5,0xff);//准许颜色分离
whdizhi(0x75);//初始化方式为手动
wdata(0,0);
whdizhi(0x70);
// wdata(0xe3,00);//初始化自动暴光模式
wdata(0xe0,9);
wdata(0xe8,0x00);//初始化为图形颜色识别方式
}
main()
{
asm("int off");
yejingzhan[0]=0;
*P_IOB_Dir=0x00ff;
*P_IOB_Attrib=0x00ff;
*P_IOB_Data=0x00; //初始化B口低8为为同相输出
*P_IOA_Dir=0x9; //0 4
*P_IOA_Data=0;
*P_IOA_Attrib=9;
*P_INT_Ctrl=16+8+0x4000;//1KHZ 2HZ /1024
*P_SystemClock=0xe0;
asm("irq on");
*P_Watchdog_Clear=0x01;
xianshizhuangtai(12);//设置显示打开和状态
xianshizhuangtai(12);//设置显示打开和状态
chushi();
xianshizhuangtai(12);//设置显示打开和状态
xianshizhuangtai(12);//设置显示打开和状态
for(;;)
{
*P_Watchdog_Clear=0x01;
}
}
//*******************************************************************//
//Interrupt Service Routine For C language
//************************************************************