📄 touch15x20d.c
字号:
//=============================================================
//OCMJ15X20D触摸屏中断程序
//当触摸事件发生时模块产生中断经INT脚输出信号触发MCU的外部中断0
//=============================================================
//=============================================
#include <reg52.h>
//=============================================
sbit lcd_rs =P3^0; //L:存取缓存器,H:存取DDRAM
sbit lcd_wr =P3^1; //L有效
sbit lcd_rd =P3^6; //L有效
sbit lcd_cs1 =P3^3; //L有效
sbit lcd_cs2 =P3^4; //H有效(可直接上拉)
sbit lcd_busy =P3^5;
sbit lcd_int =P3^2; //接MCU的INT0
sbit lcd_rst =P3^7; //L有效(可悬空)
#define lcd_regname P1
#define lcd_regdata P1
#define lcd_regnada P1
#define lcd_data P1
#define lcd_control P3
#define uchar unsigned char
#define uint unsigned int
//=============================================
uchar code inittab1[]={
0x00,0x01,0x02,0x03,0x10,0x11,0x12,0x21,0x31,0x41,0x51,0x20,0x30,0x40,0x50,0x60,
0x61,0x70,0x71,0x72,0x80,0x81,0x91,0x90,0xA0,0xA1,0xA2,0xA3,0xB0,0xB1,0xC0,0xC1,
0xC8,0xC9,0xCA,0xD0,0xE0,0xF0,0xF1};
uchar code inittab2[]={
0xC9,0xE2,0x10,0x80,0x2B,0x00,0x91,0x27,0xEF,0x00,0x00,0x27,0xEF,0x00,0x00,0x00,
0x00,0x00,0x00,0xEF,0xAA,0x00,0x00,0x06,0x11,0x00,0x00,0x00,0x27,0xEF,0x00,0x36,
0x80,0x80,0x00,0x80,0x00,0xA0,0x1F};
uchar code tab1[]={
" 金鹏电子有限公司D系列液晶模块 "
" 触摸屏演示程序 "
" No-Touch!! "
" X= "
" Y= "};
uchar code tab2[]="No-Touch!!";
uchar code tab3[]="Touch-Now!";
uchar tabx[4];
uchar taby[4];
//=============================================
void delay_nop (int k)
{
int i;
for(i=0;i<k;i++);
}
void delay1ms (int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<123;j++);
}
//=============================================
void lcd_regwr(uchar regnada) small
{
lcd_regnada = regnada;
lcd_cs1 =0; // chip enable.
lcd_rd = 1; //
lcd_rs = 0; // rs = 0;
lcd_wr = 0; // wr = 0;
;
lcd_wr = 1; // wr = 1;
lcd_rs = 1; // rs = 1;
lcd_cs1 =1; // chip disable.
}
void lcd_regwrite(uchar regname,uchar regdata) small
{ //写资料到缓存器
lcd_regwr(regname);
delay_nop(1);
lcd_regwr(regdata);
}
//.............................................
void lcd_datawrite(uchar wrdata) small
{ //写资料到DDRAM
while(lcd_busy == 0);
lcd_data = wrdata;
lcd_cs1 =0; // chip enable.
lcd_rd = 1; //
lcd_rs = 1; // rs = 1;
lcd_wr = 0; // wr = 0;
;
lcd_wr = 1; // wr = 1;
lcd_rs = 1; // rs = 1;
lcd_cs1 =1; // chip disable.
}
//.............................................
uchar lcd_regread(uchar regname) small
{ //读缓存器
uchar reg_rddata;
lcd_regwr(regname);
lcd_data = 0xff;
lcd_cs1 =0; // chip enable.
lcd_wr = 1; // wr = 1;
lcd_rs = 0; // rs = 0;
lcd_rd = 0; // rd = 0;
;
reg_rddata = lcd_data;
lcd_rd = 1; // rd = 1;
lcd_rs = 1; // rs = 1;
lcd_cs1 =1; // chip disable.
return(reg_rddata);
}
//=============================================
void lcd_reset(void) small
{ //上电复位
delay1ms(240); // delay 240ms 等待上电复位
lcd_control = 0xff; // lcd_rs/wr/rd/cs1/cs2 normal - skeep high.
}
//.............................................
void lcd_initial(void) small
{ //初始化
uchar i;
for(i=0;i<39;i++)
{
lcd_regwrite(inittab1[i],inittab2[i]);
}
}
//.............................................
void lcd_clear(void) small
{ //清屏
uchar reg_rddata;
lcd_regwrite(0xe0,0x00);
reg_rddata = lcd_regread(0xf0);
reg_rddata |= 0x08;
lcd_regwrite(0xf0,reg_rddata);
}
//.............................................
void lcd_character(uchar code *cha,uint count) small
{ //显示中文或字符
uint i;
for(i=0;i<count;i++)
{
lcd_datawrite(*cha);
++cha;
}
}
//.............................................
void gotoxy(uchar x,uchar y) small
{ //定坐标
lcd_regwrite(0x60,x); // active window top register(awtr)
lcd_regwrite(0x70,y); // active window top register(awtr)
}
//=============================================
uchar touch_test(void) small
{
uchar reg_rddata,reg_rddata1;
reg_rddata = lcd_regread(0xc0);
reg_rddata &= 0xf8;
reg_rddata |= 0x08;
lcd_regwrite(0xc0,reg_rddata);
delay1ms (6);
reg_rddata1 = lcd_regread(0xc1);
reg_rddata &= 0xf7;
lcd_regwrite(0xc0,reg_rddata);
return(reg_rddata1);
}
//.............................................
uint touch_x(void) small
{
uchar reg_rddata,touchxl;
uint touchx;
reg_rddata = lcd_regread(0xc0);
reg_rddata &= 0xf3;
reg_rddata |= 0x03;//bit3=0,bit2=0,bit1=1,bit0=1;switch sw3 OFF,switch sw2 OFF switch sw1 ON,swithc sw0 ON
lcd_regwrite(0xc0,reg_rddata);
delay1ms (6);
touchx = lcd_regread(0xc8); //TPXR
touchxl = (lcd_regread(0xca)&0xc0); //TPZR
touchx = (touchx<<2)|(touchxl>>6);
return(touchx);
}
//.............................................
uint touch_y(void) small
{
uchar reg_rddata,touchyl;
uint touchy;
reg_rddata = lcd_regread(0xc0);
reg_rddata &= 0xfc;
reg_rddata |= 0x0c;//bit3=1,bit2=1,bit1=0,bit0=0;switch sw3 ON,switch sw2 ON switch sw1 OFF,swithc sw0 OFF
lcd_regwrite(0xc0,reg_rddata);
delay1ms (6);
touchy = lcd_regread(0xc9); //TPYR
touchyl = (lcd_regread(0xca)&0x0c); //TPZR
touchy = (touchy<<2)|(touchyl>>2);
return(touchy);
}
//.............................................
void get_touch(void) small
{
uchar reg_rddata,i;
uint touchx,touchy;
lcd_regwrite(0xc0,0xc0); //触摸屏功能激活,致能触摸屏资料输出
delay1ms (6);
if((touch_test() & 0x40)) //检测是否有触摸
{
while(!(lcd_regread(0xc1) & 0x80));//等待ADC转换完成
touchy = touch_y();
touchx = touch_x();
tabx[0] = touchx/1000;
tabx[1] = (touchx%1000)/100;
tabx[2] = ((touchx%1000)%100)/10;
tabx[3] = ((touchx%1000)%100)%10;
taby[0] = touchy/1000;
taby[1] = (touchy%1000)/100;
taby[2] = ((touchy%1000)%100)/10;
taby[3] = ((touchy%1000)%100)%10;
reg_rddata = lcd_regread(0x10);
reg_rddata |= 0x10; //粗体显示
lcd_regwrite(0x10,reg_rddata);
gotoxy(0x0f,0x40);
lcd_character(tab3,10);
gotoxy(0x13,0x60);
for(i=0;i<4;i++)
{
lcd_datawrite(tabx[i]+0x30);
}
gotoxy(0x13,0x80);
for(i=0;i<4;i++)
{
lcd_datawrite(taby[i]+0x30);
}
reg_rddata = lcd_regread(0x10);
reg_rddata &= 0xef; //正常字体
lcd_regwrite(0x10,reg_rddata);
delay1ms (240);
}
lcd_regwrite(0xc0,0x00); //TOUCH OFF
gotoxy(0x0f,0x40);
lcd_character(tab2,10);
}
//.............................................
void int_0 (void) interrupt 0
{
uchar reg_rddata;
reg_rddata = lcd_regread(0xa0);
if(reg_rddata & 0x40) //触摸屏幕有侦测到触摸(touch)
{
reg_rddata = lcd_regread(0xa0);
reg_rddata &= 0xfb; //禁能触摸中断
lcd_regwrite(0xa0,reg_rddata);
get_touch();
}
reg_rddata = lcd_regread(0xa0);
reg_rddata |= 0x04; //致能触摸中断
lcd_regwrite(0xa0,reg_rddata);
}
//=============================================
void main (void)
{
uchar reg_rddata;
lcd_reset();
lcd_initial();
lcd_clear();
lcd_regwrite(0x00,0xcd);
gotoxy(0x00,0x00);
lcd_character(tab1,180);
reg_rddata = lcd_regread(0xa0);
reg_rddata |= 0x04; //致能触摸中断
lcd_regwrite(0xa0,reg_rddata);
IT0=1;
EA=1;
EX0=1;
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -