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

📄 触摸屏实验_2.c

📁 触摸屏测试实验,AVR控制,使用ICC语言
💻 C
字号:
/****************************************************
* TOPWAY  使用商务通触摸屏的测试程序                *
* Date:2006/07/26                                   *
* By  :Zhangke                                      *
****************************************************/

#include <iom16v.h>
#include <macros.h>

#define   BusyCheck                 (PIND&0x40)             //Busy,PD6,忙标志
#define   CS                        PORTD &= (~0x20)        //_CS,PD5,片选
#define   CNS                       PORTD |= 0x20
#define   DisplayRegister           PORTD |= 0x10           //RS,PD4,寄存器选择
#define   CommandRegister           PORTD &= (~0x10)
#define   WriteEnable               PORTD &= (~0x08)        //_RW,PD3,写使能
#define   WriteDisable              PORTD |= 0x08
#define   ReadEnable                PORTD &= (~0x04)        //_RD,PD0,读使能
#define   ReadDisable               PORTD |= 0x04
#define   RST                       PORTD &= (~0x02)        //_RST,PD1,复位
#define   NotRST                    PORTD |= 0x02
#define   LCDBUS                    PORTC
#define   X_Touch                   PORTA = 0xE0;DDRA  = 0x5F;//PORTA = 0x40;DDRA  = 0x5F;
#define   Y_Touch                   PORTA = 0x70;DDRA  = 0xAF;//PORTA = 0x20;DDRA  = 0xAF;
#define   Touch_Detect              PORTA = 0x50;DDRA  = 0xAF;
#define   CLS_Key                   (PINB&0x10)             //清屏按键

char ReadData = 0;
char Wave[255] = {0};
char ii = 0;
char Cachefull = 0;
char VoltageX = 0;
char VoltageY = 0;
char DetectVoltage = 0;
char TouchState = 0;

void PORT_Init(void)
{
        X_Touch;
 	PORTB = 0xFF;
 	DDRB  = 0xEB;
 	PORTC = 0xFF;
 	DDRC  = 0xFF;
 	PORTD = 0xFF;
 	DDRD  = 0xBF;
}

void Delay(char DelayTimes)
{
   char i,k;
   for (i=0;i<DelayTimes;i++)
   {
     for (k=0;k<250;k++)
	  {
	     asm("nop");
	  }
   }   
}
void Delay2(int DelayTimes)
{
   int i,k;
   for (i=0;i<DelayTimes;i++)
   {
     for (k=0;k<2000;k++)
	  {
	     asm("nop");
	  }
   }   
}
/****************************************************
*  发送指令数据                                     *
****************************************************/
void SdCmd(char Command)
{
   CommandRegister;
   LCDBUS = Command;
   
   asm("nop");asm("nop");asm("nop");asm("nop");
   WriteEnable;
   asm("nop");asm("nop");asm("nop");asm("nop");
   WriteDisable;
}

/****************************************************
*  发送显示数据                                     *
****************************************************/
void SdData (char DisplayData)
{
   DisplayRegister;
   LCDBUS = DisplayData;

   WriteEnable;
   asm("nop");asm("nop");asm("nop");asm("nop");
   WriteDisable;
}

/****************************************************
*  显示文本信息                                     *
*  输入:   X       :横坐标。8个半角字符为单位 0-16*
*           Y       :列坐标。纵向1个像素为单位 0-64*
*           TextData:需要显示的数据。     <[240*64]*
****************************************************/
void DisplayTextScreen(char X,char Y,char *TextData)
{
   char i = 0;
   char j = 0;
   SdCmd(0x60);SdCmd(X);        //设置X地址为
   SdCmd(0x70);SdCmd(Y);        //设置Y地址为
   SdCmd(0x00);SdCmd(0xcd);     //正常供电模式,文本显示,显示开,正常显示
   while(*TextData)
   {  
      SdData(*(TextData++));
      Delay(1);
   }
}

void DEC_Num_Disp(char X,char Y,unsigned int Num,char Bit)
{
   char i   = 0;
   static char LCD_Buff[3] = {0};
   SdCmd(0x60);SdCmd(X);        //设置X地址为
   SdCmd(0x70);SdCmd(Y);        //设置Y地址为
   SdCmd(0x00);SdCmd(0xcd);     //正常供电模式,文本显示,显示开,正常显示
   for (i=0;i<Bit;i++)
   {
	  LCD_Buff[i] = Num%10;  
     Num = Num/10;
   }
   for (i=0;i<Bit;i++)
   { 
     SdData(LCD_Buff[Bit-1-i]+0x30);
     Delay(1);
   }   
}

