Ejemplo n.º 1
0
unsigned int Lcd_ReadPoint(uint16_t x, uint16_t y)
{
    unsigned int Data;
    Lcd_SetXY(x, y);

    Lcd_ReadData();
    Data=Lcd_ReadData();
    //Lcd_WriteData(Data);
    return Data;
}
/*****画点函数*****/
void Lcd_DrawPoint(u8 X,u8 Y,u8 Color )	  //0000 1111     0000 0000    
{
    u8 Row , Lie , Lie_bit    ;
    u8 ReadOldH, ReadOldL ;
    Lcd_WriteCmd(0x34);
    Lcd_WriteCmd(0x36);

    Lie=X>> 4 ;    							   //0000 0000		  右移4等同于除以16,得到大地址
    Lie_bit=X&0x0f ;						   //0000 1111		  15	得到小地址
    if(Y<32)
    {
        Row=Y;								  //0000 0000		   0
    }
    else
    {
        Row=Y-32;
        Lie+=8;
    }

    Lcd_WriteCmd(Row+0x80);						 //0
    Lcd_WriteCmd(Lie+0x80);					 //0

    Lcd_ReadData();		                 //虚读一次
    ReadOldH =Lcd_ReadData(); 
    ReadOldL =Lcd_ReadData(); 

    Lcd_WriteCmd(Row+0x80);
    Lcd_WriteCmd(Lie+0x80);

    if(Lie_bit<8)
    {
        switch( Color)
        {
            case 0 : ReadOldH&=(~(0x01<<(7-Lie_bit))) ; break;       //将该点变为0
            case 1 : ReadOldH|=(0x01<<(7-Lie_bit)); break;		      //将该点变为1
            case 2 : ReadOldH^=(0x01<<(7-Lie_bit )); break;		  //将该点翻转
            default : break ;    
        }
        Lcd_WriteData(ReadOldH) ;
        Lcd_WriteData(ReadOldL) ;
    }
    else
    {
        switch(Color)
        {
            case 0 : ReadOldL&=(~(0x01<<(15-Lie_bit)));break ;		   //将该点变为0
            case 1 : ReadOldL|=(0x01<<(15-Lie_bit));break ;		   //将该点变为1
            case 2 : ReadOldL^=(0x01<<(15-Lie_bit));break ;		//将该点翻转
            default : break ;
        }
        Lcd_WriteData(ReadOldH);
        Lcd_WriteData(ReadOldL);
    }
    Lcd_WriteCmd(0x30);
}
/******************************************************** 
 名称:GUI_Point(打点) 
 说明:X:横坐标(代表列的位置,0~127)    Y:纵坐标(代表行的位置,0~63) 
       根据Datesheet需先把数据写到GDRAM,读取当前位置的数据,经过或和移位后再把数据重新写入 
           GDRAM每行有16个位元,共64行,每个位元有两个8位(高低8位) 
           计算出在那个位元,在该位元的哪一位 
易出现的问题:1、打点位置的定位 
              2、读取当前显示的数据 
              3、或和移位,即重新写人的新数据 
********************************************************/ 
void GUI_Point(u8 x,u8 y,u8 flag) 
{       
   u8 x_Dyte,x_byte;                       //定义列地址的字节位,及在字节中的哪1位  
   u8 y_Dyte,y_byte;                       //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
   u8 GDRAM_hbit,GDRAM_lbit; 
   Lcd_WriteCmd(0x36);                       //绘图模式命令 
   /***X,Y坐标互换,即普通的X,Y坐标***/ 
   x_Dyte=x/16;                               //计算在16个字节中的哪一个 
   x_byte=x&0x0f;                             //计算在该字节中的哪一位 
   y_Dyte=y/32;                               //0为上半屏,1为下半屏 
   y_byte=y&0x1f;                             //计算在0~31当中的哪一行 
    
   Lcd_WriteCmd(0x80+y_byte);                //设定行地址(y坐标) 
   Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);       //设定列地址(x坐标),并通过8*y_Dyte选定上下屏 
                       
   Lcd_ReadData(); 
   GDRAM_hbit=Lcd_ReadData();                    //读取当前显示高8位数据 
   GDRAM_lbit=Lcd_ReadData();                    //读取当前显示低8位数据 
   delay_us(5); 
    
   if(flag==1) 
   {  
     Lcd_WriteCmd(0x80+y_byte);                //设定行地址(y坐标) 
     Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);       //设定列地址(x坐标),并通过8*y_Dyte选定上下屏 
     delay_us(5); 
         if(x_byte<8)                                   //判断其在高8位,还是在低8位 
     { 
          Lcd_WriteData(GDRAM_hbit|(0X01<<(7-x_byte)));   //显示GDRAM区高8位数据 
      Lcd_WriteData(GDRAM_lbit);                      //显示GDRAM区低8位数据  
         } 
         else 
         { 
          Lcd_WriteData(GDRAM_hbit); 
          Lcd_WriteData(GDRAM_lbit|(0x01<<(15-x_byte))); 
         }  
   } 
   else 
   { 
     Lcd_WriteData(0x00);                           //清除GDRAM区高8位数据 
     Lcd_WriteData(0x00);                           //清除GDRAM区低8位数据 
   }         
}
Ejemplo n.º 4
0
//**********************************************************************
//         有反白显示功能的打点函数:(X-水平位址,Y-竖直位址)
//**********************************************************************
void GUI_Point(unsigned char x,unsigned char y,unsigned char color)
{
    unsigned char x_Dyte,x_byte;		//定义列地址的字节位,及在字节中的哪1位
    unsigned char y_Dyte,y_byte;		//定义为上下两个屏(取值为0,1),行地址(取值为0~31)
    unsigned char GDRAM_hbit,GDRAM_lbit;
    Lcd_WriteCmd(0x36);		                //扩展指令命令
    x_Dyte=x/16;				//计算在16个字节中的哪一个
    x_byte=x&0x0f;				//计算在该字节中的哪一位
    y_Dyte=y/32;				//0为上半屏,1为下半屏
    y_byte=y&0x1f;				//计算在0~31当中的哪一行
    Lcd_WriteCmd(0x80+y_byte);			//设定行地址(y坐标)
    Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);		//设定列地址(x坐标)
    Lcd_ReadData();				//预读取数据
    GDRAM_hbit=Lcd_ReadData();			//读取当前显示高8位数据
    GDRAM_lbit=Lcd_ReadData();			//读取当前显示低8位数据
    Lcd_WriteCmd(0x80+y_byte);			//设定行地址(y坐标)
    Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);		//设定列地址(x坐标)
    if(x_byte<8)				//判断其在高8位,还是在低8位
    {
      if(color==1)
      {
        Lcd_WriteData(GDRAM_hbit|(0x01<<(7-x_byte)));//置位GDRAM区高8位数据中相应的点
      }
      else
        Lcd_WriteData(GDRAM_hbit&(~(0x01<<(7-x_byte))));//清除GDRAM区高8位数据中相应的点	
      Lcd_WriteData(GDRAM_lbit);		        //显示GDRAM区低8位数据
    }
    else
    {
      Lcd_WriteData(GDRAM_hbit);
      if(color==1)
        Lcd_WriteData(GDRAM_lbit|(0x01<<(15-x_byte)));//置位GDRAM区高8位数据中相应的点
      else
        Lcd_WriteData(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点
    }
    Lcd_WriteCmd(0x30);			        //恢复到基本指令集
}