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

📄 main.c

📁 内外差值法
💻 C
字号:
/******************************************************************************************\
*  *  *           河南工业大学 Freescale MCU&DSP 联合实验室                        *   *   *
*  *  *                      2008-8-1                                              *   *   * 
*  *  *          注:本程序已经经过调试验证,实现了所述功能。                       *   *   * 
*  *  *             如有问题可发送邮件到 hgd0603@yahoo.com.cn进行讨论              *   *   * 
                 待改进,RAM占用太大。
\******************************************************************************************/
#include <hidef.h>       /* for EnableInterrupts macro */
#include "derivative.h"  /* include peripheral declarations */
#include <MC9S08AW60.h>


/*************LCD12864用户控制命令定义 *************/
#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
#define LCM_check_state()   PTBDD=0X00;RS=0;RW=1;          //检查忙状态
#define LCM_data_out()      PTBDD=0xFF;RS=1;RW=0;          //写数据到总线
#define LCM_command_out()   PTBDD=0xFF;RS=0;RW=0;          //写命令到总线
unsigned char row1,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[21][32]={0};//存储图像数据
unsigned char  cmos_mode=0;         //图像获取完成标志
unsigned char  row=1;               //显示图像数组的行数
unsigned char  time=0;              //中断次数 
/**************功能:图形数组***********************/
unsigned char TU_TAB2[64][16]={0};

/*************************************************\
**********功能:查忙函数
\*************************************************/
void CheckState(void)
 {
  unsigned char temp;
  LCM_check_state();       //check state
  do
  {
   EN=1;                  //读\写使能为高电平时读取数据
   temp=LCD_DATA_PORT;
   EN=0;
   temp=0x80&temp;        //判忙标志
  }
  while(temp!=0x00);      //一直读取LCD数据口直到数据口不忙为止
 }


/******************************************************\
*********函数名称:写数据函数
*********函数功能:进行写数据前的配置及写数据
*********函数参数:data-所写数据值
\******************************************************/
void Lcd12864_Write_Data(char Data)
{
    CheckState();   
    LCM_data_out();
    LCD_DATA_PORT=Data;
    EN=HIGH;
    asm
     {
      nop
      nop 
     }            
    EN=LOW;
}
/******************************************************\
*********函数名称:写指令函数
*********函数功能:进行写指令前的配置及写数据
*********函数参数:Command_Code-所写指令值
\******************************************************/
void Lcd12864_Write_Command(char Command_Code)
{
    CheckState();
    LCM_command_out();
    LCD_DATA_PORT=Command_Code;
    EN=HIGH ;
   asm
     {
      nop
      nop 
     }
    EN=LOW;
}
/******************************************************\
*********函数名称:设置坐标位置函数
*********函数功能:对所写字符的位置进行设置
*********函数参数:xy横纵坐标位置值
\******************************************************/
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);
}	 
/******************************************************\
*********函数名称:写字符函数
*********函数功能:将字符写入RAM
*********函数参数:xy*str坐标及字符指针
\******************************************************/
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++]);
    }
}

/***************************************************\
******函数名称:写准备函数
******函数功能:写入绘图时的XY地址,为写入字节做准备
******函数参数:无
\***************************************************/
void WR_ZB(void) 
{ 
   Lcd12864_Write_Command(0x34);       //功能设定:扩充指令集动作
   Lcd12864_Write_Command(LCD_Y); 
   Lcd12864_Write_Command(LCD_X);  
   Lcd12864_Write_Command(0x30);       //功能设定:基本指令集动作
} 

/***************************************************\
******函数名称:图像数组转化函数
******函数功能:将图像数据转化为点阵显示数组
******函数参数:无
\***************************************************/
void abc(void)
 {
  unsigned char n,m,i,j;
  signed char a,b,c,d,k1,k2;
  n=0;                          //点阵数组列坐标,初始化为零
  cmos_data[row+1][0]=63;
  for(i=0;i<=31;i=i+4)          //32行数据进行转化,四列显示一点
   {
      m=0;                        //点阵数组行坐标,循环初始化为零
      for(j=63;j>=1;j--)          //判断图像数值的大小,用冒泡法
        {
         a=cmos_data[row][i]-j;         //摄像头数据组
         b=cmos_data[row][i+1]-j;
         c=cmos_data[row][i+2]-j;
         d=cmos_data[row][i+3]-j;
         if(a>=0) TU_TAB2[m][n]+=0x80;
         if(b>=0) TU_TAB2[m][n]+=0x20;
         if(c>=0) TU_TAB2[m][n]+=0x08;
         if(d>=0) TU_TAB2[m][n]+=0x02;
         a=cmos_data[row+1][i]-j;         //摄像头数据组
         b=cmos_data[row+1][i+1]-j;
         c=cmos_data[row+1][i+2]-j;
         d=cmos_data[row+1][i+3]-j;
         if(a>=0) TU_TAB2[m][n+8]+=0x80;
         if(b>=0) TU_TAB2[m][n+8]+=0x20;
         if(c>=0) TU_TAB2[m][n+8]+=0x08;
         if(d>=0) TU_TAB2[m][n+8]+=0x02;
         m++;
         }
     n++;
    }
    for(k1=1;k1<=15;k1=k1+2)          //画出轴坐标线 -横轴
     {
     TU_TAB2[63][k1]+=0x01;   
     }
    for(k2=55;k2>=0;k2=k2-8)         //纵轴
     {
      TU_TAB2[k2][15]+=0x01;
     }    
      
   } 
   