void Point_Disp(char X,char Y,unsigned int Num,char Bit,char Point)
{
   unsigned char i   = 0;
   char LCD_Buff[4] = {0};
   SdCmd(0x60);SdCmd(X);        //设置X地址为
   SdCmd(0x70);SdCmd(Y);        //设置Y地址为
   SdCmd(0x00);SdCmd(0xcd);     //正常供电模式,文本显示,显示开,正常显示
   for (i=0 ; i<Bit ; i++)                           //依次把数据写入缓冲区中
   {
	  if(i==Point)                                     //插入小数点
	  {
		    LCD_Buff[i] = 0xfe;
		    i++;
	  }
	  LCD_Buff[i] = Num%10;
	  Num = Num/10;
   }
   for (i=0 ; i<Bit ; i++)                           //依次将缓冲区的数据显示
   {
      SdData(LCD_Buff[Bit-1-i]+0x30);
   } 

}

/****************************************************
*  显示图象信息                                     *
****************************************************/
void DisplayGraphyScreen(flash char *GraphyData)
{
   char TempData = 0;
   char i = 0;
   char j = 0;
   SdCmd(0x60);SdCmd(0x00);     //设置X地址为0
   SdCmd(0x70);SdCmd(0x00);     //设置Y地址为0
   SdCmd(0x00);SdCmd(0xc5);     //正常供电模式,图形模式,显示开,正常显示
   for (j=0;j<64;j++)
   {
      for (i=0;i<30;i++)
      {
         TempData = (*(GraphyData+(j*30)+i));
         SdData(TempData);
      }
   }
}

/****************************************************
*  清屏                                             *
****************************************************/
void CLS(void)
{
   int j = 0;
   SdCmd(0x60);SdCmd(0x00);     //设置X地址为0
   SdCmd(0x70);SdCmd(0x00);     //设置Y地址为0
   SdCmd(0x00);SdCmd(0xc5);     //正常供电模式,图形模式,显示开,正常显示
   for (j=0;j<1920;j++)
   {
      SdData(0);      
   }   
}

void Refresh(void)
{
   char i = 0;
   char j = 0;
   SdCmd(0x00);SdCmd(0xcd);     //正常供电模式,文本显示,显示开,正常显示
   for (i=0;i<8;i++)
   {  
      SdCmd(0x70);SdCmd(i<<3);     //设置Y地址
      for (j=14;j<30;j++)
      {
         SdCmd(0x60);SdCmd(j);     //设置X地址
         SdData(0x20);
      }   
   }
}
/****************************************************
*  读取指定坐标的数据                               *
*  返回:指定坐标显示的8位数据                      *
****************************************************/
void RdData(char X,char Y_Point)
{
   SdCmd(0x60);SdCmd(X);              //设置X地址
   SdCmd(0x70);SdCmd(Y_Point);        //设置Y地址 
   DDRC  = 0x00;
   WriteDisable;
   DisplayRegister;
   ReadDisable;
   ReadEnable;
   asm("nop");asm("nop");asm("nop");asm("nop");
   ReadData = PINC&0xff;
   DDRC = 0xff;
   ReadDisable;
}
/****************************************************
*  绘点函数                                         *
*  输入:   X    :点的横坐标  0-240                *
*           Y    :点的纵坐标  0-64                 *
*           State:0-绘点/1-清除                    *
****************************************************/
void Point (char X,char Y,char State)
{
   char X_Position = 0;
   
   while (X>7)
   {
      X_Position++;
      X = X-8;
   }
   RdData(X_Position,Y); 
   SdCmd(0x60);SdCmd(X_Position);        //设置X地址
   SdCmd(0x70);SdCmd(Y);                 //设置Y地址
   SdCmd(0x00);SdCmd(0xc5);              //正常供电模式,图形模式,显示开,正常显示
   if (State == 1)
   {
      SdData((0x80>>X)|ReadData);
   }
   else
   {
      SdData((~(0x80>>X))&ReadData);
   }            
}

void Clear (char X,char Y)
{
   char X_Position = 0;
   while (X>7)
   {
      X_Position++;
      X = X-8;
   }
   if (++X_Position>19)
   {
      X_Position = 0;
   }
   SdCmd(0x60);SdCmd(X_Position);          //设置X地址
   SdCmd(0x70);SdCmd(Y);                   //设置Y地址
   SdData(0);           
}

