杭州清达光电技术有限公司

12年

杭州清达光电技术有限公司

卖家积分:21001分-22000分营业执照:已审核经营模式:原厂制造商所在地区:浙江 杭州

收藏本公司 人气:1135617

企业档案

  • 相关证件:营业执照已审核 
  • 会员类型:
  • 会员年限:12年
  • 卢小姐 QQ:752574498
  • 电话:13506715842
  • 手机:13506715842
  • 阿库IM:
  • 地址:杭州市余杭区仁和街道永泰路2号22幢
  • E-mail:752574498@qq.com

您的当前位置:

杭州清达光电技术有限公司 > 技术资料 > HG3202407演示程序

HG3202407演示程序

发布时间: 2016/10/21 11:23:15 | 765 次阅读

#include <reg51.h>
#include <stdio.h>
#include <intrins.h>


#define  uchar unsigned char
#define  uint unsigned int
#define  ushort unsigned short
#define  ulong unsigned long
#define   DATA_BUS P1
/*
sbit   RST=P3^5;
sbit   A0= P3^4;
sbit   INTI=P3^7;
sbit   _CS=P3^3;
sbit   _WR=P3^0;
sbit   _RD=P3^1;
sbit   BUSY=P3^6 ;
*/
sbit   _WR=P3^0;
sbit   _RD=P3^1;
sbit   _CS=P3^2;   //CE
sbit   A0= P3^3;   //REST
sbit   RST=P3^4;
sbit   BUSY=P3^5 ; 
sbit   INTI=P3^6;
uchar code tab[]={"杭州清达光电技术有限, 杭州佳显科技有限公司: 欢迎来自五湖四海的客户。"};
/***延时子程序***/
void delay3us(uchar m)
 {
     while(m--);
 }
void delay10us(uchar m)
 {  uchar i;
 for(i=0;i<4;i++)
    delay3us(m);
 }
void delay1ms(uchar m)
 {  uchar i;
 for(i=0;i<102;i++)
    delay3us(m);
 }
void delay100ms(uchar m)
 {  uchar i;
 for(i=0;i<102;i++)
    delay1ms(m);
 }
/****复位子程序****/
void LCD_Reset(void)
{
RST = 0;
  delay1ms(5);
RST = 1;
delay1ms(5);
}


/**读指令数据子程序**/
uchar LCD_CmdRead(void)
{
    uchar dat;
    DATA_BUS=0xff;
    _WR=1;
    _CS=1;
    _CS=0;
    _nop_();
    A0=1;
    _nop_();
    _RD=0;
    _nop_();
    dat=DATA_BUS;
    _nop_();_nop_();
    _CS=1;
    A0=0;
    return dat;
 }
/****读数据子程序*******/
uchar LCD_DataRead(void)
{
    uchar dat;
    DATA_BUS=0xff;
    _WR=1;
    _CS=1;
    _CS=0;
    _nop_();
    A0=0;
    _nop_();
    _RD=0;
    _nop_();
    dat=DATA_BUS;
    _nop_();_nop_();
    _CS=1;
    A0=1;
    return dat;
 }
/****   忙****/
void LCD_ChkBusy(void)
{
  uchar temp;
  do
  {
  temp = LCD_CmdRead();
  }while(temp & 0xc0);
}
void IO_Busy(void)
{
  do
  {}
  while(BUSY);
}
/**** 写入指令子程序****/
void LCD_CmdWrite(uchar cmd)
 {
  _RD=1;
  _CS=1;
  _CS=0;
  _nop_();
  _WR=0;
  _nop_();
  A0=1;
  _nop_();
  DATA_BUS=cmd;
  _nop_();_nop_();
  _WR=1;
  _CS=1;
  A0=0;
 }
/****  写入数据子程序****/
void LCD_DataWrite(uchar cmd)
 {
  _RD=1;
  _CS=1;
  _CS=0;
  _nop_();
  _WR=0;
  _nop_();
  A0=1;
  _nop_();
  DATA_BUS=cmd;
  _nop_();_nop_();
  _WR=1;
  _CS=1;
  A0=1;
 }


