موضوع مقاله این جلسه راه اندازی lcd گرافیکی st7920 می باشد . پس تا پایان این آموزش با ما همراه باشید .نمایشگرهای LCD گرافیکی برای هر پروژه ای که می خواهیم برخی از داده ها را نمایش دهیم ، افزودنی خوبی است . ظاهر آنها از نمایشگرهای سون سگمنت و حتی LCD های کاراکتری بهتر است ، اما قیمت بالاتری نیز دارند . ولی ما می توانید از آنها برای ساخت رابط کاربری و منوها به زبان های مختلف و نمایش تصاویر گرافیکی استفاده کنید.
موضوعاتی که در این مقاله به آنها پرداخته خواهد شد :
از میان نمایشگرهای گرافیکی تک رنگ ، انتخاب lcd گرافیکی st7920 گزینه مناسبی می باشد . زیرا می توانیم lcd گرافیکی st7920 را به سه روش از طریق درگاه موازی 8 بیتی ، از طریق درگاه موازی 4 بیتی و از طریق درگاه سریال spi راه اندازی کنیم .
از دیگر مزایای lcd گرافیکی st7920 می توان به ولتاژ کاری بین 2.7 ولت الی 5 ولت اشاره کرد .
lcd گرافیکی st7920 دارای دو مد text و graphic می باشد . در مد text یا متن ، داخل lcd حافظه ای به نام CGROM وجود دارد که فونت حروف ها در این قسمت ذخیره سازی شده و ما براحتی می توانیم بدون نیاز به ساخت فونت و اشغال حافظه ای از میکروکنترلر ، متن های دلخواه خودمان را بر روی lcd نمایش دهیم .
lcd گرافیکی st7920 علیرغم مزایای نام برده شده ، معایبی نیز دارد . ST7920 تراشه ای است که توسط Sitronix تولید شده و از الفبای چینی پشتیبانی می کند به همین خاطر برای حروف چینی با ابعاد 16×16 بهینه شده است . بنابراین lcd قابلیت نمایش 4 سطر و در هر سطر 8 کاراکتر چینی را داریم .
اما نگران نباشید ، این lcd می تواند الفبای انگلیسی را نیز با ابعاد 8×16 نمایش دهد. بنابراین می توان 4 سطر و در هر سطر 16 کاراکتر اسکی نمایش داد . جدول زیر کاراکترهای غیر چینی است که درون حافظه CGROM وجود دارد و میتوان نمایش داده شود .

تعداد 4 سطر و 16 ستون برای نمایشگر گرافیکی با ابعاد 128 در 64 پیکسل یک ضعف محسوب می شوند . شاید این سوال در ذهن شما بوجود آید ، چه توجیهی وجود دارد وقتی در بازار می توان lcd کاراکتری 4×20 تهیه کرد که تعداد کاراکترهای بیشتری را بر روی صفحه نمایش می دهد و قیمتی به مراتب کمتر از lcd st7920 را دارد .
در نگاه اول انتخاب lcd کاراکتری 4×20 برای مواردی که نیاز است فقط چند متن ساده نمایش داده شود ، انتخاب مناسبتری می باشد . اما اگر نیاز باشد از اشکال و آیکونهای گرافیکی استفاده کرد و یا فونت با ابعاد و سایزهای مختلف و زبان های گوناگون استفاده کرد ، ناگزیر باید از lcd های گرافیکی استفاده کنیم .
همانطور که می دانید lcd های گرافیکی مشابه مانند ks108 و یا ts6963 فقط از طریق درگاه موازی 8 بیت راه اندازی می شوند . برای راه اندازی تعداد زیادی از پین های میکروکنترلر را اشغال می کنند . در مواردی که میکروکنترلر ما تعداد پایه های کافی ندارد ، انتخاب lcd st7920 گزینه و انتخاب مناسبی است ، زیرا از طریق درگاه سریال و تنها با چند پایه راه اندازی می شود .
پیکربندی پایه های lcd گرافیکی st7920
lcd گرافیکی st7920 دارای 20 پایه می باشد . در تصویر زیر ترتیب و نام هر پایه نوشته شده است که به توضیح یکایک پایه ها خواهیم پرداخت :


