?? tcd1252ap_drive.c
字號:
#include <c8051f310.h>
#include <TCD1252AP_Drive.h>
#include<math.h>
#define SH_H 0x10
#define SH_L 0xEF
#define Fi1_H 0x08
#define Fi1_L 0xF7
#define Fi2_H 0x40
#define Fi2_L 0xBF
#define RS_H 0x20
#define RS_L 0xDF
extern void Init_Device();
xdata unsigned char Image_Buffer[900];
unsigned int evr_pixel=0; //
unsigned char pixel=0; //定義像素變量
char byte ,flag,fg1=0;//flag為采集是否完成標志
/***********************************************/
//起始時序
void Start_Stop()
{
char DLY;
byte&=SH_L;
byte&=Fi1_L;
byte|=Fi2_H;
byte&=RS_L;
P1= byte; //
byte&=SH_L;
byte&=Fi1_L;
byte|=Fi2_H;
byte|=RS_H;
P1= byte; // 1
byte&=SH_L;
byte|=Fi1_H;
byte&=Fi2_L;
byte&=RS_L;
P1= byte; //
DLY=1;
while(DLY--)PCA0CPH4 =0x00;
byte|=RS_H;
P1= byte; // 2
byte|=SH_H;
byte|=Fi1_H;
byte&=Fi2_L;
byte&=RS_L;
P1= byte; //
DLY=1;
while(DLY--)PCA0CPH4 =0x00;
byte|=RS_H;
P1= byte; //3
byte|=SH_H;
byte|=Fi1_H;
byte&=Fi2_L;
byte&=RS_L;
P1= byte;
DLY=1;
while(DLY--)PCA0CPH4 =0x00;
byte|=RS_H; // 4
byte&=SH_L;
byte|=Fi1_H;
byte&=Fi2_L;
byte&=RS_L;
P1= byte;
byte&=RS_L;
P1= byte; //
DLY=1;
while(DLY--)PCA0CPH4 =0x00;// 5
PCA0CPH4 =0x00;
}
/**************************************
從線性CCD上讀一個像素
**************************************
unsigned char read_One_Picture()
{
AD0BUSY=1; //啟動轉(zhuǎn)換
while(AD0BUSY==1); //等待結(jié)束
pixel=ADC0H; //讀取像素值
}*/
/**************************************
虛擬輸出時序函數(shù)
***************************************/
/*void Dummy_Outputs()
{
char dly;
byte&=RS_L; //RS=0
P1= byte;
dly=2;
while(dly--);
AD0BUSY=1; //啟動轉(zhuǎn)換
while(AD0BUSY==1)PCA0CPH4 =0x00; //等待結(jié)束
pixel=ADC0H; //讀取像素值
byte|=RS_H; //RS=1
P1= byte;
dly=1;
while(dly--); // t9
byte&=RS_L; //RS=0
P1= byte;
dly=2; // t11
while(dly--);
byte=(byte&0xB7) //保留除Fi1和Fi2外的幾位,
+~byte&0x48; //對Fi1和Fi2進行取反再和其他位相加
P1= byte;
dly=1;
while(dly--);
}*/
void Dummy_Outputs()
{
char dly;
byte&=RS_L; //RS=0
P1= byte;
dly=1;
while(dly--);
AD0BUSY=1; //啟動轉(zhuǎn)換
while(AD0BUSY==1)PCA0CPH4 =0x00; //等待結(jié)束
AD0BUSY=1; //啟動轉(zhuǎn)換
while(AD0BUSY==1)PCA0CPH4 =0x00; //等待結(jié)束
byte|=RS_H; //RS=1
P1= byte;
dly=1;
while(dly--);
byte&=RS_L; //RS=0
P1= byte;
dly=2;
while(dly--);
byte=(byte&0xB7) //保留除Fi1和Fi2外的幾位,
+~byte&0x48; //對Fi1和Fi2進行取反再和其他位相加
P1= byte; //先FI1和FI2跳變
dly=1;
while(dly--); //t6
pixel=ADC0H; //讀取像素值
}
void Read_Image(int nnn)
{
Image_Buffer[nnn-40]=pixel;
PCA0CPH4 =0x00;
}
void Timer0_Over_Interrupt() interrupt 1
{
static unsigned int nn=0;
static char cir=0;
Dummy_Outputs();
if(nn<40) //虛擬輸出40(Dummy_Outputs)
{
nn++;PCA0CPH4 =0x00;
}
else if(nn>=40&&nn<940)
{
if(cir<2) //一次采三個像素取平均
{
evr_pixel+=pixel; //讀取像素值
cir++;
}
else
{
cir=0;
evr_pixel/=3;
pixel=evr_pixel;
Read_Image(nn); //將像素值放入緩存
nn++;
if(nn==300)
fg1=1;
PCA0CPH4 =0x00;
}
}
else if(nn>=940&&nn<951) //虛擬輸出12(Dummy_Outputs)
{
nn++;
}
else
{
TR0=0;
nn=0;
flag=1;
byte|=SH_H;
P1= byte;
byte&=SH_L;
P1= byte;
PCA0CPH4 =0x00;
}
}
void main()
{
flag=0;
Init_Device();
AMX0P = 0x07; //P1^7為正輸入
IE |=0x82; //允許所有中斷,允許定時器0溢出中斷
Start_Stop();
TR0=1; //定時器0啟動
while(1)
{
PCA0CPH4 =0x00; //喂狗
if(flag==1)
// PCA0CPH4 =0x00; //喂狗
{
flag=0;
// evr_pixel=0; //像素變量值清0
Start_Stop(); //重新開始
TR0=1;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -