سلام : پیرامون نظر دوست خوبمون اقای حسینی در جلسه اخر توضیحات تصمیم گرفتم یک سمپل تست هم بزارم برای کتابخونه؛ این عکس هم برای اوایلی هست که این LCD ( نمایشگر nokia 5110 ) رو راه اندازی کرده بودم ( توضیحات و مثال از کتابخانه نمایشگر nokia 5110 ) :
توضیحات و مثال از کتابخانه نمایشگر nokia 5110
ولی خب چند تا مشکل داشتیم این وسط، یکیش این بود که من سخت افزار رو ندارم الان ولی کدایی که قبلا نوشتم دارم، از همون کد ها یک سمپل در اوردم بر پایه میکروکنترلر stm32f103c8t6 که بیشتر از سایر میکروهای این شرکت رو بورسه و برد اموزشی های اونم زیاد پیدا میشه بنویسم؛خب بریم سراغ برنامه ی توضیحات خلاصه وار میدم از کد ولی فهمیدن کد مستلزم برگشت به آموزش های stm32 هستش.
تابع اولی که مینویسیم برای کانفیگ کلاک هست :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void RCC_Configuration(void){ ErrorStatus HSEStartUpStatus; RCC_DeInit(); /// RCC system reset(for debug purpose) RCC_HSEConfig(RCC_HSE_ON); /// Enable HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); /// Wait till HSE is ready if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); /// HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); /// PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); /// PCLK1 = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /// PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLCmd(ENABLE); /* Enable PLL */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /// Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /// Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); /// Wait till PLL is used as system clock source } } |
روی کریستال 8 مگ 72 مگاهرتز فرکانس داخلی میکرو کنترلرمون رو تنظیم میکنه این تابع :
1 2 3 4 5 6 7 |
void GPIO_PIN_Config(GPIO_TypeDef* port, uint16_t pin, GPIOMode_TypeDef mode, GPIOSpeed_TypeDef speed){ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = pin; GPIO_InitStructure.GPIO_Mode = mode; GPIO_InitStructure.GPIO_Speed = speed; GPIO_Init(port, &GPIO_InitStructure); } |
تابع کانفیگ کردن حالت روی پین های میکرو ( ورودی و خروجی و … ) :
1 2 3 4 5 6 |
void GPIO_Configuration(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE); } |
این تابع هم برای این استفاده میشه که پین هارو توش کانفیگ کنیم کلاک پین هارو وصل کنیم و این تابع رو به عنوان کانفیگ کننده پین ها اول تابع main لود کنیم؛ بقیه تنظیمات هم مشخصه و مجدد توضیحشون نمیدم
خب بریم سراغ کانفیگ LCD یدونه استراکچر داشتیم که لودش میکنیم تو برنامه مون :
1 |
N5110_Bitmap_TypeDef m; |
خب حالا به استراکچر مقدار میدیم چه مقدارایی؟ پینایی از ال سی دی که به میکرو متصل هستن رو تعریف میکنیم و اسم یک تابع برای تاخیر هامون که داریم ( این تابع برای ایجاد تاخیر در کتابخونه استفاده میشه )؛ حالا من پیشفرض اینجوری مقدار میدم :
1 2 3 4 5 6 7 8 9 |
N5110_TypeDef LCD = { {GPIOB, GPIO_Pin_0},//RST {GPIOB, GPIO_Pin_1},//CS {GPIOB, GPIO_Pin_2},//DC {GPIOB, GPIO_Pin_3},//DIN {GPIOB, GPIO_Pin_4},//SCK Delay_US, // Delay Function Name &m }; |
نکته : جلوی هر پینی که تعریف شده یک کامنت هست که مشخص کننده پایه ال سی دی هستش؛ برای این کار هم دوتا تابع تو کتابخونه بود استفاده میکنیم :
1 2 |
N5110_Init(&LCD); N5110_set_contrast(&LCD,58); |
حالا با تابع چاپ متن هم چنتا متن مینویسیم رو ال سی دی برای تست؛ اونم من اینجوری مینویسم :
1 2 3 4 |
N5110_write_txt(&LCD,1,1,"DMF313",0); N5110_write_txt(&LCD,1,10,"NOKIA 5110",0); N5110_write_txt(&LCD,1,12,"STM32F103C8T6",1); N5110_write_txt(&LCD,1,32,"library TEST ...",0); |
خب به همین سادگی ی برنامه برای تست نوشتیم و میتونید به سلیقه خودتون رو سایر میکرو ها هم تزیینش کنید؛ کل برناممون میشه این :
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 111 112 |
/* ** ** Main.c ** ** **********************************************************************/ /* Last committed: $Revision: 00 $ Last changed by: $Author: $ Last changed date: $Date: $ ID: $Id: $ **********************************************************************/ #include "stm32f10x_conf.h" #include "stdio.h" #include "5110.h" uint32_t volatile DELAY_US = 0; void RCC_Configuration(void){ ErrorStatus HSEStartUpStatus; RCC_DeInit(); /// RCC system reset(for debug purpose) RCC_HSEConfig(RCC_HSE_ON); /// Enable HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); /// Wait till HSE is ready if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); /// HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); /// PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); /// PCLK1 = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /// PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLCmd(ENABLE); /* Enable PLL */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /// Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /// Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); /// Wait till PLL is used as system clock source } } void GPIO_PIN_Config(GPIO_TypeDef* port, uint16_t pin, GPIOMode_TypeDef mode, GPIOSpeed_TypeDef speed){ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = pin; GPIO_InitStructure.GPIO_Mode = mode; GPIO_InitStructure.GPIO_Speed = speed; GPIO_Init(port, &GPIO_InitStructure); } void GPIO_Configuration(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE); } void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){ /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); GPIOx->ODR ^= GPIO_Pin; } void delay_us(volatile uint32_t us) { DELAY_US = us; //while(DELAY_US)DELAY_US--; while(DELAY_US); } void delay_ms(volatile uint32_t ms ) { while (ms--) {delay_us( 100 );} } void TIMER_Config(TIM_TypeDef* timer, uint16_t Period, uint16_t Prescaler, uint16_t ClockDivision, uint16_t CounterMode, FunctionalState status){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = Period; TIM_TimeBaseStructure.TIM_Prescaler = Prescaler; TIM_TimeBaseStructure.TIM_ClockDivision = ClockDivision; TIM_TimeBaseStructure.TIM_CounterMode = CounterMode; TIM_TimeBaseInit(timer, &TIM_TimeBaseStructure); TIM_ARRPreloadConfig(timer, status);//TIM4 Config for 1ms interrupt TIM_ClearITPendingBit(timer, TIM_IT_Update); TIM_ITConfig(timer, TIM_IT_Update, status); TIM_SetCounter(timer, 0); TIM_Cmd(timer, status); } static void NVIC_Config(uint8_t IRQChannel, uint8_t PreemptionPriority, uint8_t SubPriority , FunctionalState status){ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority; NVIC_InitStructure.NVIC_IRQChannelCmd = status; /*TIM4 Interrupt configuration*/ NVIC_Init(&NVIC_InitStructure); } static void TIMER_Configuration(void){ // TIM2 Configuration // NVIC_Config(TIM2_IRQn, 0, 1 , ENABLE); // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIMER_Config(TIM2, 360, 1, 0, TIM_CounterMode_Up, ENABLE); } int main(void) { RCC_Configuration(); GPIO_Configuration(); TIMER_Configuration(); GPIO_InitTypeDef GPIO_InitStructure; N5110_Bitmap_TypeDef m; N5110_TypeDef LCD = { {GPIOB, GPIO_Pin_0},//RST {GPIOB, GPIO_Pin_1},//CS {GPIOB, GPIO_Pin_2},//DC {GPIOB, GPIO_Pin_3},//DIN {GPIOB, GPIO_Pin_4},//SCK Delay_US, // Delay Function Name &m }; N5110_Init(&LCD); N5110_set_contrast(&LCD,58); N5110_write_txt(&LCD,1,1,"DMF313",0); N5110_write_txt(&LCD,1,10,"NOKIA 5110",0); N5110_write_txt(&LCD,1,12,"STM32F103C8T6",1); N5110_write_txt(&LCD,1,32,"library TEST ...",0); while(1) { } } |
برای استفاده از کتابخونه هم در سایر پروژه ها باید اونو تو پروژه تون اد کنید اول فایل کتابخونه رو به محل ذخیره پروژه کپی کنید؛ دوم از طریق کامپایلر فایل ها رو به پروژه اضافه کنید برای این کار هم؛ روی پروژه راست کلک کنید و add files … رو انتخاب کنید :
و به محل فایل کتابخونه برید و تمام فایل های font N5110.c N5110.h رو یه پروژه اضافه کنید؛ حالا فایل رو اول برنامه اینکلود کنید :
1 |
#include "5110.h" |
به همین سادگی :
از دوستان خواهش میکنم اولین کسی که این فایل رو تست کرد تو نظرات اعلام کنه تا من خیالم از سالم بودنش راحت باشه؛ به امید داشتن ایرانی اباد تر؛ موفق باشید.
مهمان
سلام
از این کتابخونه میشه توی keil هم استفاده کرد؟
مدیر سایت
سلام / باید تبدیلش کنید.
مهمان
سلام
یه lcd مشکوک داشتم که خواستم با برنامه شما چک کنم ولی ظاهرا مشکل داره؛ شما دنبال کسی بودید که عملا تست کرده باشه:
1- systick سیستم پیکربندی نشده پس عملا تو حلقه تاخیر بیرون نمی یاد.
2- در قسمت نمایش متن هم دچار hardfault میشه…
ان شاالله نمایشگر جدید بگیرم تست میکنم.
البته به بگم برای یه پروژه از کتابخونه پست های قبل استفاده کردم و جواب گرفتم ولی این یکی مشکل داره…
مهمان
سلام
1ـ ببخشید من باید این ال سی دی رو حتما با کیل رابندازم میخواستم بدونم این فایلها را میتوان با کیل کامبایل کرد؟
2-و همچنین میکرو مورد استفاده من lpc1768 هستش ایا فایلها نیاز به تغییری دارن اگر اره چقدر و ایا مشکله؟
ممنون بابت همچی
مهمان
سلام ، پین های B0 تا B4 باید به lcd متصل بشوند که شدند و کار هم نداد —>>> پین ها اشتباهه ؟؟

مهمان
سلام من پروژه رو خواستم با iar باز کنم کامپایل کنم بزنم رو برد stm32f103 بیشتر از 163 تا ارور داد بعضی فایلا و کتابخونه ها و سورسازو پیدا نمیکنه با این که ادد کردم همشو فایل تست که تو گزاشتی هم پروگرام می کنم رو برد صفجه خالیه چاره چیه به نظرت
نویسنده این مطلب
مهندس جان چرا با IAR?من کامپایلری رو معرفی کردم کم حجم از اینی معرفی کردم استفاده کنید مشکلی نخواهید داشت ….
مهمان
سلام
اگر امکانش هست نسخه pdf هر آموزش را توی سایت قرار بدید خیلی کاربردی خواهد بود.
مهمان
سلام راه اندازی کپید 4*4 رو اموزش بده با stm
نویسنده این مطلب
الگوریتم اسکن خاصی نداره صفحه کلید میتونید خیلی راحت همون هایی که برای AVR نوشته شدن رو تبدیل کنید