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

📄 main.c

📁 内外差值法
💻 C
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "MC9S08AW60.h"

/*******************全局变量定义*****************/
#define LCD_DATA_PORT  PTBD
#define RS PTDD_PTDD4
#define RW PTDD_PTDD5
#define EN PTDD_PTDD6
#define LOW  0
#define HIGH 1
#define Clear_screen        0x01
#define Disp_on             0x0c
#define Disp_off            0x08
#define Cursor_on           0x0e
#define Cursor_off          0x0c
#define Cursor_flicker_on   0x0f
#define Cursor_flicker_off  0x0e
unsigned char COUNT3,COUNT2,COUNT1,COUNT,LCD_X,LCD_Y,LCD_DATA1,LCD_DATA2,LCD_DATA,F3,R1,F0;

/*************取图像数据变量声明定义*************/
#define FS          PTED_PTED3      //一帧图像转换完成信号
#define STRB        PTAD_PTAD6      //AD转换完成信号
#define sensor_data PTAD            //图像数据输出口 
unsigned char  field_value=0;       //图像的阀值
unsigned char  cmos_data[4][32]={0};//存储图像数据
unsigned char  cmos_mode=0;         //图像获取完成标志


/************************************************\
*   *   *功能:图形数组
\************************************************/
 
 unsigned char TU_TAB2[64][16]={0

};


/*************************************************\
*********函数名称:图像数据采集中断服务函数
*********函数功能:采集图像数据
*********函数参数:无
\*************************************************/
void interrupt TPM1_Catch(void)     // 中断向量声明为:VECTOR  ADDRESS   0x0000FFF2 TPM1_Catch       
{                                  //在project.prm中声明
unsigned char i,j;
 TPM1C1SC_CH1IE=0;                   //关中断使能
 TPM1C1SC_CH1F=0;                    //清除中断标志位
 while(FS);                          //等待图像信号
 for(i=0; i<=3; i++)                
 {    
     while(STRB);                   //等待像素点数据转换完成
     while(!STRB);                  
     for(j=0; j<=31; j++)           
     {															
        while(STRB);                       // Wait	 synchronous signal
        cmos_data[i][j]=sensor_data&0x3f;
        while(!STRB);                      // Wait	 synchronous signal
     }
 } 
 cmos_mode=0;                             //清除查询标志位
}
/******************************************************\
*********函数名称:中断使能函数
*********函数功能:等待中断发生
*********函数参数:无
\******************************************************/
void CMOS_getpic(void)                 
{ 
  cmos_mode=1;                       //置查询标志位
  TPM1C1SC_CH1IE=1;                  //允许0通道中断请求
  TPM1C1SC_CH1F=0;                   //清除中断标志位
  while(cmos_mode==1)                //标志位为1,则一直等待中断发生
  __RESET_WATCHDOG();
}    


/***************************忙判断*********************/
void Lcd12864_Check_Busy()
{ unsigned int x;
 for(x=0;x<300;x++);
}

/***************************延时***********************/
void LCD_delay(unsigned int d)
{
    while(d--)
    {
     // __RESET_WATCHDOG();
    }
}

/************************写数据************************/
void Lcd12864_Write_Data(char Data)
{
    Lcd12864_Check_Busy();    
    RS=HIGH;
    RW=LOW;
    LCD_DATA_PORT=Data;
    EN=HIGH;
    asm
     {
      nop
      nop 
     }
    EN=LOW;
    LCD_DATA_PORT=0xFF; 
}

/************************写指令************************/
void Lcd12864_Write_Command(char Command_Code)
{
    Lcd12864_Check_Busy();
    RS=LOW;
    RW=LOW;
    LCD_DATA_PORT=Command_Code;
    EN=HIGH ;
    asm
     {
      nop
      nop 
     }

    EN=LOW;
}

/********************设置坐标位置*********************/
void Lcd12864_set_xy(unsigned char x, unsigned char y)
{
    unsigned char p;
    switch(x)
    {
        case 0: p = 0x80; break; //第一行开始地址
        case 1: p = 0x88; break; //第二行
        case 2: p = 0x90; break; //第三行
        case 3: p = 0x98; break; //第四行
    }
    p += y;
    Lcd12864_Write_Command(p);
}	 

