⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 touch15x20d.c

📁 c8051f410写8803液晶的程序
💻 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 + -