/****************************************************
*  LCD模块初始化                                    *
****************************************************/
void InitLCDModule(void)
{
   CS;
   NotRST;
   Delay(250);
   RST;
   Delay(250);
   Delay(250);
   NotRST;
   Delay(250);
   SdCmd(0x00);SdCmd(0xc5);      //LCD控制寄存器
   SdCmd(0x08);SdCmd(0x73);      //通用寄存器
   SdCmd(0x10);SdCmd(0xe9);      //光标控制寄存器
   SdCmd(0x18);SdCmd(0x20);      //光标大小控制寄存器
   SdCmd(0x20);SdCmd(0x1d);      //活动窗右边界寄存器
   SdCmd(0x28);SdCmd(0x1d);      //显示窗右边界寄存器
   SdCmd(0x30);SdCmd(0x3f);      //活动窗底部边界寄存器
   SdCmd(0x38);SdCmd(0x3f);      //显示窗底部边界寄存器
   SdCmd(0x40);SdCmd(0x00);      //活动窗左边界寄存器
   SdCmd(0x50);SdCmd(0x00);      //活动窗顶边界寄存器
   SdCmd(0x48);SdCmd(0x00);      //显示窗左边界寄存器
   SdCmd(0x58);SdCmd(0x00);      //显示窗顶部寄存器
   SdCmd(0x60);SdCmd(0x00);      //X方向光标寄存器
   SdCmd(0x70);SdCmd(0x00);      //Y方向光标寄存器
   SdCmd(0x80);SdCmd(0x2a);      //闪烁时间寄存器
   SdCmd(0x90);SdCmd(0x3e);      //移位时钟控制寄存器
   SdCmd(0xe0);SdCmd(0x00);      //数据模式寄存器
   SdCmd(0xf0);SdCmd(0xa0);      //字体控制寄存器
   Delay(20);
}

// Conversion time: 104uS
void adc_init(void)
{
   ADCSR = 0x00; //disable adc
   ADMUX = 0x27; //select adc input 2
   ACSR  = 0x80;
   ADCSR = 0xEF;
}

#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
    static char i = 0;
    static char k = 0;
    unsigned int AverageVoltage = 0;
    static char SampleVoltage[18] = {0};
    if(TouchState == 0)
    {
       if (k == 0)
       {
          Touch_Detect;
          ADMUX = 0x24;
       }
       k++;
       if(k > 3)
       {   
          DetectVoltage = ADCH;
          if(DetectVoltage>20)
          {
             TouchState = 0;                     //未被触摸
          } 
          else
          {
             TouchState = 1;                     //检测到被触摸
          }
          k=0;
       }
                  
    }
         
    if(TouchState == 1)
    {
       switch (i)
       {
          case 0:
             Y_Touch;
             break;
          case 4:
             ADMUX = 0x27; //select adc input 7
             SampleVoltage[i] = ADCH;
             X_Touch;
             break;            
          case 9:
             ADMUX = 0x24; //select adc input 4
             SampleVoltage[i] = ADCH;          
             break;
          default:
             break;   
       }
       i++;
       if(i>9)
       {
          TouchState = 0;
          VoltageY = SampleVoltage[4]>>2;
          VoltageX = SampleVoltage[9]>>1;
          i = 0;
       } 
    }   
}

//call this routine to initialize all peripherals
void init_devices(void)
{
   //stop errant interrupts until set up
   CLI(); //disable all interrupts
   PORT_Init();
   adc_init();

   MCUCR = 0x00;
   GICR  = 0x00;
   SEI(); 
   InitLCDModule();
}

void main(void)
{
   char X_Pixel = 0;
   char Stick   = 0;
   char X_Disappear = 0;
   char Y0 = 0;   
   char Y1 = 0;
   char OldState  = 0;
   char OldKeyNum = 0;

   init_devices();
   CLS();
   
   DisplayTextScreen(0,13," By E=mC2 ");
   DisplayTextScreen(0,0, "触摸屏测试实验");   
   DisplayTextScreen(0,32,"X-");
   DisplayTextScreen(0,48,"Y-");
   
   
   for (Stick=0;Stick<=64;Stick++)     
   {
      Point(111,Stick,1);
   }     
   
   while(1)
   {
      Point((VoltageX+111),VoltageY,1);
      DEC_Num_Disp(3,32,VoltageX,3);
      DEC_Num_Disp(3,48,VoltageY,3);
      DEC_Num_Disp(10,48,DetectVoltage,3);
      if(TouchState)
      {
         if (TouchState != OldState)
         {
            SdCmd(0x60);SdCmd(10);
            SdCmd(0x70);SdCmd(32);
            SdCmd(0x00);SdCmd(0xcd);
            SdData(0xa1);SdData(0xf6);       //Touched Signal
         }   
      }
      else
      {
         if (TouchState != OldState)
         {
            SdCmd(0x60);SdCmd(10);
            SdCmd(0x70);SdCmd(32);
            SdCmd(0x00);SdCmd(0xcd);
            SdData(0xa1);SdData(0xf5);       //Untouched Signal
         }   
      }
      OldState = TouchState;
      if((CLS_Key == 0x00)&&(CLS_Key != OldKeyNum))
      {
         Refresh();
         VoltageX = 0;
         VoltageY = 0;
      }
      OldKeyNum = CLS_Key;
   }
}
                      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -