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