wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

專注電子技術學習與研究
當前位置:單片機教程網 >> STM32 >> 瀏覽文章

STM32F4 Discovery + FreeRTOS + 中文字庫 + 12864LCD

作者:c_gao   來源:轉的   點擊數:  更新時間:2014年06月25日   【字體:
通過幾天時間空余時間研究,將FreeRTOS移植到了STM32 Discovery的板子上,并將以前自己做的中文字庫解析和簡易電子書閱讀的程序移植過來.同時采用了SPI接口的12864 OLED液晶屏.再加上板載的幾個LED控制以及板載User Button按鈕控制電子書向下翻頁. 通過配置USART1連接串口藍牙模塊和我的老本本Thinkpad T40p通信.先上圖:


FreeRTOS的移植我是基于FreeRTOS最新官方7.5.2版的Demo: CORTEX_M4F_STM32F407ZG-SK 移植的.不過這個Demo里的RCC,PLL,HSE等相關配置不符合STM32 Discovery的實際情況,我重新用ST公司官方提供的system_stm32f4xx.c重新替換實現,同時去掉了Demo里的除LED任務外的所有其它任務,并修改中斷等其它配置.重新自己寫了幾個Task實現自己的要求.

這里提一下,網上流傳甚廣的12864的SPI驅動是有問題的.主要表現在一個重要的設置坐標的函數,錯誤版本代碼如下:

void LCD_Set_Pos(unsigned char x, unsigned char y)
{
    LCD_WrCmd(0xb0+y);
    LCD_WrCmd((x&0x0f)|0x01);       //0000 1111
    LCD_WrCmd(((x&0xf0)>>4)|0x10);//0001 1111
}
使用這個函數明顯的錯誤發生在x的坐標定位會出問題,比如當你使用LCD_Set_Pos(126,0)和LCD_Set_Pos(127,0)時效果是一樣的,都定位到(126,0)位置,無法點亮x=127這最后一列的像素.結果通過查看12864控制芯片的硬件文檔找到原因:


文檔明確表示,x坐標的設置將坐標字節的低4位直接寫入,將D4位置1后再將坐標字節的高4位一起寫入設置.而上面的代碼中:
LCD_WrCmd((x&0x0f)|0x01);       //0000 1111
顯然畫蛇添足,應改為:
LCD_WrCmd(x&0x0f);
即可.

另外, 由于12864的控制芯片內的顯存是按位進行素像迭制的,并且寫入顯存時還得按節字為單位進行.實際程序中非常不方便進行單像素的隨意控制.為此,我寫了個中間層,這個中間層對每個像素按字節操作,GUI操作都在位于內存中開辟的中間層顯存中進行.然后渲染到屏上去時再轉換成為控制芯片要求的格式.

代碼如下:
[1]. hal_lcd.h
#ifndef HAL_LCD_H
#define HAL_LCD_H

#include

#define LCD_WIDTH   128
#define LCD_HEIGHT  64
#define PIXEL_PER_BYTE      8
#define LOG_PIXEL_PER_BYTE  3

#define USE_LOG_WIDTH_32  5
#define USE_LOG_WIDTH_64  6
#define USE_LOG_WIDTH_128 7
#define USE_LOG_WIDTH_256 8

#define CUR_LOG_WIDTH USE_LOG_WIDTH_128

#define BIT(n)  (1<<(n))

extern unsigned char hal_lcd_buff[LCD_WIDTH*LCD_HEIGHT];
extern unsigned char lcd_buff[(LCD_WIDTH*LCD_HEIGHT)>>LOG_PIXEL_PER_BYTE];
extern unsigned long render_count;

inline void set_pixel(int x, int y, unsigned char clr)
{
  hal_lcd_buff[(y<<CUR_LOG_WIDTH)+x]=clr;
}

inline unsigned char get_pixel(int x, int y)
{
  return hal_lcd_buff[(y<<CUR_LOG_WIDTH)+x];
}

