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

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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版