我是用串口驱动12864点阵屏(ST7920)的,现在已经用调用字库设计了菜单。后来想把节目做的绚烂一些,所以想到在STM32F105上移植STemWin。 参考网上的一些攻略,已经把打点、画线等底层函数写好,且修改了有关文件。但调用STemWin的函数,就是不理会呢! /******************下面是打点和读点函数,测试可用**********************/ void LCM_PutPixel(uint16_t x, uint16_t y, uint8_t color) { uint16_t newHalfWordValue; uint8_t xHalfWordPlace,xHolfWordOfBit; if((x>=128)||(y>=64)) return; xHalfWordPlace = x / 16; // if(y >= 32) { y = y - 32; xHalfWordPlace = xHalfWordPlace + 8; } newHalfWordValue = localcachebuf[y][xHalfWordPlace]; xHolfWordOfBit = x % 0x10; if(0 == color) { newHalfWordValue &= clearBitTable[xHolfWordOfBit]; } else { newHalfWordValue |= setBitTable[xHolfWordOfBit]; } localcachebuf[y][xHalfWordPlace]=newHalfWordValue; } bool LCM_GetPixel(uint16_t x, uint16_t y) { uint16_t oldHalfWordValue; uint8_t xHalfWordPlace,xHolfWordOfBit; xHalfWordPlace = x / HALF_WORD_OF_ROWS; if(y >= 32) { y = y - 32; xHalfWordPlace = xHalfWordPlace + 8; } oldHalfWordValue = localcachebuf[y][xHalfWordPlace]; xHolfWordOfBit = x % 0x10; oldHalfWordValue=oldHalfWordValue & setBitTable[xHolfWordOfBit]; return oldHalfWordValue << xHolfWordOfBit; } /*******************刷屏函数 在RAM中开辟1024字节存放显示内容,在级别较低的任务中用SPI写************************/ void LCM_Refresh() { uint16_t x,y,i; for(y=0;y<32;y++) { LCM_WriteCommand(0x80+y); Delay_CLK(120); LCM_WriteCommand(0x80); Delay_CLK(120); for(x=0;x<8;x++) { i=localcachebuf[y][x]; LCM_WriteData(i>>8); Delay_CLK(120); LCM_WriteData((uint8_t)i); Delay_CLK(120); } } for(y=0;y<32;y++) { LCM_WriteCommand(0x80+y); Delay_CLK(120); LCM_WriteCommand(0x88); Delay_CLK(120); for(x=0;x<8;x++) { i=localcachebuf[y][x+8]; LCM_WriteData(i>>8); Delay_CLK(120); LCM_WriteData((uint8_t)i); Delay_CLK(120); } } LCM_WriteCommand(0x36); } |
在GUI.c中修改
#define GUI_NUMBYTES (10*1024)
修改GUIDRV_Template.c中 读点函数、写点函数是自己定义的:
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
LCM_PutPixel(x,y,PixelIndex);
}
static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
unsigned int PixelIndex;
//
// Convert logical into physical coordinates (Dep. on LCDConf.h)
//
#if (LCD_MIRROR_X == 1) || (LCD_MIRROR_Y == 1) || (LCD_SWAP_XY == 1)
int xPhys, yPhys;
xPhys = LOG2PHYS_X(x, y);
yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
GUI_USE_PARA(pDevice);
GUI_USE_PARA(x);
GUI_USE_PARA(y);
{
PixelIndex = LCM_GetPixel(x,y);
}
#if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
#undef xPhys
#undef yPhys
#endif
return PixelIndex;
}
在LCDConf_FlexColor_Template.c中修改显示屏的尺寸
// Physical display size
//
#define XSIZE_PHYS 128 // To be adapted to x-screen size
#define YSIZE_PHYS 64 // To be adapted to y-screen size
#define VXSIZE_PHYS 128
#define VYSIZE_PHYS 64
色彩转换也改了
void LCD_X_Config(void) {
//
// Set display driver and color conversion
//
GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_1, 0, 0);
//
// Display driver configuration, required for Lin-driver
//
LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
}
在main.c中
InitLCD();
GUI_X_Init();
GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
GUI_DrawCircle(60,60,10);
LCM_Refresh();
while(1)
{
}
没有动静
后来改用这款完美解决,自带字库,绘图(画线,画点,画圆)功能,坐标定位横向纵向均以像素点为单位。
分享资料:https://pan.baidu.com/s/1c1Ic1kk
评分
查看全部评分
评分
查看全部评分
运行STemWin要启用CRC校验:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
另外ST7920驱动STemWin好像没有支持
评分
查看全部评分
评分
查看全部评分
建议使用示波器,看看对应端口的波形,是否正确。
评分
查看全部评分
评分
查看全部评分