/***************************************************\
******函数名称:显示图形子程序
******函数功能:对点阵数组进行显示
******函数参数:*s待显示数组首地址
\***************************************************/
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(); 
          //abc();
          for (;COUNT1!=0;COUNT1--) 
           { 
            Lcd12864_Write_Data(*s++); 
           } 
          LCD_Y+=1; 
        } 
        LCD_X=0X88; 
    } 
   Lcd12864_Write_Command(0x36);    //打开绘图显示
   Lcd12864_Write_Command(0x30);    //打开基本动作集指令
} 

/*****************************************************\
*********函数名称:图像数据采集中断服务函数
*********函数功能:采集图像数据
*********函数参数:无
\******************************************************/
void interrupt TPM1_Catch(void)      // 中断向量声明为:VECTOR  ADDRESS   0x0000FFF2 TPM1_Catch       
{                                    //在project.prm中声明
unsigned char i,j;
 SRTISC_RTIE=0; 
 TPM1C1SC_CH1IE=0;                   //关中断使能
 TPM1C1SC_CH1F=0;                    //清除中断标志位
 while(FS);                          //等待图像信号
 for(i=0; i<=20; 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;                             //清除查询标志位
 SRTISC_RTIE=1; 
}


/******************************************************\
*********函数名称:中断使能函数
*********函数功能:等待中断发生
*********函数参数:无
\******************************************************/
void CMOS_getpic(void)                 
{ 
  cmos_mode=1;                       //置查询标志位
  TPM1C1SC_CH1IE=1;                  //允许0通道中断请求
  while(cmos_mode==1)                //标志位为1,则一直等待中断发生
  __RESET_WATCHDOG();
}  

/*****************************************************\
*********函数名称:清零数组函数
*********函数功能:数组元素全部清零
*********函数参数:无
\******************************************************/
void clear(void)
 {
  unsigned char i,j;
  for(i=0;i<=63;i++)
   {
    for(j=0;j<=15;j++)
     {
      TU_TAB2[i][j]=0x00;
     }
   }
 }     
 

/*****************************************************\
*********函数名称:显示数组转换函数
*********函数功能:换行显示
*********函数参数:无
\******************************************************/
void interrupt RTI_switch(void)
 {
   time++;
   SRTISC_RTIACK=1;       //清中断标志位
   SRTISC_RTIE=1; 
 }  
  
/***************************************************\
******函数名称:初始化函数集
******函数功能:对MCU,TPM,IO,LCD进行初始化
******函数参数:均无
\***************************************************/
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 RTI_Init(void)
  {
   SRTISC=0B01000111;        //实时中断配置,中断不使能,1.024s中断一次
  }
 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)
 {                                                                     //*
    CheckState();
    Lcd12864_Write_Command(0x30);
    CheckState();                                                    //*
    Lcd12864_Write_Command(Disp_on);  /*开显示,不显示光标*/           //*
    CheckState();
    Lcd12864_Write_Command(Clear_screen);  /*显示清屏。*/
    CheckState();                                                     //*
    Lcd12864_set_xy(0,0);
 }

/*************************************************\
*********函数名称:总初始化函数
*********函数功能:
*********函数参数:
\*************************************************/  
void Init_all(void)           /*总初始化函数*/
  {
    MCU_Init();
    TPM_Init();
    RTI_Init();
    IO_Init();
    Lcd12864_Init(); 
  }
  
/*****************主函数***************************/
void main(void) 
 {
    Init_all(); 
    EnableInterrupts;                 //开总中断
    //while(time<=20);
    CMOS_getpic();
    abc();
    //Lcd12864_Write_Command(Clear_screen);
    PHO_DISP(TU_TAB2);//显示图形 
    for(;;) 
     {                                 
      if(time>=4)
        {
         time=0;
         SRTISC_RTIE=0;         //关中断使能
         SRTISC_RTIACK=1;       //清中断标志位
         row=row+2;
         CheckState();
         Lcd12864_Write_Command(Clear_screen);
         CheckState();
         clear();  
         abc();
         PHO_DISP(TU_TAB2);//显示图形
         if(row>=19){row=1;} 
         SRTISC_RTIE=1;         //开中断
         }
       __RESET_WATCHDOG();
     } 
   
  }












  


   
   
   
   

⌨️ 快捷键说明

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