|
160*160屏幕在电力上用的还挺多的,我手头这款驱动是uc16998u,它本是一款RGB屏的驱动,用来驱动黑白屏时,是把RGB当成3个像素点来操作的,所以画点函数稍显麻烦。
这里采用的是直接操作驱动器内部RAM实现的,因为画个点步骤太多,实际项目建议还是直接在内存中操作,采用刷屏的方式实现,贴出来供大家研究一下。
/**
* @brief 读写指定位置块像素
* 3个像素为一个操作单位,按照565格式组成一个16位数
* @param row :行
* @param col :列
* @param rw :0=读 1=写
* @param dat :写入的像素数据
* @retval 像素数据
*/
static uint16_t RWLcdRamVal(uint8_t row,uint8_t col,uint8_t rw,uint16_t dat)
{
uint16_t val;
/*
设置LCD内部RAM坐标
*/
col += 0x25;
LCD_Write_Com(0x0F & col);
LCD_Write_Com(0x10 | (col>>4));
LCD_Write_Com(0x60 | (0x0F & row));
LCD_Write_Com(0x70 | (row>>4));
if(!rw) /* 读 */
{
val = LCD_Read_Dat()<<8;
val |= LCD_Read_Dat();
}
else /* 写 */
{
LCD_Write_Dat(dat>>8);
LCD_Write_Dat(dat);
}
return val;
}
/**
* @brief 读点函数
* @param row :行
* @param col :列
* @retval 0=灭 1=亮
*/
uint8_t LcdReadPixel(uint8_t x,uint8_t y)
{
uint16_t dat;
dat = RWLcdRamVal(y,x/3,0,0); /* 获取所在组的3个像素点 */
if(dat&PixValMap[x%3])
{
return 1;
}
else
{
return 0;
}
}
/**
* @brief 画点函数
* 当前值若和新设置的值相同则不再重复设置
* @param row :行
* @param col :列
* @param val :0=灭 1=亮
* @retval 无
*/
void LcdSetPixel(uint8_t x,uint8_t y,uint8_t val)
{
uint16_t dat;
dat = RWLcdRamVal(y,x/3,0,0); /* 获取所在组的3个像素点 */
if(val) /* 点亮 */
{
if(!(dat&PixValMap[x%3]))
{
dat |= PixValMap[x%3];
RWLcdRamVal(y,x/3,1,dat);
}
}
else /* 熄灭 */
{
if(dat&PixValMap[x%3])
{
dat &= ~PixValMap[x%3];
RWLcdRamVal(y,x/3,1,dat);
}
}
}
|
|