inline void clear_hal_lcd_buff()
{
  int num = LCD_WIDTH*LCD_HEIGHT;
  for(int i=0; i
    hal_lcd_buff[i]=0;
}

inline void clear_lcd_buff()
{
  int num = (LCD_WIDTH*LCD_HEIGHT)>>LOG_PIXEL_PER_BYTE;
  for(int i=0; i
    lcd_buff[i]=0;
}

inline void clear_buff()
{
  clear_hal_lcd_buff();
  clear_lcd_buff();
}

void DrawCharacter10(unsigned char color);
void GenLcdBuff();
void RenderBuff();
void Render();

#endif

[2]. hal_lcd.c
#include "hal_lcd.h"
#include "LQ12864.h"
#include "gb_10_zhi.h"
#include "5_7font.h"
#include "mylife_txt.h"

unsigned char hal_lcd_buff[LCD_WIDTH*LCD_HEIGHT];
unsigned char lcd_buff[(LCD_WIDTH*LCD_HEIGHT)>>LOG_PIXEL_PER_BYTE];
unsigned long render_count=1;

#define ASC_COUNT            95    //????
#define ASC_START                32    //????
#define ASC_WIDTH                  //???????(??)
#define ASC_HEIGHT                  //???????(??)
#define ROW_SPACE                  //???(??)
#define COL_SPACE                  //???(??)
#define TAB_SPACE_NUM          //??TAB?????????

#define CN_CHAR_HEIGHT        10//??????
#define CN_CHAR_WIDTH        10//??????


void GenLcdBuff()
{
  int x,y,k;
  unsigned char dist_byte;
  int start_y,end_y;
  int i;
  int ii=0;
  for(y=0; y<(LCD_HEIGHT>>LOG_PIXEL_PER_BYTE); y++)
  {
    for(x=0; x
    {
      dist_byte = 0;
      start_y = (y<<LOG_PIXEL_PER_BYTE);
      end_y = start_y + PIXEL_PER_BYTE;
      for(i=0,k=start_y; k
      {
        if(get_pixel(x,k))
          dist_byte |= BIT(i);
      }
      lcd_buff[ii++]=dist_byte;
    }
  }
}

void RenderBuff()
{
  Draw_BMP(0,0,127,7,lcd_buff);
}

void Render()
{
  GenLcdBuff();
  Draw_BMP(0,0,127,7,lcd_buff);
}

char* file;//file pointer
unsigned int nFilePosition;
unsigned int nOffset;

static void memcpy(void* dst, const void* src, unsigned int count)
{
  unsigned char* cdst = (unsigned char*)dst;
  unsigned char* csrc = (unsigned char*)src;
  int i=0;
  while((i++)
    *(cdst++) = *(csrc++);
}

int DrawASC(int nRow,int nCol,int nIndex,unsigned char color)
{
    if( nIndex == ' ' - ASC_START ) //?????,??,????3,????,?????????,??????
        return 3;
       
    int nWidth=0;
    if(nIndex > ASC_COUNT || nIndex < 0)
        return nWidth;
    unsigned char * pLocation=nAsciiDot+nIndex*ASC_WIDTH;
    unsigned char * ptemp=NULL;
    //int n=0;
    int i=0,j=0;
    int row=nRow,col=nCol;
    //uint16 color=RGB15(31,31,31)|BIT(15);
   
    for(i=0; i
    {
        ptemp=pLocation+i;
        for(j=0; j
        {
            if( (*ptemp)&BIT(ASC_WIDTH-j-1) )
            {
                set_pixel(col,row,color);
                if( j > nWidth)
                    nWidth=j;
            }
            //else //???
            //    putpixel_FB(row,col,RGB15(31,0,0)|BIT(15),buffer);
            col++;
        }
        col=nCol;
        row++;
    }
    if(    nIndex == '!'-ASC_START ||
            nIndex == ','-ASC_START ||
            nIndex == '.'-ASC_START ||
            nIndex == '?'-ASC_START ||
            nIndex == '"'-ASC_START ||
            nIndex == ';'-ASC_START ||
            nIndex == ':'-ASC_START )
            return ASC_WIDTH;
    else
        return nWidth+1;
}

typedef struct tag_Pos
{
    int row;
    int col;
} Pos;

void DrawCharacter10(unsigned char color)
{
    char bDual=0;
    unsigned char cnChar[2];
   
    unsigned int nSection;
    unsigned int nPosition;

    int xx=0;
    int yy=0;
   
    file=(char*)(mylife_txt+nFilePosition);
    char* pStr=file;
   
    unsigned int nIndex=0;//gb_10_zhi_size;abcdef
   
    cnChar[0]=pStr[nIndex++];
   
    unsigned int nLen=mylife_txt_size;//strlen(pStr);
   
    while(nFilePosition+nIndex < nLen && yy < LCD_HEIGHT-CN_CHAR_HEIGHT)
    {
        if(cnChar[0] & BIT(7))
        {
            cnChar[1]=pStr[nIndex++];
            bDual=1;
        }
        else
            bDual=0;
       
        if(bDual)
        {
            nSection=( (cnChar[0]-0xA0) & 0x7f ) -1;
            nPosition=(cnChar[1]-0xA0) & 0x7f;
           
            long nOffset=(nSection*94+nPosition)*13;//((9*94)+1)*13+k*13;//
           
           
            unsigned char font[13];
            memcpy(font,gb_10_zhi+nOffset,13);
           
           
            int i=0;
            int j=0;
            int x=0,y=0;
            for(i=0; i<10; i++)
            {
                for(j=0; j<8; j++)
                {
                    if(font[i] & BIT(j))
                    {
                        x=xx+8-j-1;//(i*8+j);
                        y=i;//(i*8+j)/12;
                        set_pixel(x,yy+y,color);
                    }
                }
            }
           
            for(i=10; i<13; i++)
            {
                for(j=0; j<8; j++)
                {
                    if(font[i] & BIT(j))
                    {
                        x=xx+8+(2-j%2-1);
                        y=4*(i-9)-j/2-1;//(i-10)*4+j/2;
                        set_pixel(x,yy+y,color);
                    }
                }
            }
           
            xx+=(CN_CHAR_WIDTH+COL_SPACE);
        }
        else
        {
            if(cnChar[0] == 0x0D && nIndex < nLen-1)
            {
                cnChar[1]=pStr[nIndex++];
                if(cnChar[1]== 0x0A)
                {
                    yy+=(CN_CHAR_HEIGHT+ROW_SPACE);
                    xx=0;
                }
                   
            }
            else
            {
                switch(cnChar[0])
                {
                case '\n':
                    xx=0;
                    yy+=(CN_CHAR_HEIGHT+ROW_SPACE);
                    break;
                case '\t'://???????,????4???
                {
                    if(xx < LCD_WIDTH)
                    {
                        xx=xx+TAB_SPACE_NUM*(CN_CHAR_WIDTH+ROW_SPACE);
                        if(xx >= LCD_WIDTH)
                        {
                            yy+=(CN_CHAR_HEIGHT+ROW_SPACE);
                            xx=0;
                        }
                    }
                    break;
                }
                default:
                    xx+=DrawASC(yy+(CN_CHAR_HEIGHT-ASC_HEIGHT),xx,cnChar[0]-ASC_START,color);
                    xx+=COL_SPACE;
                    break;
                }//switch
   
            }
        }
       
        cnChar[0]=pStr[nIndex++];
       
        nOffset=nIndex-1;
       
        if(xx+CN_CHAR_WIDTH >= LCD_WIDTH)
        {
            yy+=(CN_CHAR_HEIGHT+ROW_SPACE);
            xx=0;
        }
       
    }

}
關閉窗口

相關文章

freemovies性欧美| 久久亚洲精品伦理| 手机亚洲第一页| 五十路在线观看| 中文字幕免费视频| 又大又硬又爽免费视频| 亚洲精品日韩激情在线电影| 亚洲韩国日本中文字幕| 一区二区三区在线观看欧美| 麻豆国产精品一区二区三区 | 夜色av.com| 免费看黄色一级视频| 男人操女人的视频网站| 亚洲欧美日本一区二区| 伊人婷婷久久| 99久久精品免费看国产一区二区三区 | 亚洲日韩第九十九页| 91在线视频免费播放| 成人免费毛片糖心| 黄色片在线免费| 欧美日韩免费一区二区三区视频| 日本一区二区三区免费乱视频| 日本不卡视频在线观看| 四虎成人精品永久免费av九九| 精品999日本久久久影院| 成人在线高清免费| 韩国中文免费在线视频| 2019中文字幕视频| 国产女人伦码一区二区三区不卡| av网站免费大全| 性无码专区无码| 91制片厂在线| 性色av蜜臀av色欲av| 美女喷白浆视频| 免费观看亚洲视频| 欧美国产视频在线观看| 国产精品中文在线| 欧洲精品久久久| 欧美男插女视频| 综合av色偷偷网| 亚洲人av在线影院| 日韩av在线免播放器| 欧美成人vps| 91精品国产综合久久久蜜臀图片| 色综合色狠狠天天综合色| 一区二区三区日韩精品视频| 国产精品毛片大码女人| 久久综合精品国产一区二区三区| 国产白丝精品91爽爽久久| 久久99久久精品欧美| 日韩国产高清在线| 日韩av二区在线播放| 久久精品人人| 久久精品91| 久久五月激情| 男女男精品视频| 免费看日韩精品| 欧美aⅴ一区二区三区视频| 久久久久网站| 免费在线观看视频一区| 蜜臀av性久久久久蜜臀aⅴ| 日日夜夜免费精品| 免费成人av在线播放| 男女性色大片免费观看一区二区 | 日韩欧美激情电影| 国产aa精品| 免费黄色网址网站| 蜜桃视频一日韩欧美专区| 日日夜夜国产| 国产91中文| 羞羞视频网站| 丰满少妇又爽又紧又丰满电影| 暖暖视频日本免费| 99免费视频| 麻豆av在线| 情se视频网在线观看| 日韩精品视频无播放器在线看| 亚洲人成小说| 日本在线看片免费人成视1000| 欧美videos极品另类| av网址在线| 在线观看涩涩| 97色婷婷成人综合在线观看| 国产一区调教| 91麻豆精品国产91久久久平台| 亚洲一区二区日韩| 香蕉久久夜色精品| 国产中文字幕精品| 久久免费视频色| 亚洲精品国产成人久久av盗摄| 疯狂欧美牲乱大交777| 欧美视频一区二区三区四区| 日韩午夜在线观看视频| 亚洲一区二区黄| 国内精品一区二区三区四区| 国产在线播放不卡| 日本精品一区二区三区高清 久久| 色爽爽爽爽爽爽爽爽| 日本三级免费观看| 免费观看黄网站| 中文字幕第69页| 亚洲伊人成人网| 囯产精品一品二区三区| 国产精品69一区二区三区| 黄页在线播放| 成年人免费在线视频| 国产乱码精品一区二三赶尸艳谈| 四虎影视精品永久在线观看| 久久三级视频| 日本熟妇毛耸耸xxxxxx| 亚洲日本欧美在线| 中文字幕日韩精品久久| 成人免费观看毛片| 日本一卡二卡在线| 男人操女人的视频网站| 国产一区二区在线不卡| 欧美成人高清手机在线视频| 99re热视频在线| 日本在线免费中文字幕| 亚洲一区二区av| 免费91在线观看| 免费人成视频在线播放| 欧美人与禽zoz0善交| 欧产日产国产69| 亚洲在线视频免费| 无码av天堂一区二区三区| 青青草精品视频在线观看| 亚洲av无码一区二区三区观看| 日韩激情综合网| 国产极品999| 免费一级片网址| 丝袜+亚洲+另类+欧美+变态| 波多视频一区| 国产精品亚洲二区| 久久精品av麻豆的观看方式| 国产精品乱码妇女bbbb| 欧美日韩三级一区| 久久成人这里只有精品| 成人黄色在线免费观看| 久久久久久久午夜| 国产高清一区二区三区四区| 一区二区三区www污污污网站| 国产精品免费视频一区一| 日本24小时在线高清视频| 亚洲女色av| 五月天久久网站| 岛国av在线一区| 欧美少妇xxx| 7777免费精品视频| 午夜在线视频免费观看| 一起草在线视频| 国产男男gay体育生白袜| 99热在线免费| 午夜日韩成人影院| 亚洲人成免费| 有码一区二区三区| 深夜精品寂寞黄网站在线观看| 99re视频在线| 日韩精品视频一二三| 日韩女优在线观看| 色视频线观看在线播放| a级片国产精品自在拍在线播放| 亚洲永久精品唐人导航网址| 粉嫩嫩av羞羞动漫久久久| 欧美在线观看一区二区| 4p变态网欧美系列| 欧美图片激情小说| 国产suv一区二区三区| 欧美精品一区二区三区免费| 在线免费观看一区二区| 偷偷看偷偷操| 韩国精品一区| 99精品国产一区二区青青牛奶| 亚洲日本青草视频在线怡红院| 亚洲视频视频在线| 欧美一区二区福利| 婷婷色一区二区三区| 久热视线观看免费视频| 高潮毛片在线观看| 综合精品久久| 亚洲自拍偷拍综合| 午夜精品福利在线观看| 缅甸午夜性猛交xxxx| 成人精品免费在线观看| 四虎国产精品成人免费4hu| 97久久中文字幕| 成人激情午夜影院| 亚洲欧美日韩高清| 亚洲精品不卡| 久草视频免费在线| xfplay先锋影音夜色资源站| 成人毛片免费| 国产精品中文字幕欧美| 亚洲精品一区二区三区福利| 国产精品v欧美精品v日韩精品| 欧美大喷水吹潮合集在线观看| 免费视频拗女稀缺一区二区 | 久久噜噜亚洲综合| 在线精品国产成人综合| 路边理发店露脸熟妇泻火| 亚洲一区 视频| 欧美xx网站| 免费成人三级| 中文字幕一区二区三区不卡 | 日本高清在线观看| 久久一二三四| 欧美成人艳星乳罩| 欧美日韩精品中文字幕一区二区| 亚洲精品自拍视频在线观看| 成年人视频网址| 日韩中文字幕无砖| 久久久久久久久久久久久女国产乱| 色老头一区二区三区在线观看| 亚洲熟妇无码一区二区三区导航| 中文字幕在线观看高清| 欧美日韩在线视频播放| 99reav2| 亚洲高清极品| 国产精品麻豆久久久| 欧美一二三视频| www.四虎精品| 樱花草www在线观看| 免费观看亚洲天堂| 国产精品二三区| 国产精品主播视频| 在线免费观看日韩av| jizz.www| 欧洲grand老妇人| 色偷偷成人一区二区三区91 | fc2成人免费人成在线观看播放| 91精品免费观看| 国产一区二区三区四区hd| 欧洲美一区二区三区亚洲| 韩日三级av| 经典三级一区二区| 国产·精品毛片| 色琪琪综合男人的天堂aⅴ视频| 伊人再见免费在线观看高清版 | 激情五月播播久久久精品| 亚洲男人的天堂在线播放| 国产 日韩 亚洲 欧美| 人妻中文字幕一区| 成人精品三级| 综合精品久久久| 99国产视频在线| 国产无人区码熟妇毛片多| av大片在线观看| 国产精品一区二区久久不卡 | 国产伦精品一区二区三区妓女 | 国产91视频在线| 桃花岛tv亚洲品质| 国产精品不卡在线观看| 99c视频在线| 区一区二在线观看| av在线网页| 国产欧美精品一区二区三区四区| 91理论片午午论夜理片久久| 国产一级生活片| 九七久久人人| 2020国产精品自拍| 91欧美精品成人综合在线观看| 久久久国产精华液| а√天堂8资源在线官网| 99精品视频中文字幕| 亚洲一区二区成人在线观看| 成人国产精品久久久| 国产精品美女毛片真酒店| 黄色网址在线免费观看| av一区二区三区黑人| 国产精品扒开腿爽爽爽视频| 免费黄色国产视频| 91激情在线| 91丨porny丨中文| 91在线播放国产| 在线播放精品视频| 国产a亚洲精品| 大桥未久av一区二区三区| 最新av在线免费观看| 一区二区精品区| 日韩电影一区| 在线一区二区日韩| 极品人妻一区二区| 好男人社区在线视频 | 亚洲国产aⅴ精品一区二区| 91久久免费观看| 男人添女人下面高潮视频| 你懂的网站在线观看| 欧美午夜不卡| 欧美精品videosex极品1| 欧美黑人性猛交xxx| 日韩另类在线| 另类视频在线| 欧美国产精品一区二区| 精品视频在线观看| 熟妇人妻av无码一区二区三区| 久久精品色播| 日韩av在线精品| 人妻精品久久久久中文字幕| 成人高清在线| 中文字幕日韩一区| 法国空姐在线观看免费| 精品一区二区三区五区六区| 夜鲁夜鲁夜鲁视频在线播放| 夜夜嗨av一区二区三区四季av| 黄瓜视频免费观看在线观看www| 九九久久精品这里久久网| 欧美激情视频一区二区三区在线播放 | 日韩经典一区二区| 国产精品久久久久久久久久新婚| 最近国语视频在线观看免费播放| 亚洲视频国产| 亚洲欧美一区二区三区久久| 欧美性受xxxx黑人| 高潮在线视频| 欧美日韩在线一区二区| 激情久久综合网| 免费在线视频你懂得| 欧美—级在线免费片| 在线免费观看一区二区三区| 免费毛片在线播放| 久久精品国内一区二区三区| 国产精品一区二区三区观看| 久热中文字幕在线| 国产精品久久久免费| 成人在线中文字幕| 俄罗斯男人又粗又大| 亚洲大胆av| 91九色单男在线观看| 亚洲人成绝费网站色ww| 亚洲婷婷在线| 国产日韩在线播放| 狠狠色成人综合网图片区| 乱人伦精品视频在线观看| 亚洲专区国产精品| www.久久91| 成年人在线视频免费观看| 亚洲高清一区二区三区| 蜜桃福利午夜精品一区| 精品麻豆一区二区三区| 黑人巨大精品欧美一区二区免费| 亚洲美女性囗交| 韩国av网站在线| 在线免费av一区| 玖玖爱在线观看| 九九九伊在线综合永久| 日韩电影免费观看中文字幕| 青青草免费av| 亚洲人成网www| 91成人在线播放| 色呦呦中文字幕| 日韩影院精彩在线| 色吧亚洲视频| 一级特黄特色的免费大片| 亚洲精选视频在线| wwwww在线观看| 日本欧美一区| xvideos亚洲| 精品人妻一区二区三区浪潮在线 | 亚洲成人动漫在线播放| 国产三级黄色片| 欧美片网站免费| 久久99精品久久久久久琪琪| 国产欧美第一页| 麻豆91精品| 手机在线观看国产精品| 中文字幕在线播放第一页| 五月天久久比比资源色| 欧美色图亚洲激情| 一区二区三区免费在线看| 欧美裸体男粗大视频在线观看| 亚洲av无码国产精品永久一区| 蘑菇福利视频一区播放| 天堂av一区二区| 免费黄色在线视频网站| 色乱码一区二区三区88| 久久爱一区二区| 精品国产乱码久久久| 91免费人成网站在线观看18| 非洲黑人最猛性xxxx交| 中文字幕在线视频一区| 国产伦理在线观看| 精品伊人久久| 欧美自拍视频在线| 国产精品久久久高清免费| 久久久国产综合精品女国产盗摄| 亚洲欧美日本一区二区三区| 成人日韩精品| 久久久久中文字幕| 欧美怡红院在线| 国产精品美女久久福利网站| 亚洲无人区码一码二码三码| 日韩免费一级| 国产精品偷伦免费视频观看的| 黄色毛片在线| 亚洲国产婷婷综合在线精品| 超碰人人人人人人人| 精品国产网站| 久久精品magnetxturnbtih| 亚洲热app| 欧美一区永久视频免费观看|