📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Huangshaobin
** Modified date: 2005.6.1
** Version: 1.1
** Descriptions: 触摸屏校准程序。读取触摸屏左上角和右下角两个指定点的A/D值,保存
** 到E2PROM中(起始地址为0xF0),以后使用触摸屏就不需要再校准。
********************************************************************************************************/
#include "config.h"
// 蜂鸣器控制口定义(P0.7)
#define BEEPCON (1<<7)
// 定义用于保存触摸屏(0,0)和两个校准点的坐标的电压值
uint16 g_vx_min, g_vy_min;
uint16 g_vinx0, g_viny0;
uint16 g_vinx1, g_viny1;
extern uint8 gImage_save_rst[];
/*-- 宽度x高度=32x32 --*/
uint8 const CUR_DATA[] =
{
0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,
0xDC,0x00,0x00,0x00,0xCE,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0xC3,0x80,0x00,0x00,
0xC1,0xC0,0x00,0x00,0xC0,0xE0,0x00,0x00,0xC0,0x70,0x00,0x00,0xC0,0x38,0x00,0x00,
0xC0,0x1C,0x00,0x00,0xC0,0x0E,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0xFF,0x8F,0xF8,
0xC4,0xFF,0x8F,0xF8,0xCC,0x60,0x06,0x30,0xDE,0x70,0x06,0x30,0xFE,0x30,0x06,0xB0,
0xF7,0x38,0x03,0x60,0xE3,0x18,0x01,0xC0,0xC3,0x9C,0x01,0xC0,0x01,0x8C,0x03,0x60,
0x01,0xCE,0x06,0x30,0x00,0xC6,0x06,0xB0,0x00,0xE6,0x07,0xF0,0x00,0x7E,0x0F,0xF8,
0x00,0x3C,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/*-- 宽度x高度=20x20 (调整为24x20) --*/
uint8 const CUR1_DATA[] =
{
0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,
0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0xFF,0xFF,0xF0,0xFF,0xFF,
0xF0,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,
0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00
};
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时(dly毫秒,与程序运行速度有关)
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<800; i++);
}
/****************************************************************************
* 名称:Beep()
* 功能:控制蜂鸣器响一声。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Beep(void)
{ IO0CLR = BEEPCON;
DelayNS(300);
IO0SET = BEEPCON;
DelayNS(150);
}
/****************************************************************************
* 名称:GetLCD_XY()
* 功能:读取触摸屏上触摸点的坐标。
* 程序会一直等待,直到有触摸输入。
* 入口参数:vx 用于保存触摸点x坐标(LCD)的变量指针
* vy 用于保存触摸点y坐标(LCD)的变量指针
* 出口参数:无
* 说明:先通测量y轴的触摸输入,判断是否有触摸动作。如果有,则进行6次数据
* 采集,并进行去极值平均滤波处理。最后还要判断触摸输入是否合法,只有
* 当触摸输入合法时才返回。
****************************************************************************/
void GetLCD_XY(uint16 *vx, uint16 *vy)
{ uint16 vx_dat, vy_dat;
uint16 vx_dat1, vy_dat1;
while(1)
{ // 判断是否有触摸动作(通过ADS7843的PENIRQ引脚进行判断)
while(1)
{ vy_dat = ADS7843_WriteRead(AIN_Y);
if(vy_dat != 0) break;
DelayNS(1);
} // end of while(1)...
// 进行数据采集
vx_dat = ADS7843_WriteRead(AIN_X);
vy_dat = ADS7843_WriteRead(AIN_Y);
vx_dat1 = ADS7843_WriteRead(AIN_X);
vy_dat1 = ADS7843_WriteRead(AIN_Y);
if((vy_dat<3) || (vy_dat1<3)) continue;
if(vx_dat>vx_dat1)
{ if((vx_dat-vx_dat1) > 13) continue;
}
else
{ if((vx_dat1-vx_dat) > 13) continue;
}
if(vy_dat>vy_dat1)
{ if((vy_dat-vy_dat1) > 18) continue;
}
else
{ if((vy_dat1-vy_dat) > 18) continue;
}
*vx = (vx_dat+vx_dat1) >> 1;
*vy = (vy_dat+vy_dat1) >> 1;
return;
}
}
#define VX_MIN_RANG ((0x0FFF) * 1/5)
#define VY_MIN_RANG ((0x0FFF) * 1/5)
#define VX_MAX_RANG ((0x0FFF) * 4/5)
#define VY_MAX_RANG ((0x0FFF) * 4/5)
/****************************************************************************
* 名称:ChkTouch()
* 功能:触摸屏幕校准程序。会设置g_vx_min、g_vy_min和g_vinx0、g_viny0、
* g_vinx1、g_viny1的值。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ChkTouch(void)
{ // 在坐标(0,0)上显示校准图标(十字光标),图标格式为20x20,校准点为(10,10)
GUI_LoadPic(0, 0, (uint8 *)CUR1_DATA, 20, 20);
// 读取触摸输入点坐标值,并判断值是否在合法的范围内
while(1)
{ // 读取触摸输入
GetLCD_XY(&g_vx_min, &g_vy_min);
DelayNS(50); // 延时50mS,防抖
GetLCD_XY(&g_vinx0, &g_viny0);
// 判断触摸输入是否有效
if((g_vy_min<3) || (g_viny0<3)) continue;
if(g_vinx0>g_vx_min)
{ if((g_vinx0-g_vx_min) > 13) continue;
}
else
{ if((g_vx_min-g_vinx0) > 13) continue;
}
if(g_viny0>g_vy_min)
{ if((g_viny0-g_vy_min) > 18) continue;
}
else
{ if((g_vy_min-g_viny0) > 18) continue;
}
// 取得两次触摸输入的平均值
g_vinx0 = (g_vinx0+g_vx_min) >> 1;
g_viny0 = (g_viny0+g_vy_min) >> 1;
// 判断触摸输入是否有效
if((g_vinx0<VX_MIN_RANG) &&
(g_viny0<VY_MIN_RANG))
{ GUI_RectangleFill(0, 0, 0+20, 0+20, BLACK);
Beep();
break;
}
}
// 在坐标(299,219)上显示校准图标(十字光标),图标格式为20x20,校准点为(309,229)
GUI_LoadPic(299, 219, (uint8 *)CUR1_DATA, 20, 20);
// 读取触摸输入点坐标值,并判断值是否在合法的范围内
while(1)
{ // 读取触摸输入
GetLCD_XY(&g_vx_min, &g_vy_min);
DelayNS(50); // 延时50mS,防抖
GetLCD_XY(&g_vinx1, &g_viny1);
// 判断触摸输入是否有效
if((g_vy_min<3) || (g_viny1<3)) continue;
if(g_vinx1>g_vx_min)
{ if((g_vinx1-g_vx_min) > 13) continue;
}
else
{ if((g_vx_min-g_vinx1) > 13) continue;
}
if(g_viny1>g_vy_min)
{ if((g_viny1-g_vy_min) > 18) continue;
}
else
{ if((g_vy_min-g_viny1) > 18) continue;
}
// 取得两次触摸输入的平均值
g_vinx1 = (g_vinx1+g_vx_min) >> 1;
g_viny1 = (g_viny1+g_vy_min) >> 1;
// 判断触摸输入是否有效
if((g_vinx1>VX_MAX_RANG) &&
(g_viny1>VY_MAX_RANG))
{ GUI_RectangleFill(299, 219, 299+20, 219+20, BLACK);
Beep();
break;
}
}
// 对数据进行转换,以便于得到(0,0)点的电压值
g_vx_min = g_vinx0 - (g_vinx1 - g_vinx0) * 10 / (309 - 10);
g_vy_min = g_viny0 - (g_viny1 - g_viny0) * 10 / (229 - 10);
}
/*******************************************************
* 名称: GUI_DispPic
* 功能: 指定位置显示图片(图片大小为w、h)。
* 入口参数: x,y 更新区域的起始点
* w,h 区域宽度和高度
* buffer 显示数据缓冲区
* 出口参数: 无
* 说明:不能正确显示,指定的起始点不对,或高度、宽度超出
* 液晶显示范围。
*******************************************************/
void GUI_DispPic( uint16 x, uint16 y,
uint16 w, uint16 h,
uint8 *buffer)
{
int i, j;
volatile uint16 *DAT_Point;
uint32 lcm_addr; // 液晶显示地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -