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

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

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

作者:c_gao   來源:轉自c_gao   點擊數:  更新時間:2014年07月05日   【字體:
通過幾天時間空余時間研究,將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;
        }
       
    }

}
關閉窗口

相關文章

无码国产69精品久久久久网站| 少妇与大狼拘作爱性a| 亚洲天堂一区二区在线观看| 91久久国产自产拍夜夜嗨| 日韩国产中文字幕| 亚洲亚洲人成综合网络| 国产综合色视频| 99久久99热这里只有精品| 日产福利视频在线观看| 最新在线观看av网站| 麻豆精品视频在线原创| 亚洲精品一区二区二区| 精品丰满少妇一区二区三区| 久久黄色免费看| 日韩精品一区二区三区四区五区| 热久久免费国产视频| 亚洲美女精品成人在线视频| 色8久久人人97超碰香蕉987| 国产精品久久毛片av大全日韩| 日韩电影在线免费观看| 国产精品99一区二区三| 亚洲视频精选| 小h片在线观看| 蝌蚪视频在线播放| 福利片在线免费观看| 19j韩国主播韩宝贝在线| 99久久精品国产成人一区二区| 我家有个日本女人| 蜜臀av一区二区三区有限公司| 亚洲精品高清无码视频| 免费看黄色a级片| 精品国产一区二区三区四区精华 | 成人免费看片视频在线观看| 国产99视频精品免费视频36| 日本精品视频网站| 最近2019年日本中文免费字幕| 91麻豆精品国产91久久久资源速度| 亚洲色图.com| 久久一二三国产| 久草精品在线观看| 国产偷自视频区视频一区二区| 成人久久电影| 九九热爱视频精品视频| 97视频一区| 国产亚洲观看| 国产麻豆一区| 东京一区二区| 天堂在线中文网官网| 在线观看男女av免费网址| 国产人成在线视频| 内衣办公室在线| 欧美性猛交p30| 白虎精品一区| 99久热re在线精彩视频| 国产私人影院| h短视频大全在线观看| 九九99九九精彩| 小次郎av收藏家| 0608新视觉| 丰满岳乱妇dvd日本| 19j韩国主播韩宝贝在线| 精品国产二区三区| 国产精品视频第一区二区三区| 极品一线天粉嫩虎白馒头| 五月婷婷激情在线| av色男福利网| 国内一区二区三区精品视频| 韩国专线一区二三区| 欧美人善交videosg| 成人影院久久久久久影院| 亚洲av电影一区| 思99热精品久久只有精品| 欧美白人最猛性xxxxx| 岛国中文字幕| 精品一区二区三区五区六区七区| 国产伦精品一区二区三区视频小说 | 人人干人人干| 比比资源先锋| www.大网伊人| 天堂av网在线| 五月天婷婷在线视频| 91精品久久| 免费观看亚洲| 榴莲视频成人app| 精品国产导航| 国产一区二区三区四区五区| 91综合久久一区二区| 精品动漫3d一区二区三区免费| 99riav国产精品| 视频一区视频二区在线观看| 久久黄色级2电影| www.成人在线| 亚洲欧美日韩国产手机在线 | 成人免费在线一区二区三区| 久99久在线| 免费的av在线| 777视频在线| 日韩 中文字幕| 永久免费看片视频教学| 日韩 欧美 中文| 超碰在线人人干| 青春草国产成人精品久久| 91tv在线观看| 成人综合av| av女优在线| 人人草在线视频| 欧洲精品99毛片免费高清观看| 免费av一区二区三区四区| 欧美人与禽猛交乱配视频| 免费在线看成人av| 国产无遮挡一区二区三区毛片日本| 一区二区在线观看视频 | 成人精品小蝌蚪| 亚洲女子a中天字幕| 欧美色综合网站| 精品亚洲国产视频| 青草热久免费精品视频| 久久久国产精品一区二区三区| 亚洲精品蜜桃久久久久久| 欧美精品色视频| 欧美在线视频第一页| 国产露脸国语对白在线| 国产成人福利| 久久久pmvav| 高清av一区二区三区| 欧美欧美黄在线二区| 美女精品在线观看| 日本一区二区三区久久久久久久久不| 婷婷国产在线综合| 国产丝袜精品视频| 国产精品男人爽免费视频1| 五月婷婷一区| 不用播放器的免费av| 99视频只有精品| 懂色av蜜臀av粉嫩av分享吧| 黄网视频午夜青春| 欧美尤物美女在线| jazzjazz国产精品久久| 中日韩视频在线观看| 久久久精品免费网站| 欧美日韩一区二区三区在线| 欧美精品生活片| 精品乱子伦一区二区三区| 天天摸天天碰天天添| 欧美日韩黄色网| 亚洲色图21p| 亚洲欧洲动漫| 亚洲在线资源| 久久都是精品| 一区二区三区**美女毛片| 日韩电影大全免费观看2023年上| 国产精品极品美女粉嫩高清在线| 亚洲小说欧美另类激情| 丰满大乳奶做爰ⅹxx视频| 国产一区二区三区成人| av黄色网址| 久草在线中文最新视频| 深夜福利久久| 不卡av免费在线观看| 欧美日韩视频在线一区二区| 久久久爽爽爽美女图片| 宅男在线精品国产免费观看| 自拍偷拍中文字幕| 人妻少妇精品无码专区久久| 精品伦理一区二区| 日本欧美在线| 麻豆一区二区99久久久久| 欧美性猛交xxxxx免费看| 久久久视频在线| 日韩一级性生活片| 精品久久免费视频| 黄色网址网站| 欧美激情网站| 久久五月激情| 精品视频999| 国产色视频一区| 久久撸在线视频| 11024精品一区二区三区日韩| 国产三级免费观看| 一区中文字幕电影| 粉嫩欧美一区二区三区高清影视 | 亚洲国产欧美不卡在线观看| 亚洲午夜久久久久久久久红桃| 天天操天天干天天干| a√在线中文网新版址在线| 日韩电影一区| 亚洲三级在线观看| 久久免费高清视频| 欧美日韩亚洲一二三| 国产裸体美女永久免费无遮挡| 黄色仓库视频网站| 四虎影视精品| 国产精品久久久久久久久免费相片| xvideos亚洲人网站| 中国一级黄色录像| 激情五月色婷婷| 好男人社区在线视频| 福利片一区二区| 久久久激情视频| 美日韩精品免费视频| 免费网站在线观看视频| 黄色片网站在线免费观看| 女人体1963| 日韩影视在线观看| 亚洲三级免费观看| 国产成人涩涩涩视频在线观看| 免费在线观看污网站| 亚洲av成人无码网天堂| 欧美一级鲁丝片| 成人综合婷婷国产精品久久| 一区二区三区高清国产| 每日在线观看av| 国产精品无码免费播放| 免费的黄网站在线观看| 免费视频一区| 精品国产乱码久久久久久久| 亚洲欧洲精品一区二区| 男人午夜免费视频| 日本免费一区二区三区最新| 激情综合激情| 精品嫩草影院久久| 国产免费xxx| 一级aaaa毛片| 欧美hdxxxxx| 国产成人午夜99999| 久青草国产97香蕉在线视频| 日韩 欧美 高清| 影音先锋男人资源站| 日本成人三级电影| av不卡免费电影| 97精品在线视频| 日韩aaaaa| 天天看天天操| 色喇叭免费久久综合| 在线观看免费视频综合| 亚洲成人精品在线观看| 国产在线精品播放| 国产精品视频在| 日本电影免费看| 欧美三级网页| 亚洲国产精品国自产拍av秋霞 | 欧美在线关看| 亚洲mv大片欧洲mv大片精品| 91青青草免费观看| 国产亚洲精品成人| 高清性色生活片在线观看| 欧美亚洲一级| 中文字幕精品视频| 日本亚洲一区二区三区| 两个人免费视频观看日本| 免费观看久久av| 欧美在线观看禁18| 先锋在线资源一区二区三区| 日韩久久久久久久久久| 波多野结衣在线播放| aaa亚洲精品| 国产99久久久欧美黑人| 亚洲一级理论片| 麻豆导航在线观看| 韩国av一区二区| 4388成人网| 在线日韩国产网站| 无遮挡动作视频在线观看免费入口| 国内外成人在线| 国产99久久久欧美黑人 | 亚洲精品中文字幕无码蜜桃| 日韩亚洲色图| 国产九一精品| 精品久久人人做人人爱| 中文字幕在线观看第三页| 国产5g影院天天爽天天看| 国产成人一区| 亚洲国产精品99| 久久人人爽人人片| 国产精品影视| 蜜桃av噜噜一区| 97国产精品人人爽人人做| 99热这里只有精品4| 黄网站免费在线播放| 久久精品视频在线免费观看| av一区二区三区在线观看| 涩涩视频在线观看| 色999韩欧美国产综合俺来也| 欧美性少妇18aaaa视频| 久久国产精品网| 国产91色蝌蚪视频| 狠狠综合久久av一区二区老牛| 亚洲最新av在线| 熟女少妇一区二区三区| 成人在线观看一区| 国产欧美日韩在线看| 欧美激情视频一区二区三区| 亚洲成人黄色小说| 久久免费大视频| 视频在线一区二区| 美女福利视频网| av在线中出| 亚洲一区二区三区影院| 日韩在线观看a| 日日摸夜夜添夜夜添毛片av| 免费成人av在线| 91中文字幕在线观看| 亚洲第一大网站| 日韩精品一卡| 日韩中文字幕亚洲| 少妇aaaaa| 欧美123区| 国产精品嫩草影院av蜜臀| 亚洲激情一区二区三区| 国产美女黄色| 秋霞成人午夜伦在线观看| 国产日韩欧美在线视频观看| 国产精品一区二区av白丝下载| 欧美性生活一级片| 最新91在线视频| 日本五十路女优| 一区二区三区四区精品视频| 亚洲国产精品成人精品| 在线看片中文字幕| 无遮挡爽大片在线观看视频 | 日本一二三区视频在线| 口述被爽到呻吟高潮自述| 捆绑调教美女网站视频一区| 亚洲伊人久久综合| 中国xxx69视频| 亚洲伊人观看| 97中文在线观看| 在线亚洲精品自拍| 久久综合影视| 肥熟一91porny丨九色丨| 97一区二区三区| 亚洲精选在线| 91日本在线观看| 欧美日本色图| 精品一区二区三区不卡 | a v视频在线观看| 美腿丝袜亚洲图片| 欧美日韩xxx| 亚洲资源在线播放| 999国产精品| 国产精品亚洲片夜色在线| 人人妻人人澡人人爽精品日本| 欧美一区91| 91香蕉国产在线观看| 四虎成人精品在永久在线观看| 日韩av中文字幕一区二区三区| 国产亚洲欧美一区二区三区| 91丨九色丨蝌蚪丨少妇在线观看| 成人午夜又粗又硬又大| 粉嫩av一区二区三区天美传媒 | 久草免费福利视频| 久久99精品久久久久婷婷| 欧美尤物一区| 丁香婷婷自拍| 成人欧美一区二区三区在线播放| 日韩av一二三四| www红色一片_亚洲成a人片在线观看_| 欧美色老头old∨ideo| 538精品视频| 国产图片一区| 午夜精品一区二区三区在线| 五月婷中文字幕| 国产最新精品精品你懂的| 国产资源第一页| 黄色片在线免费看| 欧美精品一二三四| 农村黄色一级片| 伊人精品影院| 天天操天天操天天| 日韩黄色a级片| 免费看三级黄色片| 亚洲精品无码国产| 女人体1963| 亚洲成人免费在线| 国产国语性生话播放| 亚洲成人一区在线观看| 中文字幕精品国产| 性生活三级视频| 久久精品国产成人一区二区三区 | 国产高清视频一区二区| 九九精品在线观看| 人妻中文字幕一区| 丁香婷婷综合网| av网站在线不卡| 日韩av首页| 欧美激情精品久久久久久久变态| 男人网站视频| 91小视频在线| 女王人厕视频2ⅴk| 麻豆国产一区| 国产精品综合久久久| 蜜桃av网站| 狠狠色噜噜狠狠狠狠97| 欧洲猛交xxxx乱大交3| 影视一区二区| 亚洲成人动漫在线| 伊人春色在线观看| 日本不卡一区二区三区| 日日碰狠狠添天天爽超碰97| 黄网av在线|