/*****LCD显示控制******/
void LCD_WLCR(uchar temp)
{
  LCD_CmdWrite(0x00);
  LCD_DataWrite(temp);
}
/***** 扫描控制******/
void LCD_MISC(uchar temp)
{
  LCD_CmdWrite(0x01);
  LCD_DataWrite(temp);
}
/** 卷动显示控制 *****/
void LCD_ADSR(uchar temp)
{
  LCD_CmdWrite(0x03);
  LCD_DataWrite(temp);
}
/** 中断状态控制 ***/
void LCD_INTR(uchar temp)
{
  LCD_CmdWrite(0x0f);
  LCD_DataWrite(temp);
}
/**光标显示控制 **/
void LCD_WCCR(uchar temp)
{
  LCD_CmdWrite(0x10);
  LCD_DataWrite(temp);
}
/** 光标显示控制***/
void LCD_CHWI(uchar temp)
{
  LCD_CmdWrite(0x11);
  LCD_DataWrite(temp);
}
/**选择显示区域控制*****/
void LCD_MAMR(uchar temp)
{
  LCD_CmdWrite(0x12);
  LCD_DataWrite(temp);
}
/** 右边边界显示控制(工作窗)**/
void LCD_AWRR(uchar temp)
{
  LCD_CmdWrite(0x20);
  LCD_DataWrite(temp);
}
/**宽度显示控制(显示窗) ***/
void LCD_DWWR(uchar temp)
{
  LCD_CmdWrite(0x21);
  LCD_DataWrite(temp);
}
/***下方边界显示控制***/
void LCD_AWBR(uchar temp)
{
  LCD_CmdWrite(0x30);
  LCD_DataWrite(temp);
}
/***高度显示控制***/
void LCD_DWHR(uchar temp)
{
  LCD_CmdWrite(0x31);
  LCD_DataWrite(temp);
}
/****设定工作窗口****/
void LCD_AWLR(uchar temp)
{
  LCD_CmdWrite(0x40);
  LCD_DataWrite(temp);
}
/**设定工作窗口***/
void LCD_AWTR(uchar temp)
{
  LCD_CmdWrite(0x50);
  LCD_DataWrite(temp);
}
/***设定于卷动模式下Segment 的起始位置**/
void LCD_BGSG(uchar temp)
{
  LCD_CmdWrite(0x61);
  LCD_DataWrite(temp);
}
/**设定于卷动模式下Segment的终点位置E***/
void LCD_EDSG(uchar temp)
{
  LCD_CmdWrite(0x62);
  LCD_DataWrite(temp);
}
/**设定卷动模式下Common 的起始位置**/
void LCD_BGCM(uchar temp)
{
  LCD_CmdWrite(0x71);
  LCD_DataWrite(temp);
}
/**设定卷动模式下Common的终点位置***/
void LCD_EDCM(uchar temp)
{
  LCD_CmdWrite(0x72);
  LCD_DataWrite(temp);
}
/*设定光标闪烁和卷动时间周期**/
void LCD_BTMR(uchar temp)
{
  LCD_CmdWrite(0x80);
  LCD_DataWrite(temp);
}
/***空闲时间(idle time)设定 */
void LCD_ITCR(uchar temp)
{
  LCD_CmdWrite(0x90);
  LCD_DataWrite(temp);
}
/**触控扫瞄功能**/
void LCD_TPCR1(uchar temp)
{
  LCD_CmdWrite(0xc0);
  LCD_DataWrite(temp);
}
/**触控扫瞄X资料***/
void LCD_TPXR(uchar temp)
{
  LCD_CmdWrite(0xc1);
  LCD_DataWrite(temp);
}
/**触控扫瞄y资料**/
void LCD_TPYR(uchar temp)
{
  LCD_CmdWrite(0xc2);
  LCD_DataWrite(temp);
}
/**触控扫瞄 x,Y 资料**/
void LCD_TPZR(uchar temp)
{
  LCD_CmdWrite(0xc3);
  LCD_DataWrite(temp);
}
/**触控扫瞄手动模式开启或自动模式**/
void LCD_TPCR2(uchar temp)
{
  LCD_CmdWrite(0xc4);
  LCD_DataWrite(temp);
}
/***脉波宽度调变(PWM)开启或关闭**/
void LCD_PWM (uchar temp)
{
  LCD_CmdWrite(0xd0);
  LCD_DataWrite(temp);
}
/**PWM 责任周期(Cycle Duty)选择 **/
void LCD_PDCR(uchar temp)
{
  LCD_CmdWrite(0xd1);
  LCD_DataWrite(temp);
}
/****字体类型控制*****/
void LCD_FNCR(uchar temp)
{
  LCD_CmdWrite(0xf0);
  LCD_DataWrite(temp);
}