lcd گرافیکی st7920 از 3 نوع رابط گذرگاه به نام MPU پشتیبانی می کند. 8 بیت موازی ، 4 بیت موازی و رابط سریال یا SPI . گذرگاه ارتباطی lcd توسط پایه 15 با نام PSB مشخص می شود . ارتباط های موازی 8 بیت و 4 بیت توسط PSB =1 و رابط سریال توسط PSB =0 انتخاب می شود .
اتصال lcd گرافیکی st7920 در حالت سریال آسان است. شما باید پین PSB را روی 0 تنظیم کنید (آن را به GND متصل کنید) تا به کنترل کننده اطلاع دهید که داده های سریال را ارسال می کنید . سپس ، RS به CS ، RW به MOSI و EN به SCK تبدیل می شود. همچنین توصیه می شود پین RST را وصل کنید.
به پشت صفحه LCD خود نگاه کنید. اگر بصورت پیش فرض دارای پتانسیومتر باشد ، می توان از آن برای تنظیم کنتراست استفاده کرد و نیازی نیست که مداری را به پایه VO متصل کنید. همچنین باید توجه داشته باشید که برخی از تولید کنندگان LCD پایه PSB را از قبل به صورت سخت افزاری به حالت موازی یا سریال وصل می کنند. برای بررسی اینکه PSB به VCC یا GND متصل است از تستر بوق مولتی متر (اهم متر) استفاده کنید.
راه اندازی lcd گرافیکی st7920 در مد text
برای نوشتن متن مورد نظر بر روی lcd ، ابتدا باید مکان نما یا موقعیت را مشخص کنیم . همانطور که در تصویر زیر مشاهده می شود ، چهار سطر و هشت ستون وجود دارد . آدرس سطر اول با 0x80 هگز شروع می شود و آدرس ستون اول با 0x00 هگز شروع می شود . با شروع نمایش اولین حرف از متن یا رشته ، آدرس ستون یا مکان نما به صورت خودکار افزایش یافته و سطر یا ردیف اول را با هشت کاراکتر چینی و یا شانزده کاراکتر اسکی پر می کند .

lcd st7920 برای کاراکترهای 16×16 چینی بهینه شده است. بنابراین ، نوشتن کاراکترهای معمولی 8×16 کمی متفاوت است. در این حالت شما همزمان باید دو کاراکتر بنویسید. بنابراین ، اگر می خواهید کاراکتر “A” را در نیمه دوم موقعیت یا آدرس 0x93 قرار دهید ، باید قبل از آن یک کاراکتر ” ” فاصله نیز بنویسید.
برای نمایش کاراکتر “B” فقط ارسال این کاراکتر در آدرس 0x9A کافی است.
اگر به تصویر دقت کنید Line2 در سطر سوم قرار دارد و آدرس آن ادامه آدرس Line1 می باشد . تصور کنید که lcd st7920 مانند تصویر زیر ابتدا یک نمایشگری است که دارای دو سطر و شانزده ستون می باشد . سپس از نیمه برش خورده و نیمه دوم در زیر نیمه اول چیده شده است. یعنی اگر متنی طولانی داشته باشیم ، ابتدا سطر یک پر شده و بقیه کاراکترها در سطر سوم نمایش داده می شوند .

راه اندازی lcd گرافیکی st7920 در مد graphic
مد graphic را مشابه مد text در نظر بگیرید ، دارای دو سطر و شانزده ستون ، با این تفاوت که در مد graphic با پیکسل ها سر و کار داریم . بنابراین نمایشگری با ابعاد 32×256 پیکسل خواهیم داشت . حال تصور کنید که این نمایشگر کاملاً در دو قطعه برش خورده قرار گرفته و سپس یکی بر روی دیگری چیده شده است. ما نیمه بالایی و نیمه پایینی نمایشگر داریم . در این حالت نمایشگری در ابعاد 64×128 پیکسل خواهیم داشت .

