
قبل از مشاهده پست اگر با انکودر و دیکدر آشنا نیستید به این دو پست مراجعه کنید
دیکدر چیست؟
انکدر چیست؟
همانطور که در دو پست قبلی با انکدر و دیکدر اشنا شدید حال می خواهیم که یک صفحه کلید ۸x8 را با استفاده از انکودر و دیکدر و atmega هشت راه اندازی کنیم
برای نمایش اطلاعات کلید فشرده شده از ال سی دی ۲x16 استفاده می کنیم
یک صفحه کلید ۸x8 بدون استفاده از دیکدر و انکدر جمعا ۱۶ پایه از میکرو را اشغال می کنند که با استفاده از انکدر و دیکدر این ۱۶ پایه به ۷ پایه کاهش پیدا می کند
ما اینجا تابعی نوشتیم که کار اسکن کردن صفحه کلید را انجام می دهد
نوع اسکن به دو روش انجام می گیرد اسکن سطری و اسکن ستونی که در اینجا از اسکن سطری استفاده شده است
قبل از هر چیزی ابتدا ویدیو دو دقیقه ای زیر را برای آشنایی با نحوه اسکن سوئیچ ها مشاهده کنید.
کد در کامپایلر کدویژن نوشته شده و به راحتی با تنظیمات پین و پورت برای دیگر کامپایلر های زبان C قابل استفاده است.
و همینطور کد بیسیک هم در زیر قرار داده شده است.
می توانید عملکرد برنامه شبیه ساز پروتیوس را در ویدیو زیر مشاهده کنید:
نمونه کد راه اندازی کیپد به زبان C:
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 |
/******************************************************* This program was created by the CodeWizardAVR V3.12 Advanced Automatic Program Generator © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 2/25/2021 Author : mohammad Company : www.mculibrary.ir Comments: Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include #include #include #include #include /////////////////www.mculibrary.ir///////////////////// // define... /////////////////www.mculibrary.ir///////////////////// #define row_b1 PORTB.0 #define row_b2 PORTB.1 #define row_b3 PORTB.2 #define col_b1 PINB.3 #define col_b2 PINB.4 #define col_b3 PINB.5 #define col_b4 PINB.6 /////////////////www.mculibrary.ir///////////////////// // scan_kbd... /////////////////www.mculibrary.ir///////////////////// unsigned char scan_kbd(){ unsigned char i=0,kbd_var=0,var=0; for(i=0;i<8;i++){ switch(i){ case 0: row_b1=0;row_b2=0;row_b3=0; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=15-var; break; case 1: row_b1=1;row_b2=0;row_b3=0; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=(15-var)+8; break; case 2: row_b1=0;row_b2=1;row_b3=0; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=(15-var)+16; break; case 3: row_b1=1;row_b2=1;row_b3=0; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=(15-var)+24; break; case 4: row_b1=0;row_b2=0;row_b3=1; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=(15-var)+32; break; case 5: row_b1=1;row_b2=0;row_b3=1; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=(15-var)+40; break; case 6: row_b1=0;row_b2=1;row_b3=1; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=(15-var)+48; break; case 7: row_b1=1;row_b2=1;row_b3=1; delay_ms(5); var=(col_b4<<3)|(col_b3<<2)|(col_b2<<1)|(col_b1<<0); if(var!=15)kbd_var=(15-var)+56; break; } } return kbd_var; } /////////////////www.mculibrary.ir///////////////////// // main... /////////////////www.mculibrary.ir///////////////////// void main(void) { unsigned char kbd_var=0,array[10]; DDRB=0x87; PORTB=0x00; DDRC=0x3F; PORTC=0x00; DDRD=0xFF; PORTD=0x00; lcd_init(16); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf(" MCULIBRARY.IR "); delay_ms(1000); lcd_clear(); ///// while (1) { lcd_gotoxy(0,0); lcd_putsf("Key Press:"); kbd_var=scan_kbd(); itoa(kbd_var,array); strcat(array," "); lcd_gotoxy(7,1); lcd_puts(array); delay_ms(100); } } |
نمونه کد راه اندازی کیپد به زبان بیسیک:
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 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
$regfile="m8def.dat" $crystal=8000000 $hwstack = 64 $swstack = 128 $framesize = 128 '///////////////// DDRB=&h87 PORTB=&h00 DDRC=&h3F PORTC=&h00 DDRD=&hFF PORTD=&h00 '///////////////// Config Lcdpin = Pin , Db4 = PortD.3 , Db5 = PortD.4 , Db6 = PortD.5 , Db7 = PortD.6 , E = PortD.2 , Rs = PortD.0 config lcd=16x2 CURSOR off declare Function scan_kbd() as byte dim kbd_var as byte,array as string*10 '////////////////////////////www.mculibrary.ir////////////////////////////////// ' define... '////////////////////////////www.mculibrary.ir////////////////////////////////// row_b1 alias PORTB.0 row_b2 alias PORTB.1 row_b3 alias PORTB.2 col_b1 alias PINB.3 col_b2 alias PINB.4 col_b3 alias PINB.5 col_b4 alias PINB.6 '////////////////////////////www.mculibrary.ir////////////////////////////////// '// main... '////////////////////////////www.mculibrary.ir////////////////////////////////// cls home lcd " MCULIBRARY.IR " wait 1 cls '///// do home lcd "Key Press:" kbd_var=scan_kbd() array="" array=str(kbd_var) array=array+" " locate 2,8 lcd array waitms 100 loop '////////////////////////////www.mculibrary.ir////////////////////////////////// '// scan_kbd... '////////////////////////////www.mculibrary.ir////////////////////////////////// Function scan_kbd() as byte local i as byte,kbd_var as byte,var as byte kbd_var=0:var=0 for i=0 to 7 step 1 select case i case 0: row_b1=0:row_b2=0:row_b3=0 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var case 1: row_b1=1:row_b2=0:row_b3=0 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var kbd_var=kbd_var+8 endif case 2: row_b1=0:row_b2=1:row_b3=0 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var kbd_var=kbd_var+16 endif case 3: row_b1=1:row_b2=1:row_b3=0 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var kbd_var=kbd_var+24 endif case 4: row_b1=0:row_b2=0:row_b3=1 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var kbd_var=kbd_var+32 endif case 5: row_b1=1:row_b2=0:row_b3=1 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var kbd_var=kbd_var+40 endif case 6: row_b1=0:row_b2=1:row_b3=1 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var kbd_var=kbd_var+48 endif case 7: row_b1=1:row_b2=1:row_b3=1 waitms 5 var=col_b4 shift var,left ,1 var=var or col_b3 shift var,left ,1 var=var or col_b2 shift var,left ,1 var=var or col_b1 if var<>15 then kbd_var=15-var kbd_var=kbd_var+56 endif end select next i scan_kbd= kbd_var End Function |
شرح خلاصه:
برای اسکن سوئیچ ها یه تابع به نام scan_kbd ایجاد کردیم که وضعیت خوانده شده کلید ها را بر می گرداند
در داخل تابع برای اسکن سطر ها از دستور for استفاده شده است
تعداد سطر هایی که اسکن خواهند شد هشت پایه بوده بنابراین حلقه for را از صفر تا هفت محدود کردیم بعد از هر بار اسکن مقدار را از portb.3 تا portb.6 خوانده و توسط دستورات شیفت در متغیر var ذخیره کرده ایم تا یک عدد کامل چهار بیتی داشته باشیم
اگر سوئیچی زده شده باشه مقداری که می خوانیم عددی غیر از پانزده خواهد بود پس با استفاده از دستور شرطی گفتیم که اگر مقدار خوانده شده غیر پانزده بود یعنی اینکه کلیدی زده شده و متغیر kbd_var را مقدار دهی می کنیم…
کد را تحلیل کنید اگر جایی از کد براتون مبهم بود بپرسید تا پاسخ بدیم
از جعبه دانلود هم می توانید فایل شبیه ساز پروتیوس و کدویژن و بسکام را دانلود کنید
راه اندازی کیپد 8 در 8 با بسکام avr
- رمز فایل www.mculibrary.ir
راه اندازی کیپد 8 در 8 با کدویژن avr
- رمز فایل www.mculibrary.ir
دیدگاهها (0)