NXPMK60智能车子模块初始化驱动方式.docx
《NXPMK60智能车子模块初始化驱动方式.docx》由会员分享,可在线阅读,更多相关《NXPMK60智能车子模块初始化驱动方式.docx(50页珍藏版)》请在冰点文库上搜索。
NXPMK60智能车子模块初始化驱动方式
基于恩智浦MK60DN512Z系列单片机的智能模型车子程序集
作者徐挺
/**********************************************************
函数名称:
LCD_init()
**********************************************************/
voidLCD_Init(void)
{
GPIO_Init(PORTC,19,GPO,1);
GPIO_Init(PORTC,18,GPO,1);
GPIO_Init(PORTC,17,GPO,1);
GPIO_Init(PORTC,16,GPO,1);
LQTFT_RST=0;
time_delay_ms(200);
LQTFT_RST=1;
time_delay_ms(50);
LCD_write_command(0x11);//startOSC
time_delay_ms(100);
LCD_write_command(0xB1);//frameratecontrol
LCD_write_para8(0x05);
LCD_write_para8(0x3A);
LCD_write_command(0x36);//镜像控制?
LCD_write_para8(0x08);//
LCD_write_command(0xB2);
LCD_write_para8(0x05);
LCD_write_para8(0x3A);
LCD_write_command(0xB3);
LCD_write_para8(0x05);
LCD_write_para8(0x3A);
LCD_write_para8(0x05);
LCD_write_para8(0x3A);
LCD_write_command(0xB4);//inversionsetting
LCD_write_para8(0x00);//0x00=dotinversion
LCD_write_command(0xC0);//PowerControl1
LCD_write_para8(0xAA);//AVDD=5V;GVDD=4.2V
LCD_write_para8(0x0A);//GVCL=-4.2V
LCD_write_para8(0x84);//Mode=AUTO;VRHP=VRHN=0
LCD_write_command(0xC1);//PowerControl2
LCD_write_para8(0xC0);//V25=2.4V;VGH=2AVDD+VGH25-0.5=11.9V;VGL=-7.5V
LCD_write_command(0xC2);//PowerControl3
LCD_write_para8(0x0D);//
LCD_write_para8(0x00);//
LCD_write_command(0xC3);//PowerControl4
LCD_write_para8(0x8D);//
LCD_write_para8(0x2A);//
LCD_write_command(0xC4);//PowerControl5
LCD_write_para8(0x8D);
LCD_write_para8(0xEE);
LCD_write_command(0xC5);//VCOMsetting
LCD_write_para8(0x06);//
LCD_write_command(0xE0);
LCD_write_para8(0x06);
LCD_write_para8(0x1C);
LCD_write_para8(0x10);
LCD_write_para8(0x14);
LCD_write_para8(0x30);
LCD_write_para8(0x2B);
LCD_write_para8(0x24);
LCD_write_para8(0x29);
LCD_write_para8(0x28);
LCD_write_para8(0x26);
LCD_write_para8(0x2E);
LCD_write_para8(0x39);
LCD_write_para8(0x00);
LCD_write_para8(0x02);
LCD_write_para8(0x01);
LCD_write_para8(0x10);
LCD_write_command(0xE1);
LCD_write_para8(0x06);
LCD_write_para8(0x1C);
LCD_write_para8(0x10);
LCD_write_para8(0x14);
LCD_write_para8(0x30);
LCD_write_para8(0x2B);
LCD_write_para8(0x24);
LCD_write_para8(0x29);
LCD_write_para8(0x28);
LCD_write_para8(0x26);
LCD_write_para8(0x2E);
LCD_write_para8(0x39);
LCD_write_para8(0x00);
LCD_write_para8(0x02);
LCD_write_para8(0x01);
LCD_write_para8(0x10);
LCD_write_command(0x3A);//
LCD_write_para8(0x05);//RGB16-bit
LCD_write_command(0x29);//displayon
time_delay_ms(10);
LCD_display_full(RED);
}
/******************DRIVEIC寄存器寻址8080SERIES*******************************/
voidLCD_write_command(unsignedcharcmd)
{
unsignedchari;
LQTFT_A0=0;//A0=0发送命令
LQTFT_CS=0;
for(i=0;i<8;i++)
{
LQTFT_SCK=0;
if((cmd&0x80)==0x80)//高位先发送
LQTFT_SDA=1;
else
LQTFT_SDA=0;
//LQTFT_SDA=((0x80&cmd>0)?
1:
0);
LQTFT_SCK=1;
cmd=(cmd<<1);
}
LQTFT_CS=1;
}
/*****************DRIVEIC寄存器写数据8080SERIES******************************/
voidLCD_write_para8(unsignedchardat)
{
unsignedchari;
LQTFT_A0=1;//A0=1发送数据
LQTFT_CS=0;
for(i=0;i<8;i++)
{
LQTFT_SCK=0;
if((dat&0x80)==0x80)
LQTFT_SDA=1;
else
LQTFT_SDA=0;
//LQTFT_SDA=((0x80&dat>0)?
1:
0);
LQTFT_SCK=1;
dat=(dat<<1);
}
LQTFT_CS=1;
}
/****************DRIVEICGDRAM写数据16BITS8080SERIES*****************************/
voidLCD_write_para16(unsignedintdat)
{
unsignedchari,buf;
LQTFT_A0=1;
LQTFT_CS=0;
buf=(unsignedchar)(0xFF&(dat>>8));
for(i=0;i<8;i++)
{
LQTFT_SCK=0;
if((buf&0x80)==0x80)
LQTFT_SDA=1;
else
LQTFT_SDA=0;
//LQTFT_SDA=((0x80&buf>0)?
1:
0);
LQTFT_SCK=1;
buf=(buf<<1);
}
LQTFT_CS=1;
buf=(unsignedchar)(0xFF&dat);
LQTFT_CS=0;
for(i=0;i<8;i++)
{
LQTFT_SCK=0;
if((buf&0x80)==0x80)
LQTFT_SDA=1;
else
LQTFT_SDA=0;
//LQTFT_SDA=((0x80&buf>0)?
1:
0);
LQTFT_SCK=1;
buf=(buf<<1);
}
LQTFT_CS=1;
}
/**********************************************************
函数名称:
LCD_SetPos()
入口参数:
起始终止坐标
出口参数:
无
时间:
2016/11/12
功能说明:
重新定位输入信息位置
其他说明:
无
**********************************************************/
voidLCD_SetPos(unsignedcharxs,unsignedcharys,unsignedcharxe,unsignedcharye)
{
LCD_write_command(0x2A);//ColulmaddRSTsset
LCD_write_para8(0x00);//行起始坐标高8位,始终为零
LCD_write_para8(xs);//行起始坐标低8位
LCD_write_para8(0x00);//行终止坐标高8位,始终为零
LCD_write_para8(xe);//行终止坐标低8位
LCD_write_command(0x2B);//ColulmaddRSTsset
LCD_write_para8(0x00);//列起始坐标高8位,始终为零
LCD_write_para8(ys);//列起始坐标低8位
LCD_write_para8(0x00);//列终止坐标高8位,始终为零
LCD_write_para8(ye);//列终止坐标低8位
LCD_write_command(0x2C);//GRAM接收MCU数据或命令
}
/**********************************************************
函数名称:
LCD_address_rst()
入口参数:
无
出口参数:
无
时间:
2016/11/12
功能说明:
重置地址
其他说明:
无
**********************************************************/
voidLCD_address_rst(void)
{
LCD_write_command(0x2a);//配置MCU可操作的LCD内部RAM横坐标起始、结束参数
LCD_write_para8(0x00);//横坐标起始地址0x0000
LCD_write_para8(0x00);
LCD_write_para8(0x00);//横坐标结束地址0x007f(127)
LCD_write_para8(0x7f);
LCD_write_command(0x2b);//配置MCU可操作的LCD内部RAM纵坐标起始结束参数
LCD_write_para8(0x00);//纵坐标起始地址0x0000
LCD_write_para8(0x30);
LCD_write_para8(0x00);//纵坐标结束地址0x009f(159)
LCD_write_para8(0x70);
LCD_write_command(0x2C);//GRAM接收MCU数据或命令
}
/*********************************************************/
//延时函数
voidtime_delay(unsignedintt)
{
unsignedinti,j;
for(j=0;jfor(i=0;i<1000;i++);
}
/**********************************************************
函数名称:
LCD_display_full()
入口参数:
color为常用的需要显示的颜色(已经提前定义),color为
NULL时,则可将不常用颜色放入dat中加以显示
出口参数:
无
时间:
2012-09-09
功能说明:
全屏显示单色画面
其他说明:
无
**********************************************************/
voidLCD_display_full(unsignedintcolor)
{
unsignedinti,j;
LCD_SetPos(0,0,XMAX,YMAX);
for(i=0;i{
for(j=0;j{
LCD_write_para16(color);
}
}
}
voidLCD_CLS(void)
{
LCD_display_full(BLACK);
}
/****************显示图片********************************/
voidshow_pic(unsignedcharxs,unsignedcharys,unsignedcharxe,unsignedcharye,unsignedchar*ppic)
{
unsignedinti,j,k=0;
LCD_SetPos(xs,ys,xe,ye);
for(i=0;i{
for(j=0;j{
LCD_write_para16(((unsignedint)ppic[k])<<8|ppic[k+1]);
k+=2;
}
}
}
/*------------------------------------------------------------------------------------------------------
【函数】OV7725_Init
【功能】摄像头初始化
【参数】fps帧率
【返回值】无
【实例】推荐使用50帧的
【注意事项】注意K60性能有限,太高帧率会出问题
--------------------------------------------------------------------------------------------------------*/
voidOV7725_Init(uint8_tfps)
{
uint8_tid[2];//存放摄像头id
uint8_tack=0;//检验所有寄存器操作是否出错
uint16_twidth=OV7725_IMAGEW,height=OV7725_IMAGEH;
uint16_thstart,vstart,hsize;
//摄像头寄存器设置
GPIO_Init(PORTE,4,GPI_UP,1);//配置为GPIO功能
GPIO_Init(PORTE,5,GPI_UP,1);//配置为GPIO功能
EXTI_Init(PTC,6,rising_down);//行中断
EXTI_Init(PTC,7,falling_up);//场中断
GPIO_Init(PORTD,8,0,0);
GPIO_Init(PORTD,9,0,0);
GPIO_Init(PORTD,10,0,0);
GPIO_Init(PORTD,11,0,0);
GPIO_Init(PORTD,12,0,0);
GPIO_Init(PORTD,13,0,0);
GPIO_Init(PORTD,14,0,0);
GPIO_Init(PORTD,15,0,0);//注意不要使用灯PD15
OV7725_SoftwareReset();//寄存器恢复初始值
time_delay_ms(50);
/*7725最大分辨率640*480*/
ack+=OV7725_Init_Regs();//先按官方的默认初始化VGA后面需要再改
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_COM2_REG,0x03);//输出驱动能力Bit[4]:
睡眠模式Bit[1:
0]:
驱动能力00:
1x01:
2x10:
3x11:
4x
#if1//RGB模式
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_COM7_REG,0x46);//使用QVGA和RGB565格式
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_COM3_REG,0x00);//Bit[6]:
0水平镜像关1水平镜像开注意开启水平镜像时最好开启0x32寄存器的Bit[7]:
镜像图像边缘对齐-在镜像模式下应该设置为1
hstart=(0x3fU<<2U);//图像水平开始位置使用VGA时为0x23
vstart=(0x03U<<1U);//图像垂直开始位置使用VGA时为0x07
#else//灰度模式
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_COM7_REG,0x43);//使用QVGA和BayerRAW格式
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_COM3_REG,0x00);
hstart=0x3fU<<2U;//图像水平开始位置
vstart=0x03U<<1U;//图像垂直开始位置
#endif
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_CNST_REG,0x20);
OV7725_SetFPS(fps);
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_EXHCL_REG,0x00);//虚拟像素插入LSB用于在水平方向插入虚拟像素的LSB
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_ADVFL_REG,0x00);//垂直同步插入虚拟行(1位等于1行)的LSB
ack+=SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_ADVFH_REG,0x00);//垂直同步插入虚拟行的MSB
/*Resolutionandtiming.*/
hsize=width+16;
/*设置输出图片大小.*/
//水平起始位置高位因为寄存器是8位的最大255,像素最大640*480放不下,用了10位数据,这里是高8位,剩下的两位放在OV7725_HREF_REG中
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_HSTART_REG,hstart>>2U);
//水平宽度高位因为寄存器是8位的最大255,像素最大640*480放不下,用了10位数据,这里是高8位,剩下的两位放在OV7725_HREF_REG中
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_HSIZE_REG,hsize>>2U);
//垂直起始位置高位因为寄存器是8位的最大255,像素最大640*480放不下,用了9位数据,这里是高8位,剩下的两位放在OV7725_HREF_REG中
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_VSTART_REG,vstart>>1U);
//垂直高度高位因为寄存器是8位的最大255,像素最大640*480放不下,用了9位数据,这里是高8位,剩下的两位放在OV7725_HREF_REG中
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_VSIZE_REG,height>>1U);
//水平输出宽度高位因为寄存器是8位的最大255,像素最大640*480放不下,用了10位数据,这里是高8位,剩下的两位放在OV7725_EXHCH_REG中
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_HOUTSIZE_REG,width>>2U);
//垂直输出高度高位因为寄存器是8位的最大255,像素最大640*480放不下,用了9位数据,这里是高8位,剩下的两位放在OV7725_EXHCH_REG中
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_VOUTSIZE_REG,height>>1U);
//水平宽度和垂直高度的低位
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_HREF_REG,
((vstart&1U)<<6U)|((hstart&3U)<<4U)|((height&1U)<<2U)|((hsize&3U)<<0U));
//水平输出和垂直输出的低2位和低1位
SCCB_RegWrite(OV7725_SCCB_ADDR,OV7725_EXHCH_REG,((height&1U)<<2U)|((width&3U)<<0U));
}
/*