📄 main.c
字号:
g_vx_min = g_vinx0 - (g_vinx1 - g_vinx0) * 10 / (309 - 10);
g_vy_min = g_viny0 - (g_viny1 - g_viny0) * 10 / (229 - 10);
}
/****************************************************************************
* 名称:DispCommButton()
* 功能:在屏幕上显示“保存”、“重新校准”按钮。
* 图片大小为70*70,显示位置为(250,0)--(319,69)
* 入口参数:无
* 出口参数:无
****************************************************************************/
void DispCommButton(void)
{ volatile uint16 *DAT_Point;
uint8 *p_dat;
uint32 i, j;
// 取得图片数据的地址和液晶屏显示缓冲区的地址
p_dat = gImage_save_rst;
DAT_Point = (void *) S1D13503_DAT;
// 填充按钮图片数据
for(i=0; i<70; i++)
{ DAT_Point = DAT_Point + (320-70); // 指向行的第1填充点 (x, 250)
for(j=0; j<70; j++) // 图片宽度为70点
{ *DAT_Point = *p_dat; // 发送图片数据
DAT_Point++;
p_dat++;
}
}
}
/****************************************************************************
* 名称:SaveChkData()
* 功能:将触摸屏校准的数据保存到E2PROM中,保存地址为0xE0--0xFF。
* 入口参数:无
* 出口参数:无
* 说明:0xE0、0xE1保存触摸屏是否校准标志,为0x5A、0xA5时表示校准过;
*
* 0xE2、0xE3保存(0,0)点坐标的电压转换值g_vx_min;
* 0xE4、0xE5保存(0,0)点坐标的电压转换值g_vy_min;
* 0xE6、0xE7保存第1个校验点的电压转换值g_vinx0;
* 0xE8、0xE9保存第1个校验点的电压转换值g_viny0;
* 0xEA、0xEB保存第2个校验点的电压转换值g_vinx1;
* 0xEC、0xED保存第2个校验点的电压转换值g_viny1;
*
* 0xF0、0xF1保存第1、2校验点之间的x轴点数wide;
* 0xF2、0xF4保存第1、2校验点之间的y轴点数high;
*
* 其它单元保留。
****************************************************************************/
void SaveChkData(void)
{ uint8 dat_buf1[20];
uint8 dat_buf2[20];
int i;
// 设置数据
dat_buf1[0] = 0x5A; // 校准标志
dat_buf1[1] = 0xA5;
dat_buf1[2] = g_vx_min >> 8;
dat_buf1[3] = g_vx_min & 0x00FF;
dat_buf1[4] = g_vy_min >> 8;
dat_buf1[5] = g_vy_min & 0x00FF;
dat_buf1[6] = g_vinx0 >> 8;
dat_buf1[7] = g_vinx0 & 0x00FF;
dat_buf1[8] = g_viny0 >> 8;
dat_buf1[9] = g_viny0 & 0x00FF;
dat_buf1[10] = g_vinx1 >> 8;
dat_buf1[11] = g_vinx1 & 0x00FF;
dat_buf1[12] = g_viny1 >> 8;
dat_buf1[13] = g_viny1 & 0x00FF;
dat_buf1[14] = 0x01; // 值为309 - 10,即0x012B
dat_buf1[15] = 0x2B;
dat_buf1[16] = 0x00; // 值为229 - 10,即0x00DB
dat_buf1[17] = 0xDB;
// 写入数据
ISendStr(CAT1025, 0xE0, dat_buf1, 14);
DelayNS(10); // 10mS写周期
ISendStr(CAT1025, 0xF0, &dat_buf1[14], 4);
DelayNS(10); // 10mS写周期
// 读出校验,若出错,则控制蜂鸣器响5声
IRcvStr(CAT1025, 0xE0, dat_buf2, 14);
IRcvStr(CAT1025, 0xF0, &dat_buf2[14], 4);
for(i=0; i<18; i++)
{ if(dat_buf2[i] != dat_buf1[i])
{ Beep();
Beep();
Beep();
Beep();
Beep();
break;
}
}
}
/****************************************************************************
* 名称:I2C_Init()
* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
* 入口参数:fi2c 初始化I2C总线速率,最大值为400K
* 出口参数:无
****************************************************************************/
void I2C_Init(uint32 fi2c)
{ if(fi2c>400000) fi2c = 400000;
PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效
I2SCLH = (Fpclk/fi2c + 1) / 2; // 设置I2C时钟为fi2c
I2SCLL = (Fpclk/fi2c) / 2;
I2CONCLR = 0x2C;
I2CONSET = 0x40; // 使能主I2C
/* 设置I2C中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x29; // I2C通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_I2C; // 设置I2C中断向量地址
VICIntEnable = 0x0200; // 使能I2C中断
}
uint32 t0_time;
/****************************************************************************
* 名称:TestDelayNS()
* 功能:测试DelayNS函数的延时时间。通过观察t0_time的值计算出实际延时时间。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void TestDelayNS(void)
{ int i;
T0PR = 0; // 设置定时器0分频为1分频,计数频率为Fpclk
for(i=0; i<10; i++)
{ T0TC = 0;
T0TCR = 0x01; // 启动定计器
DelayNS(1); // 调用软件延时
T0TCR = 0x00; // 停止定时器
t0_time = T0TC; // 读取定时计数值
}
}
/****************************************************************************
* 名称:main()
* 功能:触摸屏校准,并将校准参数保存到E2PROM中。
****************************************************************************/
int main(void)
{ int x1, y1;
uint16 x1_bak, y1_bak;
uint16 vx1, vy1;
// 测试软件延时函数延时时间
TestDelayNS();
// 初始化控制I/O
PINSEL0 = PINSEL0 & 0xFFFFCFFF;
IO0DIR = BEEPCON;
IO0SET = BEEPCON;
IO2DIR = ADS7843_CS|ADS7843_DIN|ADS7843_DCLK;
GUI_Initialize(); // 初始化LCM
GUI_SetColor(DGRAY, BLACK); // 设置前景色和背景色
I2C_Init(100000); // 初始化I2C
IRQEnable(); // 使能IRQ中断
while(1)
{ GUI_ClearSCR(); // 清屏
// 进入触摸屏幕校准程序,会设置g_vx_min、g_vy_min和g_vinx0、g_viny0、
// g_vinx1、g_viny1的值。
ChkTouch();
// 显示操作按钮
DispCommButton();
// 显示原始光标
GUI_LoadPic(0, 0, (uint8 *)CUR_DATA, 32, 32);
x1_bak = y1_bak = 0;
// 读取触摸屏输入,在相应位置上显示光标
while(1)
{ // 读取新的触摸点
GetLCD_XY(&vx1, &vy1);
// 转换坐标值
x1 = (vx1 - g_vx_min) * (309 - 10) / (g_vinx1 - g_vinx0);
y1 = (vy1 - g_vy_min) * (229 - 10) / (g_viny1 - g_viny0);
if(x1<0) x1 = 0;
if(y1<0) y1 = 0;
if(x1>319) x1 = 319;
if(y1>239) y1 = 239;
// 判断是按钮命令
if( (x1>257) && (x1<315) &&
(y1>4) && (y1<27) ) // 参数保存
{ SaveChkData();
Beep();
}
if( (x1>257) && (x1<315) &&
(y1>40) && (y1<63) ) // 重新校准
{ Beep();
break;
}
// 不允许移动光标到屏幕上的按钮区(否则会破坏显示)
// 保护矩形区域为(320-70-35,0) -- (319, 70+5)
if((x1>215) && (y1<75)) continue;
// 删除上一次的光标显示
GUI_RectangleFill(x1_bak, y1_bak, x1_bak+32, y1_bak+32, BLACK);
// 显示光标
GUI_LoadPic(x1, y1, (uint8 *)CUR_DATA, 32, 32);
x1_bak = x1;
y1_bak = y1;
} // end of while(1)...
} // end of while(1)...
return(0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -