راه اندازی نمایشگر سون سگمنت با میکروکنترلر ARM
در این بخش دانلود پروژه راه اندازی نمایشگر سون سگمنت با میکروکنترلر ARM, توسط تیم الکترونیک و برنامه نویسی الکترونیک ۹۸ برای شما علاقه مندان به پروژه های میکروکنترلر ARM با هدف آموزش برنامه نویسی و راه اندازی میکروکنترلرهای ARM آماده شده است. یکی از نمایشگرهای پر استفاده در میکروکنترلر سون سگمنت ها در ابعاد و ارقام مختلف می باشند. این نمایشگرها به خاطر نوردهی و اندازه فیزیکی آن ها نسبت به ال سی دی LCD ارجعیت دارند.
نقشه شماتیک پروژه
اگر نیاز باشد از نمایشگرهای سون سگمنت چند رقمی استفاده کنیم, برای این منظور از روش اسکن یا تازه سازی استفاده می شود, این عمل بر اساس خطای چشم انسان صورت می گیرد. اگر یک ال ای دی LED را 50 بار در ثانیه روشن و خاموش کنیم چشم انسان LED را مدام روشن می بیند. این روش بدین صورت است که هر بار یکی از سگمنت ها را انتخاب کرده و سپس دیتای آن سگمنت را ارسال می کنیم و این عمل را برای سگمنت های بعدی به گونه ای تکرار می کنیم که حداکثر تاخیر تا ارسال مجدد دیتای سگمنت اول 20 میلی ثانیه باشد. البته باید به نوع فعال شدن پایه مشترک و سخت افزار استفاده شده, توجه لازم را داشته باشیم.
در این پروژه از چهار عدد سون سگمنت آند مشترک ماتریسی استفاده می شود و قصد داریم صفحه کلید را اسکن نماییم و عدد کلید فشرده شده از صفحه کلید را بر روی سون سگمنت نمایش دهیم. شکل زیر یک نمونه از اتصال سون سگمنت ها و صفحه کلید به میکروکنترلر AT91SAM7S از خانواده میکروکنترلر های ARM را نشان می دهد.
فایل PCB پروژه
PCB سخت افزار سون سگمنت 7SEG در فایل همراه پروژه موجود می باشد. مطابق سخت افزار طراحی شده برای روشن نمودن هر سون سگمنت به دلیل آنکه از سون سگمنت آند مشترک استفاده شده است باید پایه های مورد نظر (A,B,C,D,E,F,G,DP) را صفر نمود و پایه مشترک سون سگمنت را به مثبت پنج ولت متصل نمود, برای این کار باید بیس ترانزیستور را به ولتاژ صفر متصل نمود تا ترانزیستور روشن شود.
شرح عملکرد پروژه
در این پروژه از تایمر وقفه متناوب (PTT) استفاده می شود بطوریکه هر یک میلی ثانیه یک وقفه توسط کنترلر پیشرفته وقفه (AIC) تولید می شود و در روال وقفه کد عدد مورد نظر در لچ داده سون سگمنت قرار می گیرد و در لچ مشترک سون سگمنت کد مربوطه قرار می گسرد تا آن سون سگمنت روشن شود. به دلیل آن که چهار پایه سطرهای صفحه کلید با چهار پایه برد 7SEG مشترک می باشد باید در ابتدای روال وقفه مقدار آن ها خوانده شود و در پایان روال وقفه مقدار آن ها بازسازی شود به طوری که اسکن صفحه کلید با مشکلی روبرو نشود.
برنامه میکروکنترلر به زبان C در نرم افزار IAR Embedded Workbench IDE
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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
#include <Atmel/ioat91sam7s64.h> #include “keypad.h” #include #define EDOFF AT91C_BASE_PIOA->PIO_CODR=(1<<EDSEG); #define EDON AT91C_BASE_PIOA->PIO_SODR=(1<<EDSEG); #define EAOFF AT91C_BASE_PIOA->PIO_CODR=(1<<EASEG); #define EAON AT91C_BASE_PIOA->PIO_SODR=(1<<EASEG); #define EDSEG 15 #define EASEG 16 #define D0SEG 5 #define D1SEG 6 #define D2SEG 7 #define D3SEG 8 #define D4SEG 26 #define D5SEG 27 #define D6SEG 28 #define D7SEG 29 //———————————————————- void writedata (unsigned char data); void write_7seg (unsigned char data,unsigned char add); void shiftleft_7seg (unsigned char data); const unsigned char table [17]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xD8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; unsigned char count_pit,SEG1,SEG2,SEG3,SEG4; //———————————————————- void pit_irq_handler(void) { unsigned int dummy,k; dummy = AT91C_BASE_PITC->PITC_PIVR; dummy = dummy; k = AT91C_BASE_PIOA->PIO_ODSR&0x1E0; switch (count_pit) { case 0: write_7seg (SEG1,0xE); break; case 1: write_7seg (SEG2,0xD); break; case 2: write_7seg (SEG3,0xB); break; case 3: write_7seg (SEG4,0x7); break; } count_pit++; if (count_pit==4) count_pit=0; AT91C_BASE_PIOA->PIO_CODR=(1<<5|1<<6|1<<7|1<<8); if (0x20&k) AT91C_BASE_PIOA->PIO_SODR=(1<<5); if (0x40&k) AT91C_BASE_PIOA->PIO_SODR=(1<<6); if (0x80&k) AT91C_BASE_PIOA->PIO_SODR=(1<<7); if (0x100&k) AT91C_BASE_PIOA->PIO_SODR=(1<<8); } //—————————————————— void main() { //——————–start up————————– AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15) AT91C_BASE_RSTC->RSTC_RMR=0xA5000001; //——————–speed up————————– AT91C_BASE_CKGR->CKGR_MOR = 0xF01; AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; AT91C_BASE_PMC->PMC_MCKR = 0x3; AT91C_BASE_PMC->PMC_SCER = 0x1; //—————————————————– AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2 //—————————————————– AT91C_BASE_PIOA->PIO_PER= (1<<D0SEG|1<<D1SEG|1<<D2SEG|1<<D3SEG|1<<D4SEG|1<<D5SEG|1<<D6SEG|1<<D7SEG|1<<EDSEG|1<<EASEG); AT91C_BASE_PIOA->PIO_OER= (1<<D0SEG|1<<D1SEG|1<<D2SEG|1<<D3SEG|1<<D4SEG|1<<D5SEG|1<<D6SEG|1<<D7SEG|1<<EDSEG|1<<EASEG); AT91C_BASE_PIOA->PIO_SODR= (1<<D0SEG|1<<D1SEG|1<<D2SEG|1<<D3SEG|1<<D4SEG|1<<D5SEG|1<<D6SEG|1<<D7SEG|1<<EDSEG|1<<EASEG); count_pit=0; writedata (0xFF); EAON; EDON; EAOFF; EDOFF; SEG1=table[16]; SEG2=table[16]; SEG3=table[16]; SEG4=table[16]; keypad_pininit (5,6,7,8,17,18,19,20); keypad_init (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); AT91C_BASE_PITC->PITC_PIMR=0x3000BBB; AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) pit_irq_handler; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = 0x23; // AT91C_ID_SYS=1 AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_SYS); AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_SYS); __enable_interrupt(); while (1) { shiftleft_7seg (keypad_key ()); } } //———————————– void writedata (unsigned char data) { AT91C_BASE_PIOA->PIO_CODR= (1<<D0SEG|1<<D1SEG|1<<D2SEG|1<<D3SEG|1<<D4SEG|1<<D5SEG|1<<D6SEG|1<<D7SEG); if (0x01&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D0SEG); if (0x02&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D1SEG); if (0x04&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D2SEG); if (0x08&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D3SEG); if (0x10&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D4SEG); if (0x20&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D5SEG); if (0x40&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D6SEG); if (0x80&data) AT91C_BASE_PIOA->PIO_SODR=(1<<D7SEG); } //———————————– void write_7seg (unsigned char data,unsigned char add) { writedata (0xFF); EAON; EDON; EAOFF; EDOFF; writedata (data); EDON; EDOFF; writedata (add); EAON; EAOFF; } //———————————– void shiftleft_7seg (unsigned char data) { SEG4=SEG3; SEG3=SEG2; SEG2=SEG1; SEG1=table[data]; } //———————————– |