你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STemWin在STM32上移植驱动12864屏(ST7920)求助!

[复制链接]
modu8888 提问时间:2017-10-20 08:46 /
     我是用串口驱动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);
}




收藏 1 评论11 发布时间:2017-10-20 08:46

举报

11个回答
modu8888 回答时间:2017-10-20 08:51:43
本帖最后由 modu8888 于 2017-10-20 08:57 编辑

在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);
}






modu8888 回答时间:2017-10-20 09:01:27
QQ图片20171020085835.png

在main.c中
        InitLCD();
        GUI_X_Init();
        GUI_SetBkColor(GUI_WHITE);
  GUI_SetColor(GUI_BLACK);
        GUI_DrawCircle(60,60,10);
                LCM_Refresh();
        while(1)
        {
        }


没有动静
modu8888 回答时间:2017-10-20 10:42:44
主要参考 http://bbs.armfly.com/read.php?tid=1678 配置的,却不成哟
tiryli88 回答时间:2017-11-15 18:10:14
之前也用过这款12864,控制起来很繁琐,显示字符坐标夸字节。
后来改用这款完美解决,自带字库,绘图(画线,画点,画圆)功能,坐标定位横向纵向均以像素点为单位。
分享资料:https://pan.baidu.com/s/1c1Ic1kk

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

哈佛祖安智 回答时间:2018-1-4 09:08:40
大牛拉小车,12864推荐使用ugfx

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-1-4 10:15:24
本帖最后由 wenyangzeng 于 2018-1-4 11:23 编辑

    运行STemWin要启用CRC校验:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);

另外ST7920驱动STemWin好像没有支持

无标题.png



评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wolfgang2015 回答时间:2018-1-4 21:38:42
12864 点阵直接写内存就好,GUI效果用STemWin有点浪费内存,非要用字库嘛,GB2312不是很多点阵的选择。而且小。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2018-1-5 09:17:52
请注意相差端口有没有正确配置好。
建议使用示波器,看看对应端口的波形,是否正确。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wofei1314 回答时间:2018-1-5 09:33:26
编译过了吗?是编译鼓励跑不起阿狸还是其它什么问题啊?

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版