/*显示一个点
//==================================================================
//函数名: lcd_put_pixel()
//功能: 在座标(x, y)位置显示一个点。
//输入参数:(x, y): 要显示点的座标
p: 要显示点的值(0或1)
mode: 显示点的模式, 为下列值之一
DISP_MODE_PUT: 直接设置
DISP_MODE_OR: 与屏幕原有值“或取”后再写
DISP_MODE_XOR: 与屏幕原有值“异或”后再写
DISP_MODE_AND: 与屏幕原有值“与取”后再写
//返回值: 成功返回0,失败返回-1,超出屏幕范围返回OVER_RANGE
文件描述符未打开返回NO_FILDES,参数错误返回PARA_ERR
//注意事项:无
//=================================================================*/
- int lcd_put_pixel(unsigned char x, unsigned char y, unsigned char p, unsigned char mode)
- {
- /*第一步,参数检查,如果坐标在屏幕之外,则返回错误信息*/
- if ((x >= g_lcd_width)
- ||(y >= g_lcd_height))
- {
- return OVER_RANGE;
- }
- else if ((p != 0) && (p != 1))
- {
- return PARA_ERR;//p的参数有错
- }
- else
- {
- /*检查文件描述符是否被打开*/
- if (g_lcd_fildes < 0)//判断文件是否被打开
- {
- return NO_FILDES;//如果未打开,返回-2
- }
- else
- {
- unsigned int offset = (y * g_lcd_width + x);//起始偏移量
- unsigned char old_p = 0;
- unsigned char new_p = 0;
- if (mode != DISP_MODE_PUT)
- {
- if (lseek(g_lcd_fildes, offset, SEEK_SET) != offset)
- {
- return READ_ERR;//等待偏移量被成功设置
- }
- int result = lcd_read(g_lcd_fildes, &old_p, 1);//读取点的值,结果存放在p里
- if (result == API_ERR)
- {
- return READ_ERR;//无法读取原有的值
- }
- if (old_p > 0x00)
- {
- old_p = 0x01;
- }
- }
- /*根据不同的mode参数设置不同的写入值p*/
- switch (mode)
- {
- case DISP_MODE_PUT://直接设置
- {
- new_p = p * 0x0F;
- break;
- }
- case DISP_MODE_OR://求或
- {
- new_p = (old_p | p) * 0x0F;
- break;
- }
- case DISP_MODE_XOR://异或
- {
- new_p = (old_p ^ p) * 0x0F;
- break;
- }
- case DISP_MODE_AND://求与
- {
- new_p = (old_p & p) * 0x0F;
- break;
- }
- default:
- {
- return PARA_ERR;
- }
- }
- if (lseek(g_lcd_fildes, offset, SEEK_SET) != offset)
- {
- return WRITE_ERR;//等待偏移量被成功设置
- }
- int retval;
- retval = lcd_write(g_lcd_fildes, &new_p, 1);
- if (retval == API_ERR)
- {
- return WRITE_ERR;//如果写入结果为错误,则返回错误
- }
- /*将显示缓冲区的内容刷新到LCD*/
- if(lcd_flush_enable != 0)
- {
- retval = ioctl(g_lcd_fildes, LCD_IOC_DISPLAY);
- }
- if (retval < 0)
- {
- return IOCTL_ERR;
- }
- return API_OK;
- }
- }
- }