در حالت گرافیکی ، همزمان به 16 پیکسل افقی (یک ستون) دسترسی پیدا می کنید . ابتدا ردیف را روی محور Y از 0 الی 31 و سپس یکی از 16 ستون که هر ستون شامل 16 پیکسل را انتخاب می کنید . 0x80 به مختصات اضافه می شود زیرا این آدرس پایه RAM نمایشگر است. برای پاک کردن RAM باید 0x00 را برای همه گروه های پیکسل بنویسیم. ما به سازماندهی نمایش اهمیتی نمی دهیم ، فقط با نمایشگر به صورت 32×256 پیکسل رفتار می کنیم.
راه اندازی lcd گرافیکی st7920 با codevision
نرم افزار کدویژن از lcd گرافیکی با درایور st7920 در مد spi پشتیبانی نمی کند ، توسط سایت میکرونیک کتابخانه ای مجزا برای راه اندازی st7920 در مد spi تهیه شده است . این کتابخانه توسط spi نرم افزاری کار می کند ، بنابراین می توان lcd را بر روی پایه های دلخواه از هر پورت میکروکنترلر پیکربندی نمود .
قابلیت کار کردن در دو مد گرافیک و متن ، قابلیت نمایش تصویر و قابلیت نمایش فونت فارسی را دارا می باشد .
توجه داشته باشید این کتابخانه از یک بافر به حجم 1 کیلوبایت رم ، جهت نمایش فونت و تصاویر در مد گرافیک استفاده می کند . بنابراین میکروکنترلی که استفاده می کنید حتما باید بیشتر از 1 کیلوبایت حافظه RAM داشته باشد ، مانند میکروکنترلر ATMEGA32 , ATMEGA328 و شماره های بالاتر ، از میکروکنترلر های با حجم 1 کیلوبایت رم یا کمتر مثل ATMEGA8 , ATMEGA16 یا سری های ATTINY نمی توان در مد SPI استفاده نمایید .
در مدهای 8bit , 4bit چون هیچ حافظه ای از RAM اشغال نمی شود ، میتوان با همه میکروکنترلر ها راه اندازی شود .
راه اندازی lcd گرافیکی st7920 با arduino
کتابخانه st7920 که توسط سایت میکرونیک توسعه داده شده است از زبان و فونت فارسی و نوشتار راستچین پشتیبانی می کنند .


راه اندازی lcd گرافیکی st7920 با stm32
در ادامه توسط هدربورد موسوم به بلوپیل که میکروکنترلر آن stm32f103c8t6 می باشد . در نرم افزار stm32cubeide و عملیات پیکربندی میکروکنترلر stm32 و lcd گرافیکی st7920 را توسط نرم افزار stm32cubemx به راحتی پیکربندی می کنیم .


تصویر فوق پیکربندی lcd گرافیکی st7920 را در سه مد سریال ، 8bit , 4bit نشان می دهد . رعایت این نکته ضروری است که نام پین ها دقیقا هم نام پین های تعریف شده در تصویر باشد . همچنین هر کدام از پین های میکروکنترلر stm را بدلخواه می توانید برای lcd پیکربندی کنید .




تصویر زیر راه اندازی lcd گرافیکی st7920 را در mode text نشان می دهد . همانطور که گفته شد در mode text چهار سطر و در هر سطر شانزده کاراکتر اسکی قابل نمایش می باشد .

تصویر زیر نمایش یک عکس در ابعاد 128×64 پیکسل را در mode graphic نشان می دهد .

برای نمایش عکس ، ابتدا باید ابعاد عکس را به سایز قابل نمایش برای lcd گرافیکی st7920 تغییر سایز دهیم . برای تغییر سایز دادن عکس می توانیم از نرم افزار فتوشاپ و یا نرم افزار paint ویندوز استفاده کنیم . در این آموزش ما از نرم افزار paint استفاده می کنیم .
ابتدا تصویر مورد نظر خود را توسط برنامه paint باز کنید . سپس از گزینه Resize عرض تصویر را به 128 پیکسل و ارتفاع تصویر را به 64 پیکسل تغییر دهید و گزینه OK را بزنید . حال از منوی File>Save as را انتخاب کنید و از بخش Save as type گزینه Monochrome Bitmap را انتخاب کرده و تصویر را ذخیره نمایید .