/**设定X Y 位置坐标。*/
void LCD_XY(uchar x,uchar y)
{
  LCD_CmdWrite(0x60);
  LCD_DataWrite((x & 0x3f));
  delay3us(1);
  LCD_CmdWrite(0x70);
  LCD_DataWrite((y & 0xff));
  delay3us(1);
}
/***设定放大倍数 水平h  v **/
void zoom(uchar h,uchar v)
{
  uchar dat1,dat2;
  dat1=h & 0xc0;
  dat2=v & 0x30;
 LCD_CmdWrite(0xf1);
 LCD_DataWrite(dat1|dat2);
}
/** 清除子程序 **/
void  clear(uchar m)
{
   uchar i,j;
   LCD_MAMR(0x33);                //双图层显示模式 同时存取DDRAM1和 DDRAM2。
   LCD_WCCR(0x00);          //关闭90度
   LCD_MISC(0x00);                //com 0-239
   LCD_WLCR(0x04);                //图形方式


   LCD_XY(0,0);                   //X Y 地址
   LCD_CmdWrite(0xb0);           //写入
   for(i=0;i<240;i++)
   for(j=0;j<40;j++)
   {
   LCD_DataWrite(m);
   }
}
/**初始化子程序**/
void LCD_Initial(void)
 {
  LCD_WLCR(0x00);                //图形方式
  LCD_MISC(0x00);                //com 0-239 seg0-319
  LCD_ADSR(0x00);                // 关卷动
  LCD_INTR(0x00);                // 关中断
  LCD_WCCR(0x00);                // 字体正常  关闭90度
  LCD_CHWI(0x00);               // 游标高度为1 pixel。 间距为 1 pixel。
  LCD_MAMR(0x33);                //双图层显示模式 同时存取DDRAM1和 DDRAM2。


  /**显示域设定**/
  LCD_AWRR(0x27);
  LCD_DWWR(0x27);
  LCD_AWBR(0xef);
  LCD_DWHR(0xef);
  LCD_AWLR(0x00);
  LCD_AWTR(0x00);
  /**参数设定**/
  LCD_XY(0,0);
  LCD_BTMR(0x20);             //设定光标闪烁和卷动时间周期
  LCD_ITCR(0xda);             //空闲时间(idle time)设定
  LCD_PWM(0x00);              //脉波宽度调变(PWM)开启或关闭
  LCD_PDCR(0x00);             //PWM 责任周期(Cycle Duty)选择
  LCD_FNCR(0x00);             //字体类型控制
  zoom(0,0);                  //字体大小控制


  LCD_CmdWrite(0xe0);           //清除
  LCD_DataWrite(0x00);
  LCD_FNCR(0x08);             //字体类型控制
  clear(0x00);
  LCD_WLCR(0x04);            //开显示
 }
