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位数据 } }
//********************************************************************** // 有反白显示功能的打点函数:(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); //恢复到基本指令集 }