بعد از مرحله تغییر سایز تصویر ، نوبت به تبدیل تصویر به کد هگز برای نمایش بر روی lcd گرافیکی st7920 می رسد . توسط نرم افزارهای متعددی می توان عمل تبدیل تصویر به کد هگز را انجام داد . در این آموزش ما نرم افزار LCD Assistant را معرفی می کنیم .
ابتدا نرم افزار LCD Assistant را اجرا می کنیم . از منوی بالا گزینه File>Load image را انتخاب کرده و تصویری که در مرحله قبل تغییر سایز دادیم را بارگزاری می کنیم . تنظیمات را مطابق تصویر زیر انجام می دهیم .

در مرحله بعد از منوی بالا گزینه File>Save output را انتخاب کرده و فایل خروجی که کد هگز می باشد را در مسیر دلخواه ذخیره نمایید . سپس فایل ذخیره شده را توسط نرم افزار Notepad باز کنید . تمامی کدها را copy کنید و به داخل فایل bitmap.h که پیوست پروژه است paste کنید و گزینه Save را بزنید .

توسط تابع نمایش تصویر که در کتابخانه GLCD ST7920 وجود دارد ، با دریافت نام جدول به عنوان آرگومان تابع که در این مثال truck می باشد ، تصویر را بر روی GLCD نمایش می دهد .
توابع کتابخانه به شرح زیر می باشد :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
/* * st7920.h * * Created on: Sep 19, 2020 * Author: Hossein */ #ifndef SRC_ST7920_H_ #define SRC_ST7920_H_ #include "main.h" /* LCD size */ #define ST7920_WIDTH 128 #define ST7920_HEIGHT 64 typedef union { uint16_t word; uint8_t nbyte[2]; } Dots; typedef struct { uint8_t refresh; Dots pix[128][64]; } GD_RAM; typedef enum { text, graphic } st7920_mode; typedef enum { WHITE = 0x00, BLACK = 0xFF } ST7920_Color; #define DISPLAY_CLEAR 0x01 // Fill DDRAM with "20H" and set DDRAM address counter (AC) to "00H" #define RETURN_HOME 0x02 // Set DDRAM address counter (AC) to "00H", and put cursor #define ENTRY_MODE_SET 0x04 // Set cursor position and display shift when doing write or read #define DISPLAY_CONTROL 0x08 // D=1: Display ON, C=1: Cursor ON, B=1: Character Blink ON #define CURSOR_DISPLAY_CONTROL 0x10 // Cursor position and display shift control; the content of #define FUNCTION_SET 0x20 // DL=1 8-bit interface, DL=0 4-bit interface #define SET_CGRAM_ADDRESS 0x40 // Set CGRAM address to address counter (AC) #define SET_DDRAM_ADDRESS 0x80 // Set DDRAM address to address counter (AC) #define STANDBY 0x01 // Enter standby mode, any other instruction can terminate. #define SCROLL_OR_RAM_ADDR_SEL 0x02 // SR=1: enable vertical scroll position #define REVERSE_BY_LINE 0x04 // Select 1 out of 4 line (in DDRAM) and decide whether to #define EXTENDED_FUNCTION_SET 0x20 // DL=1 :8-bit interface, DL=0 :4-bit interface #define SET_SCROLL_ADDRESS 0x40 // G=1 :graphic display ON, G=0 :graphic display OFF #define SET_GRAPHIC_RAM_ADDRESS 0x80 // Set GDRAM address to address counter (AC) #define DISPLAY_SHIFT_S 0x01 // Set 1, ENTRY_MODE_SET #define INCREASE_DECREASE_ID 0x02 // Set 1, ENTRY_MODE_SET #define CURSOR_BLINK_ON_B 0x01 // Set 1, DISPLAY_CONTROL #define CURSOR_ON_C 0x02 // Set 1, DISPLAY_CONTROL #define DISPLAY_ON_D 0x04 // Set 1, DISPLAY_CONTROL #define SHIFT_RL 0x04 // Set 1, CURSOR_DISPLAY_CONTROL #define CURSOR_SC 0x08 // Set 1, CURSOR_DISPLAY_CONTROL #define EXTENDED_INSTRUCTION_RE 0x04 // Set 1, FUNCTION_SET; Set 2, EXTENDED_FUNTION_SET #define DATA_LENGTH_DL 0x10 // Set 1, FUNCTION_SET; Set 2, EXTENDED_FUNTION_SET #define REVERSE_BY_LINE_R0 0x01 // Set 2, REVERSE_BY_LINE #define REVERSE_BY_LINE_R1 0x02 // Set 2, REVERSE_BY_LINE #define EN_VERTICAL_SCROLL_SR 0x01 // Set 2, SCROLL_OR_RAM_ADDR_SEL #define GRAPHIC_ON_G 0x02 // Set 2, EXTENDED_FUNTION_SET #define BUSY_FLAG_BF 0x80 void ST7920_Init(void); void ST7920_Command(unsigned char command); void ST7920_Data(unsigned char data); void SendByteSPI(uint8_t byte); void ST7920_Write(unsigned char row , unsigned char column, unsigned char clr); void ST7920_WriteText(unsigned char row, unsigned char col , char* string); void ST7920_GRAPHIC_MODE(void); void ST7920_TEXT_MODE(void); void ST7920_DrawBitmap(int16_t x, int16_t y, int16_t w, int16_t h,const uint8_t *bitmap , ST7920_Color color); void ST7920_Clear(void); void ST7920_pixel(uint8_t x, uint8_t y, uint8_t color); void ST7920_Fill_Buffer (uint8_t color); void ST7920_update (void); void writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,uint16_t color); void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color); void drawRect(int16_t x, int16_t y, int16_t w, int16_t h,uint16_t color); void writeFastVLine(int16_t x, int16_t y, int16_t h,uint16_t color); void writeFastHLine(int16_t x, int16_t y, int16_t w,uint16_t color); void drawFastVLine(int16_t x, int16_t y, int16_t h,uint16_t color); void drawFastHLine(int16_t x, int16_t y, int16_t w,uint16_t color); void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h,uint16_t color); void drawEllipse(int16_t x0, int16_t y0, int16_t rw, int16_t rh,uint16_t color); void fillEllipse(int16_t x0, int16_t y0, int16_t rw, int16_t rh,uint16_t color); void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); void drawCircleHelper(int16_t x0, int16_t y0, int16_t r,uint8_t cornername, uint16_t color); void fillCircle(int16_t x0, int16_t y0, int16_t r,uint16_t color); void fillCircleHelper(int16_t x0, int16_t y0, int16_t r,uint8_t corners, int16_t delta,uint16_t color); void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h,int16_t r, uint16_t color); void fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h,int16_t r, uint16_t color); void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,int16_t x2, int16_t y2, uint16_t color); void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,int16_t x2, int16_t y2, uint16_t color); #endif /* SRC_ST7920_H_ */ |
قابلیت کتابخانه lcd گرافیکی st7920 برای آردوینو
آموزش نمایش تصویر به همراه ابزار تبدیل تصویر به کد هگز
دارای فونت فارسی و انگلیسی در ابعاد 8*8 , 10*9 , 11*9 , 16*12
کتابخانه راه اندازی glcd st7920 در مد سریال SPI
راه اندازی در مد TEXT , GRAPHIC
قابلیت راه اندازی با ARDUINO , ESP32 , ESP8266 , STM32
قابلیت کتابخانه lcd گرافیکی st7920 برای بسکام
قابلیت نمایش متن و تصویر
دارای فونت فارسی در ابعاد 8*6 و 8*8
سورس کد راه اندازی glcd st7920 در مد 8bit
قابلیت کتابخانه lcd گرافیکی st7920 برای کدویژن
قابلیت کار در مد گرافیک و متن
قابلیت نمایش تصویر
دارای فونت فارسی در ابعاد 8*8 , 10*9 , 11*9 , 16*12 و چندین فونت انگلیسی
سورس کد راه اندازی glcd st7920 در مدهای 8bit , 4bit , SPI
قابلیت کتابخانه lcd گرافیکی st7920 برای stm32
قابلیت نمایش متن و تصویر
دارای فونت فارسی در ابعاد 8*8 و 11*9 , 16*12
سورس کد راه اندازی glcd st7920 در مدهای spi ، 8bit ، 4bit توسط توابع HAL
کتابخانه و مثال برای نرم افزارهای STM32CUBEIDE و KEIL
قابلیت پیکربندی تمامی پایه های LCD بر روی پایه های دلخواه میکرو ، توسط نرم افزار STM32CUBEMX





