📄 main.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 + -