/**********直接调用汉字********/
void Write_DDRAM(uchar x,uchar y,uchar *p)
{
  //LCD_MAMR(0x33);                //双图层显示模式 同时存取DDRAM1和 DDRAM2。
  LCD_WLCR(0x0c);            //开显示  文本模式


    LCD_XY(x,y);
    LCD_CmdWrite(0xb0);
    while(*p>0)
    {
     LCD_DataWrite(*p);++p;
     }
}
void LCD_ShowStr(unsigned char *text,unsigned int t)
{
LCD_CmdWrite(0xb0);
    while(*text != '\0')
{
    LCD_DataWrite(*text);
    ++text;


   delay1ms(t);
    }
}
/*******ASCILL表*******/
void Print_Hex(uchar buf)
{
uchar temp;
temp=buf;
temp = (temp >>4) & 0x0F; //高四位,ASCILL调整
if(temp < 0x0A)
{
temp |= 0x30;
}
else temp = temp + 0x37;
LCD_DataWrite(temp);
delay1ms(1);


temp=buf;
temp = temp & 0x0F; //低四位 ASCILL调整
if(temp < 0x0A)
{
temp |= 0x30;
}
else temp = temp + 0x37;
LCD_DataWrite(temp);
delay1ms(1);
}
/**触摸控制读取X资料**/
uchar ADC_X1(void)
{      /// 触控扫瞄X资料 Bit[9:2]
uchar temp;
LCD_CmdWrite(0xc1);
temp=LCD_DataRead();
delay1ms(10);
return temp;
}
/**触摸控制读取Y资料****/
uchar ADC_Y1(void)
{
uchar temp; /// 触控扫瞄Y资料 Bit[9:2]


LCD_CmdWrite(0xc2);
temp=LCD_DataRead();
delay1ms(10);
return temp;
}
/** 触摸屏*****/
void Display_Touch(void)
{
uchar Debounce_count = 0;
uchar temp2,X1,Y1,X2,Y2;
int Timer_count = 0;


        LCD_WLCR(0x0c);            //开显示  文本模式
        zoom(2,2);
LCD_CmdWrite(0xb0);
        Write_DDRAM(4,45,"Touch-Panel Test");


zoom(0,0);
LCD_CmdWrite(0xb0);
        Write_DDRAM(0,220,"  No touch for 10 sec, exit touch mode  ");


LCD_MAMR(0x11);           //DDRAM1


LCD_CmdWrite(0xC0); // 开触摸中断
LCD_DataWrite(0xC4);
        LCD_CmdWrite(0xC4); // 选择自动模式
LCD_DataWrite(0x00);


while(1)
{
  Debounce_count = 0; //去抖时间设定


  LCD_CmdWrite(0x0f);     //清中断
LCD_DataWrite(0x00);
delay1ms(10);


  LCD_CmdWrite(0x0f);
temp2 = LCD_DataRead();


if((temp2 & 0x01) == 0x01) //检设到触模
{
X1 = ADC_X1();
Y1 = ADC_Y1();
        delay1ms(2);


//===================================================
        // Debounce The Touch State   Read Twice
//===================================================
if((X1 > 0x18)&&(X1 < 0xF0)&&(Y1 > 0x1B)&&(Y1 < 0xEA))
{
  do
{
X2 = ADC_X1();    // X2 and Y2 坐标
Y2 = ADC_Y1();
delay1ms(2);


if((X2 == X1)&&(Y2 == Y1))  
{
X1 = X2;
Y1 = Y2;
}
        Debounce_count++;    


if(Debounce_count == 2)  // 两次读取
{
if((X1 != 0)||(Y1 != 0)) 
{
LCD_WLCR(0x0c);            //开显示  文本模式
LCD_XY(13, 112);
LCD_CmdWrite(0xb0);
LCD_ShowStr("X = ",1);
LCD_XY(17, 112);
LCD_CmdWrite(0xb0);
Print_Hex(X1); // 显示 X 坐标
        LCD_XY(21, 112);
LCD_CmdWrite(0xb0);
LCD_ShowStr("Y = ",1);
LCD_XY(25, 112);
LCD_CmdWrite(0xb0);
Print_Hex(Y1); //  显示 Y 坐标
Timer_count = 0;
}
Debounce_count = 0; //
        LCD_CmdWrite(0x0f); // 清除触摸中断
LCD_DataWrite(0x00);
break;
}


LCD_CmdWrite(0x0f); // 清除触摸中断
LCD_DataWrite(0x00);
delay1ms(10);


LCD_CmdWrite(0x0f); // 检设触摸状态
temp2 = LCD_DataRead();


}while((temp2 & 0x01) == 0x01); // 退出触摸模式


}// The end of if((X1 > 0x18)&&(X1 < 0xF0)&&(Y1 > 0x1B)&&(Y1 < 0xEA))


LCD_CmdWrite(0x0f); // 清除触摸中断
LCD_DataWrite(0x00);
}
/*10秒没有触摸 自动退出 触摸状态*/
else
{
delay1ms(1);
Timer_count++;
if(Timer_count == 350)
{
Timer_count = 0;
break;               
}
}
}
}
/***主程序**/
void main()
{
  LCD_Reset();
  LCD_Initial();
  ///Display_Touch();
  Write_DDRAM(0,40,tab);
  zoom(2,2);
  Write_DDRAM(0,80,"HG3202407");
  while(1);
}