/***********************写字符***********************/
void Lcd12864_Write_words(char x, char y,const char *str)
{
    unsigned char i = 0;
    Lcd12864_set_xy(x,y);
    while(str[i] != '\0')
    {
     Lcd12864_Write_Data(str[i++]);
    }
}


/*************************写准备*********************/
void WR_ZB(void) 
{ 
    Lcd12864_Write_Command(0x34);       //功能设定:扩充指令集动作
    Lcd12864_Write_Command(LCD_Y); 
    Lcd12864_Write_Command(LCD_X); 
    Lcd12864_Write_Command(0x30);       //功能设定:基本指令集动作
} 


/******************显示图形子程序*******************/
void PHO_DISP(const unsigned char *s) 
{ 
    COUNT3=0X02;      //左右半屏控制
    LCD_X=0X80;       //128横向点数
    for (;COUNT3!=0;COUNT3--) 
    { 
        LCD_Y=0X80;    
        COUNT2=0X20;  //32 
        for (;COUNT2!=0;COUNT2--) 
        { 
          COUNT1=0X10;//16 
          WR_ZB(); 
          for (;COUNT1!=0;COUNT1--) 
           { 
            Lcd12864_Write_Data(*s++); 
           } 
          LCD_Y+=1; 
        } 
        LCD_X=0X88; 
    } 
   Lcd12864_Write_Command(0x36);    //打开绘图显示
   //Lcd12864_Write_Command(0x30); 
} 


/*****************图像数组转化函数******************/
void abc(void)
 {
  unsigned char n,i,m;
  signed char a,b,j;
  n=0;                          //点阵数组列坐标
  for(i=0;i<=31;i=i+2)          //32行数据进行转化
   {
    m=0;                        //点阵数组行坐标
    for(j=63;j>=0;j--)          //判断图像数值的大小,用冒泡法
     {
      a=cmos_data[2][i]-j;         //摄像头数据组
      b=cmos_data[2][i+1]-j;
      if(a>=0) TU_TAB2[m][n]+=0xf0;
      if(b>=0) TU_TAB2[m][n]+=0x0f;
      TU_TAB2[m][n]&=0XEE;
      m++;
     }
     n++;
    }
    
   }

/*****************初始化函数集*********************/
void MCU_Init(void)          /*时钟初始化函数*/                        //*
 {                                                                     //*
  ICGC1=0X78;                //FLL环系数P=1,N=4,
  ICGC2=0X00;                //R=1,总线频率为8MHZ
  SOPT_COPE=0;                                                         //*
 }
 void TPM_Init(void)         /*定时计数器初始化函数*/                  //*
  {                                                                    //*
   TPM1SC=0x10;              //计数器配置,1分频总线频率
   TPM1C1SC=0B00000100;      //通道1工作于输入捕捉,上升沿捕捉,中断不使能
  }
 void IO_Init(void)          /*IO口初始化函数*/
  {                                                                    //*
   PTADD=0X80;               //前七位设置为输入                        //*
   PTBDD=0XFF;               //设置为输出
   PTDDD=0XFF;               //LCD命令数据口                           //*
   PTEDD_PTEDD3=0;           //设置为输入
   PTEDD_PTEDD7=1;           //设置为输出
   PTEDD_PTEDD6=1;                                                     //*
   PTEDD_PTEDD5=1;                                                     //*
  }  
 void Lcd12864_Init(void)
 {                                                                     //*
    LCD_delay(20);
    Lcd12864_Write_Command(0x30);
    LCD_delay(20);                                                     //*
    Lcd12864_Write_Command(Disp_on);  /*开显示,不显示光标*/           //*
    LCD_delay(20);
    Lcd12864_Write_Command(Clear_screen);  /*显示清屏。*/
    LCD_delay(20);                                                     //*
    Lcd12864_set_xy(0,0);
 }
void Init_all(void)           /*总初始化函数*/                         //*
  {                                                                    //*
    MCU_Init();
    TPM_Init();                                                        //*
    IO_Init();                                                         
    Lcd12864_Init();                                                      //*
  }                                                                    //*

  

/*****************主函数***************************/
void main(void) 
 {
    Init_all(); 
    EnableInterrupts;                 //开总中断
    Lcd12864_Write_Command(Clear_screen);
    CMOS_getpic();
    abc();
    PHO_DISP(TU_TAB2);//显示图形 
    for(;;) 
     {
       __RESET_WATCHDOG();
     } 
   
  }

   
   
   
   

⌨️ 快捷键说明

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