به نام خدا : نمایش عدد در lcd با صفحه کلید (کیپد) : انشاالله الان یه پروژه avr ساده رو میخوام بزارم که از صفحه کلید عدد و + و – و × و ÷ میگیره و در lcd نمایش میده.این برنامه مقدمه ای هستش برای نوشتن برنامه ماشین حساب.هدف از این برنامه آشنایی با کد ها هستش تا تو برنامه ماشین حساب گیج نشید(البته اون هم چیزی نداره ولی ممکنه تازه کارا رو یکم اذیت کنه.)
توضیح مدار :
۱) برای تر نمیز شدن مدار در پروتئوس اتصالات بین آی سی و صفحه کلید رو به صورت بیسیم و با استافاده از INPUT و OUTPUT تعریف کردم که تو آی سی ۴ تای اولی OUTPUT هستند یعنی اطلاعات میفرستن یعنی پایه های صفحه کلید رو صفر و یک میکنن و تو صفحه کلید هم ۴ تا ی اول به صورت INPUT هستن ، یعنی اطلاعات میگیرن و ۴ تا پایه بعد آی سی و صفحه کلید هم…. برای این که به برنامه بگیم که این پایه آی سی به فلان پایه صفحه کلید متصل هست باید پایه هایی که قراره به هم وصل باشن روشون دوبار کلیک کنیم و نام هایی یکسان بدهمیم.
لذا پایه هایی که نامشان مثل ها هست یعنی به هم وصل اند.
۲) اگه دقت کنید میبینید که تو صفحه کلید نصف پایه هاش ورودی هستن و و نصف دیگه خروجی ، البته اگه کد ها رو نگاه کنید متوجه میشید ولی میگم الان : تو تابع key اگه نگاه کنید میبینید که اومده از بین پورت های PD0 تا PD3 همه رو صفر کرده الا یکی ؛ مثلا PD0 رو یک کرده و ۳ تای دیگه رو صفر(یعنی الان اگه رو دکمه های ۷ یا ۸ یا ۹ یا ضربدر صفحه کلید ، کلیک شود ما میفهمیم) ، حالا اگه ما روی هر کدام از دکمه های گفته شده کیک کنیم ، آن پایه مقدار ۱ رو به آی سی میفرسته ، مثلا اگه ما روی دکمه ۸ در صفحه کلید کلیک کنیم ، پایه شماره ۶ صفحه کلید مقدار ۱ رو به آی سی ارسال میکنه. امید وارم که متوجه شده باشید.
توضیح کد های برنامه :
این برنامه دوتابع دارد ، یکی main که تو همه برنامه ها هستش و یکی key که با استفاده از این تابع میفهمیم که روی چه چیزی در صفحه کلید کلیک شده ،
روی عدد ۲ کلیک شده یا روی عدد ۰ یا روی ضرب در یا روی ….
بعد که ما فهمیدیم روی چه چیزی کلیک شده ، تو تابع main میگیم که اونو نمایش بده.
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 |
#include <mega16.h> #include <delay.h> #include <lcd.h> #asm .equ __lcd_port=0x1B; //PORTA #endasm //############################################# int key(); char y=0 ; //############################################# void main(void) { DDRD=0x0F; lcd_init(16); lcd_puts(" DMF313.IR");delay_ms(1000);lcd_clear(); while(1) { y = key(); if(y == 0) {lcd_putchar('0'); delay_ms(250);} if(y == 1) {lcd_putchar('1'); delay_ms(250);} if(y == 2) {lcd_putchar('2'); delay_ms(250);} if(y == 3) {lcd_putchar('3'); delay_ms(250);} if(y == 4) {lcd_putchar('4'); delay_ms(250);} if(y == 5) {lcd_putchar('5'); delay_ms(250);} if(y == 6) {lcd_putchar('6'); delay_ms(250);} if(y == 7) {lcd_putchar('7'); delay_ms(250);} if(y == 8) {lcd_putchar('8'); delay_ms(250);} if(y == 9) {lcd_putchar('9'); delay_ms(250);} if(y == 10) {lcd_putchar('/'); delay_ms(250);} if(y == 11) {lcd_putchar('*'); delay_ms(250);} if(y == 12) {lcd_putchar('-'); delay_ms(250);} if(y == 13) {lcd_putchar('+'); delay_ms(250);} if(y == 14) {lcd_putchar('='); delay_ms(250);} if(y == 15) {lcd_clear(); delay_ms(250);} } } //############################################# int key(void) { while(1) { PORTD.0 = 1 ; PORTD.1 = 0 ; PORTD.2 = 0 ; PORTD.3 = 0 ; if(PIND.4 == 1){return 7 ; delay_ms(50);} if(PIND.5 == 1){return 8 ; delay_ms(50);} if(PIND.6 == 1){return 9 ; delay_ms(50);} if(PIND.7 == 1){return 10; delay_ms(50);} //========================================== PORTD.0 = 0 ; PORTD.1 = 1 ; PORTD.2 = 0 ; PORTD.3 = 0 ; if(PIND.4 == 1){return 4 ;} if(PIND.5 == 1){return 5 ;} if(PIND.6 == 1){return 6 ;} if(PIND.7 == 1){return 11;} //========================================== PORTD.0 = 0 ; PORTD.1 = 0 ; PORTD.2 = 1 ; PORTD.3 = 0 ; if(PIND.4 == 1){return 1 ;} if(PIND.5 == 1){return 2 ;} if(PIND.6 == 1){return 3 ;} if(PIND.7 == 1){return 12;} //========================================== PORTD.0 = 0 ; PORTD.1 = 0 ; PORTD.2 = 0 ; PORTD.3 = 1 ; if(PIND.4 == 1){return 15;} if(PIND.5 == 1){return 0 ;} if(PIND.6 == 1){return 14;} if(PIND.7 == 1){return 13;} //========================================== PORTD.0 = 1 ; PORTD.1 = 0 ; PORTD.2 = 0 ; if(PIND.5 == 1){return 16 ;} if(PIND.6 == 1){return 17;} if(PIND.7 == 1){return 18 ;} //========================================== PORTD.0 = 0 ; PORTD.1 = 1 ; PORTD.2 = 0 ; if(PIND.5 == 1){return 19 ;} if(PIND.6 == 1){return 20 ;} if(PIND.7 == 1){return 21 ;} //========================================== PORTD.0 = 0 ; PORTD.1 = 0 ; PORTD.2 = 1 ; if(PIND.5 == 1){return 22 ;} if(PIND.6 == 1){return 23 ;} if(PIND.7 == 1){return 24 ;} } } |
در کل نمایش عدد در lcd چیز خاصی نداره ولی اگه جاییش رو نفهمیدید ، درخدمتیم.
دانلود : شبیه سازی و کد های پروژه
عملی بستن مدار
توجه : برا عملی بستن مدار برا کیپد یادتون نره مقاومت پول آپ قرار بدید!؛ میتونید این مطلب ( آموزش جامع کار با کیپد ) رو بخونید.
مهمان
با سلام .
بنده در حال کار روی پروژه کارشناسی هستم که کنترلر pid هستش … پروژم تقریبا کامل شده فقط یک قسمت هست که با پیکربندی یک LCD کاراکتری و کی پد قرار هست که مقادیر یک کی پد ۴*۳ تلفنی رو روی LCD نمایش بدهم … ولی به مشکلی برخوردم که چند هفتس رو مخمه و تا حالا کسی نتونسته جوابی براش پیدا کنه !!!… موضوع از این قراره که من ردیف ها ی کیپد رو 0و1 میکنم و چک میکنم که کدام ستون ( که ورودی هست) صفر میشه … حالا میتونم فایلهای پروژه رو هم براتون ارسال کنم …. ولی گیر من سر اطلاعات یکی از ستون هاست که ستون ۱ باشه ،یعنی اعداد 1,4,7و کاراکتر* که به شکل عجیب و غریبی وارد میکرو نمیشن!!!! … من با وقفه خارجی اسکن کیپد رو انجام میدهم … همه ی اعداد و کاراکتر # به سیستم وارد و نمایش داده میشن و پردازش های بعدی هم انجام میشه … اما به هیچ وجه مقادیر 1,4,7,* رو قبول نمیکنه!!! … چنتا کار که به ذهنم میرسید انجام دادم …. مثلا ستون ها رو عوض کردم برای مثال ستون 3 رو با ۱ عوض کردم که در این حالت با فشردن مثلا 3 باید 1 وارد بشه ولی بازهم نشد ولی وقتی 1 رو میزدم قشنگ 3 رو نشون میده رو lcd و طبق اون پردازش انجام میده ، فهمیدم از کیپد نیست … بعد رفتم تو برنامه (زبان c ) شروع کردم به عوض کردن اون پایه ای که قرار بود این اعداد 1,4,7,* رو اسکن کنه و عوضش کردم … گفتم شاید مشکل از پین باشه … ولی بازهم نشد یعنی این اعداد وارد میکرو نمیشن اصلا … فهمیدم مشکل از پینهای میکرو هم نیست ….ولتاژ پایه ها رو هم بررسی کردم موقع فشار دادن این دکمه های ۱،۴،۷،* همون ولتاژ ۰.۵۶ ولتی(بخاطر گیت and دیودی ) روی پایه وقفه خارجی (لبه پایین رو falling ) هست که موقع فشار دادن بقیه دکمه ها هست !!!!… این پروژه مثل هلو توی Proteus داره جواب میده و هیچ مشکلی هم نیست ولی توی پیاده سازی واقعیش این مشکلی که گفتم داره !!!!… در ضمن debounce کلید ها رو هم کامل رعایت کردم … چون از پورت c استفاده کردم برای اسکن کیپد حواسم هست که باید jtag رو غیر فعال کنم (در این حد حالیمه !!! ) … همچنین تو مدار یک led گذاشتم که هر مقداری که با کیپد وارد میکرو میشه led رو یک ثانیه روشن کنه … دقیقا وقتی ۱،۴،۷،* رو میزنم led توی پروتئوس روشن میشه توی واقعی خاموش میمونه ولی وقتی هر دکمه دیگه ای رو میزنم روشن میشه !!!! روی دوتا میکرو مشابه هم انجام دادم که فرقی نکرد و هنوز مشکل پا برجا بود !!!!! … حالا که زحمت کشیدید و روده درازی های بنده رو خوندید لطفا اگر راه دیگه ای هست که بررسی نکرده باشم ، برام در پاسخ ذکر بفرمایید . اگر راهنمایی کنید که این مشکل حل بشه ( اگر تونستید عیبشو پیدا کنید ) از نظر من سطح علمیتون و تجربتون یه سرگردن از همه ی مدعی های میکرو کار های avr بالا تره …
اعیاد شعبانیه و سال نو هم پیشاپیش مبارک .
مهمان
سلام وقتتون بخیر من میخام یه حرف را روی ال سی دی کاراکتری توسط چهار کلید به سمت چپ،راست،پالا،پایین حرکت بدم.میشه کمکم کنید ممنون
مهمان
سلام وقت بخیر اگه لطف کنید برنامه با استفاده از یک LCD و چهار کلید معادل BCD معادل عددی کلید ها را به شکل باینری دسیمال و هگزادسی مال روی LCD نمایش دهید
مهمان
سلام وقتتون بخیر..پروژه ماشین حساب ساده با atmega16دارم…ولی ال سی دیم روشن نمیشه…هنوز هم میکرو رو پروگرام نکردم…..برای فقط روشن شدا ال سی دی غیر از پایه های d4 d5 d6 d7 وrs e rw که به میکرو وصل میشن چه پایه های دیگه ای رو باید زمین کنم یا پاور بدم؟…ممنون میشم راهنماییم کنید
مهمان
داداش این چرا 32 تا عدد مثلا 9 نشون میده من بخوام یه دونه عدد نشون بده چی کار کنم
مهمان
سلام وقت تون بخیر

ممنون از مطالب مفید تون
من فایل کدها و مدار شبیه سازی شده رو دانلوذ کردم اما متاسفانه باز نمیشه
و اینکه من مدار رو در پروتئوس شبیه سازی کردم ولی وقتی اجرا میکنم ارور میده
باید قبل اجرا کار خاصی انجام بدم؟
ممنون میشم راهنماییم کنید چون اصلا کار با کد ویژن رو بلد نیستم
نویسنده این مطلب
سلام
بعد دانلود و خارج کردن پروژه از حالت فشرده – اسم پوشه رو انگلیسی کنید.
مهمان
سلام میخواستم بدونم میشه برای مقاومت های pull up فقط از یه button استفاده کرد؟؟همه رو به همون اتصال داد؟؟
نویسنده این مطلب
سلام
متوجه منظورتون نشدم.
مهمان
سلام الان من مدارو به صورت زیر بستم درست بسته شده؟؟ به طور خودکار رو lcd عدد 7 نشون میده
http://uupload.ir/files/pmwy_img-20180511-wa0011.jpg
http://uupload.ir/files/9p26_img-20180511-wa0010.jpg
نویسنده این مطلب
سلام
برا بحث نور نمایشگر : باید از پتاسیوتر در راه اندازی lcd استفاده کنی و مقدار پتاسیومترو درست تنظیم کنی تا درست شه.
برا بحث نمایش 7777 : باید برا کیپد از مقاومت پول آپ/دان (بستگی به نحوه کد نویسی داره) استفاده کنی و مقادرش هم مثلا بین 4.7کیلو تا 10 کیلو باشه.
مهمان
مقاومت پول آپ هم گذاشته بودم اگه به شکل دقت میکردید.فقط مطمئن نیستم درست وصل کرده باشم:
http://uupload.ir/files/4ar3_img-20180511-wa0012.jpg
مهمان
برای ساخت یه قفل رمز دار الکترونیکی
مهمان
استفاده از کیپد بدون برنامه نویسی امکان داره؟؟؟
نویسنده این مطلب
استفاده از کیپد بدون برنامه نویسی زیاد : بله
اما بدون هیچ برنامه نویسی : خب معلومه نه.
از کتابخونه استفاده کنی کد نویسیت کمتر میشه.
مهمان
سلام
ببخشید آیا میشه به جای استفاده از ۸پین میکرو برای ۱۶کلید(صفحه کلید ماتریسی) از ۲پین استفاده کرد؟
نویسنده این مطلب
سلام
https://dmf313.ir/طراحی-keypad-فقط-با-یک-پایه-میکرو/
اینو ببین – یه روش.
مهمان
اقا مهدی روشن نشد جگار کنم
مهمان
سلام

عذر میخوام
میشه لطفاً راهنمایی کنید
در کدویژن وقتی میخوام برنامه رو کامپایل کنم به تابع void keypad خطا میگیره
میگه ‘;’ expected !!!! خب این خط از برنامه که نیازی به ‘;’ نداره ….
لطفاً بگین اشکال از کجامیتونه باشه
مهمان
سلام میگم من این برنامه رو خودم نوشیتم بدون lcd اسکن میکنه ولی وقتی یه دکمه میزنی دیگه اسکن نمیکنه میشه بگین مشکل چیه
بعد چرا داخل پروتیوس از واچ داگ استفاده کردین
#include ;
#include ;
int key();
char y=0;
void main(void)
{
DDRB=0x0F;
while(1)
{
y=key();
if(y==0){delay_ms(250);}
if(y==1){delay_ms(250);}
if(y==2){delay_ms(250);}
if(y==3){delay_ms(250);}
if(y==4){delay_ms(250);}
if(y==5){delay_ms(250);}
if(y==6){delay_ms(250);}
if(y==7){delay_ms(250);}
if(y==8){delay_ms(250);}
if(y==9){delay_ms(250);}
if(y==10){delay_ms(250);}
if(y==11){delay_ms(250);}
if(y==12){delay_ms(250);}
if(y==13){delay_ms(250);}
if(y==14){delay_ms(250);}
if(y==15){delay_ms(250);}
};
};
int key(void)
{
while(1)
{
PORTB.0=1;
PORTB.1=0;
PORTB.2=0;
PORTB.3=0;
if(PINB.4==1){return 0;delay_ms(50);}
if(PINB.5==1){return 1;delay_ms(50);}
if(PINB.6==1){return 2;delay_ms(50);}
if(PINB.7==1){return 3;delay_ms(50);}
PORTB.0=0;
PORTB.1=1;
PORTB.2=0;
PORTB.3=0;
if(PINB.4==1){return 4;}
if(PINB.5==1){return 5;}
if(PINB.6==1){return 6;}
if(PINB.7==1){return 7;}
PORTB.0=0;
PORTB.1=0;
PORTB.2=1;
PORTB.3=0;
if(PINB.4==1){return 8;}
if(PINB.5==1) {return 9;}
if(PINB.6==1){return 10;}
if(PINB.7==1){return 11;}
PORTB.0=0;
PORTB.1=0;
PORTB.2=0;
PORTB.3=1;
if(PINB.4==1){return 12;}
if(PINB.5==1){return 13;}
if(PINB.6==1){return 14;}
if(PINB.7==1){return 15;}
};
};
مهمان
سلام جناب مهندس
ببخشید این ماشین حساب عدداعشاری رو به عنوان ورودی نمیگیره ؟؟؟؟؟؟؟؟؟
نویسنده این مطلب
سلام-نه خودت باید اضافش کنی.
مهمان
سلام ممنون از سایت بسیار خوبتون من یه خواهش ضروری دارم
یه پروژه ماشین حساب دادم بیرون برام درست کنن پروژه رو بهم تحویل داد اما بر نامه نویسیش رو لازم دارم خیلی برا استادم فایل برنامه مهمه ون اقا هم جوابمو نمبده
یه ماشین حساب که ۴ عمل اصلی رو انجام بده و به اضافه سینوس و کسینوس و برای سینوس کسینوس نمودار هم بتونه رسم کنه
اگه همچین برنامه ای رو به ایمیلم بفرستید یه دنیا ممنون میم fateme.behnam.1374@gmail.com
مهمان
سلام.
من اینو با۷Sدرست کردم ولی فقط بعد اینکه عددو زدم دیگه میکرو صفحه کلید رو اسکن نمی کنه چیکار کنم؟
کدها
http://paste.debian.net/977752/
مقاومت هم گذاشتم تاثیری نداشت.
نویسنده این مطلب
سلام
خب کدت چند تا مشکل داره
۱) وقتی به برنامه به کد return میرسه – بقیه کدها رو اجرا نمیکنه و از اون تابع خارج میشه – لذا اون دیلای ها رو تو تابع main و بعد از
y = key();
بزاری به نظرم بهتره.
۲) دیلای ۵۰ میلی خیلی کمه – شما ۴۰۰ تا بزار
۳) مقاومت پول دان هم باید گزاشته باشی برا پایه های PIND.4 تا PIND.7 – حتما باید بزاره – مطلبشو خوندی دیگه؟ مقاومت ۴٫۷ تا ۱۰ کیلو داری بزار.
مهمان
سلام.
کد خودت هم مشکل داره که!
وقتی هیچی نمی زنم می نویسه۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷۷
نویسنده این مطلب
سلام مجدد – این برا نبودن مقاومت پول آپ/دان هستش
مهمان
سلام . من با شماتیکی که خودم تو پروتئوس کشیدم و کدی که خودم نوشتم ، برنامه رو اجرا کردم . اما وقتی مثلا عدد ۷ رو میزنم دیگه چراغ قرمز ۴ تا پین اول حرکت نمی کنه و خودش بدون اینکه من چیزی دست بزنم عدد ۷ رو اضافه میکنه . اما با شماتیک که شما واسه دانلود گذاشتین که عین شماتیکی بود که من کشیدم برنامه رو هم روی کد خودم هم روی کدی که تو فایل دانلودی بود اجرا کردم این مشکل رو نداشت . چرا تو پروتئوس عین شماتیکی که شما کشیدین میکشم اما مشکل بالا پیش میاد .؟
درضمن ممنون بابت آموزش
مهمان
سلام جناب دمیرچی.به ما بگو برنامه نویسی پروزه کاریم کجا ببرم.بلد نیستم چکار کنم
نویسنده این مطلب
سلام.یعنی یه جارو معرفی کنم تا برات انجام بدن؟
مهمان
با سلام خدمت شما می خواستم بپرسم که چگونه میشه با فشار دادن کلید ستاره در کی پد عدد ها روی ال سی دی نوشته شود یا همون که دارای اینتر باشه
نویسنده این مطلب
سلام
متوجه نشدم.
مهمان
سلام
من میخاستم با زدن کلید c ال سی دی پاک شده مکان نما به مختصات (۰,۰) بره اما نتونستم پیداش کنم میتونید راهنماییم کنید
تشکر
نویسنده این مطلب
سلام – فیوز بیت JTAG رو هم غیر فعال کن
https://dmf313.ir/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-lcd-%DA%A9%D8%A7%D8%B1%D8%A7%DA%A9%D8%AA%D8%B1%DB%8C/
مهمان
سلام اقا اگه همه رو خروجی تعریف کنیم بعد چهار پورت اول رو سطر بزاریم بقیه رو ستون بعدشم مثه بالا بنویسیم ؟مشکلش چیه؟
نویسنده این مطلب
سلام
همه خروجی برا کیپد نمیشه – اون وقت چطور میخوای بخونی.
مهمان
سلام مهندس.ممنون بابت آموزش خوبتون.من این رو مدار رو میخوام pcb رو تو آلتیوم بکشم اما صحه کلیدی که میاره کلا دوتا سیم داره که بصورت باس هستش.چیکار کنم که هر هشتا سیم صفحه کلیدم نمایش داده بشه تا بتونم به میکرو وصلش کنم؟ یا اگه راه دیگه ای هست که یصورت باس بتونم به میکرو وصلش کنم بگین.ممنون
نویسنده این مطلب
سلام
باس یعنی چی؟
مهمان
منظورم سیم کشی بصورت bus .شما نمیخوای مدارت شلوغ بشه بجای اینکه مثلا 10 تا سیم بکشی از چی استفاده میکنی؟! الان من تو آلتیوم صفحه کلید انتخاب میکنم به ائنصورت میاد فقط دوتا سیم هستش.من میخوام پی سی بی رو در بیارم چیکارش کنم.
نویسنده این مطلب
آها – خب تو آلتیوم من نت میزارم ولی این که قطعه انتخابیت 2 تا پایه داره خب یعنی قطعه رو اشتباه انتخاب کردی.
کیپد رو بزار رو برد برد ببین چند تا خونه اشغال میکنه – یه هدر به همون اندازه قرار بده تو آلتیوم و …
مهمان
سلام من میخوا م بر روی عدد گرفته شده از کیپد محاسبه انجام بدم..ولی نمیشه
مهمان
سلام.دوست عزیز میشه شمارتون رو برام ایمیل کنید.چندتا سوال در مورد یه پروژه ازت داشتم
نویسنده این مطلب
سلام
سوالای الکترونیکی در سایت مطرح شوند – برا بحث انجام پروژه تماس گرفته شود(پروژه دانشجویی انجام نمیشه) و جزئیات پروزه ایمیل بشه.
mahdedamarchi@gmail.com
مهمان
درود. آقا مخم دود بلند شد از بس فکر کردم!اعداد رو وارد میکنم و نمایش هم میده ولی عدد قبلیش چرا پاک میشه؟من ک کلیر نزاشتم!!!!!!!
نویسنده این مطلب
کدت رو به صورت TXT برام آپلود کن تو پیکو فایل و لینکش رو برام بفرست
مهمان
سلام. من برنامه اسکن کیبورد نوشتم مثل چیزیه ک شما نوشتی!فقط هر سری ک اسکن و نمایش میده عدد قبلی پاک میشه!بنظرت چکار میشه کرد؟
نویسنده این مطلب
سلام
احتمالا از تابع lcd_clear استفاده کردی و یا از تابع lcd_gotoxy و مقدار ثابتی بهش دادی و مقدارش رو تنظیم نمیکنی.
مهمان
سلام مهندس. آقا من میخوام تو این برنامه اینتراپت هم تعریف کنم. دوتا intrupt
زمانی که اینتراپت صفر فشار دادم یک رقم به عدد نمایش داده شده روی ال سی دی اضافه بشه و زمانی که اینتراپت یک رو فشار دادم یک رقم از عدد نمایش داده شده روی ال سی دی کم بشه. من از برد آموزشی استفاده کردم و اینکه میگم اینتراپت رو فشار میدم به همین خاطره.برای اینتراپت صفر یک دو کلید در نظر گرفته شده. ممنون از سایت خوبتون خسته نباشین
نویسنده این مطلب
سلام آموزش وقفه تو سایت هستش…
مهمان
سلام آقای مهندس ، ممنون بابت مطالب مفیدی که به اشتراک میزارید ، آقای مهندس تو ادامه این پروژه میشه کمک کنید که ۱-من بتونم یک ماشین حساب با قابلیت جمع و تفریق برنامه اش رو بنویسم ؟ (البته با تعداد ارقام متغیر)
۲-و درنهایت ماشین حساب رو که ساختیم بتونه محاسبات و نتیجه محاسبات قبل رو در خودش ذخیره کنه تا در صورت نیاز بهمون نمایش بده ؟
راستی آقای مهندس اگر در ارتباط با نوشتن همین برنامه ها در نرم افزار Atmel Stdio هم اگر اطلاعاتی دارید ممنون میشم راهنمایی کنید .
بازم ممنونم
نویسنده این مطلب
سلام
تو نت فک کنم یه پروژه ای دیدم برا ماشین حساب اونو میتونید دانلود کنید و کد هاش رو تحلیل
شما کد رو بنویسید اگه مشکلی، سوالی چیزی بود در خدمتیم.
با اتمل کار نکردم/
و این که اگه برا پروژتون از تابع تابع کردن پروژه استفاده کنید برا سادگی کار و عیب یابی آسون تر
تابعی برا دریافت عدد
تابعی برا ضرب، تقسیم و…
تابعی برا نمایش
مهمان
خیلی ممنون تونستم ازش ایده بگیرم با یذره ساده سازی یدونه کیپد ۴*۳ رو راه اندازی کنم متاسفانه استاد مفت خور یه متن اشتباه رو کپی پیست کرده بود آورده بود سر کلاس هر چی امتحان میکردیم جواب نمیداد T_T
مهمان
مرسی از مطالب خوبتون امیدوارم همینطور ادامه بدید
یه سوالی که داشتم این قسمت اخر کدتون که پایین اوردمش دقیقا چیکار میکنه وبه چه منظوریه اصن برگشت به ۱۶ به بالا که نداریم؟
PORTD.0 = 1 ;
PORTD.1 = 0 ;
PORTD.2 = 0 ;
if(PIND.5 == 1){return 16 ;}
if(PIND.6 == 1){return 17;}
if(PIND.7 == 1){return 18 ;}
//==========================================
PORTD.0 = 0 ;
PORTD.1 = 1 ;
PORTD.2 = 0 ;
if(PIND.5 == 1){return 19 ;}
if(PIND.6 == 1){return 20 ;}
if(PIND.7 == 1){return 21 ;}
//==========================================
PORTD.0 = 0 ;
PORTD.1 = 0 ;
PORTD.2 = 1 ;
if(PIND.5 == 1){return 22 ;}
if(PIND.6 == 1){return 23 ;}
if(PIND.7 == 1){return 24 ;}
نویسنده این مطلب
سلام
بدون استفاده
حواسم نبود حذفش کنم
مهمان
سلام
مثل همیشه آموزش هاتون عالیه.
حق نگهدارتون..
مهمان
سلام خسته نباشی.
من یک سوال داشتم .در مورد کی پد.
میخوام برنامه هفتگی اجرا کنه. مثلا مثبت شنبه در نظر بگیر.
اگر کلید شنبه به اضافه ۰ فشار بدم تو ال سی دی شنبه نمایش داده میشود.
و اگر کلید شنبه به اضافه ۱ فشار بدم تو ال سی دی یکشنبه نمایش داده میشود.
منظورم این هست
http://s6.uplod.ir/i/00653/iba3o3v2zxst.jpg
نویسنده این مطلب
من جواب نظرت رو دادم ولی مثل این که ندیدی
پس همه ی دکمه ها توی یه کیپد هستن
والا با تایمر میشه انجام داد بدون تایمر هم میشه(با تایمر بهتره)
به نظرم ۲ تا تابع بررسی دکمه فشرده شده تعریف کن
یکی برا اعداد و یکی برا روز های هفته
۴ تا پایه وودی و ۴ تا خروجی(برا دادن کیپد باید یکی از پورت ها رو این طوری مقدار بدی)
دفعه اول تابع “بررسی دکمه فشرده شده برا روز ها” رو فرابخون و داخل یه وایل بزار(تا زمانی که این تابع فشرده شدن روزها همین مقدار رو میده، یعنی طرف دستش روی دکمه هستش)
و بعد بیا تابع برا اعداد رو فرا بخون و تو یه switch بررسی کن اگه ۰ فشرده شده بود (و تابع روز ها هم شنبه فشرده شده بود) اون وقت بیا و شنبه رو نشون بده و در غیر این صورت کاری نکن
مهمان
سلام خسته نباشی.
من یک سوال داشتم .در مورد کی پد.
میخوام برنامه هفتگی اجرا کنه. مثلا مثبت شنبه در نظر بگیر.
اگر کلید شنبه به اضافه ۰ فشار بدم تو ال سی دی شنبه نمایش داده میشود.
و اگر کلید شنبه به اضافه ۱ فشار بدم تو ال سی دی یکشنبه نمایش داده میشود.
نویسنده این مطلب
سلام
یعنی ۷ تا کلید برا روز های هفته و ۱۰ تا کلید برا اعداد ۰ تا ۹
میشه مثل ctrl+c مثلا….
برای این کار
اول باس بگی که کل این کلید ها(۷+۱۰=۱۷) تو به کیپد هستش
یا اعداد کیپد هستن و روز ها کلید(و اگه کلید هستش چه جوری کلیدی هستش…فشاری یا ثابت)
اینا رو بگو تا بهت بگم
چون در هر حالت داستان فرق داره
مهمان
بابا همش 256 خط پروژمه بعدشم در مورد پروژه ی شما هم همین مشکل صدق میکنه
مهمان
یا لااقل بگو مشکل برنامه ی من چیه که ال سی دی رو پاک نمیکنه؟
نویسنده این مطلب
شونصد خطه پروژت …. من الان ایام امحاناتم هستش
مهمان
خب بیا یکاری کن فیلم تستشم واسه من بگیر نشونم بده که من بدونم مشکل از منه
نویسنده این مطلب
اصلا شرمنده…حالا که فکر میکنم میبینیم مشکل از منه…
شما به بزرگی خودتون ببخشید
مهمان
اقا چرا تو برنامه ی خودت اعداد از lcd پاک نمیشن؟
نویسنده این مطلب
تست کردم مشکلی نیست…
مهمان
برادر من مگه شما نمیگی برنامه ای که در مورد کی پد نوشتی درسته و کار میکنه؟
نویسنده این مطلب
۱-کی گفتم؟خاطرم نیست متاسفانه
۲-تست کردم سالمه…
۳-به جای این ، مطلب زیر رو استفاده کنید
https://dmf313.ir/%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%DA%A9%DB%8C%D9%BE%D8%AF-%D8%A8%D8%A7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1-avr/
۴-اگه در عمل منظورتونه …. برایاین مطلب باید از پول آپ برا کیپد استفاده کنید…
و مطلبی که لینکش رو در بالا گزاشتم نیازی به مقاومت پول آپ نداره
نویسنده این مطلب
قسمت کد های کیپد….فهمیدن این که کدوم دکمه فشرده شده ….رو مثل مطلب زیر بنویس >>>>
https://dmf313.ir/%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%DA%A9%DB%8C%D9%BE%D8%AF-%D8%A8%D8%A7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1-avr/
مهمان
داداش پروژت یه مشکل کوچولو داره اونم اینه که lcd کلیر نمیشه و بجاش حالا بستگی داره به کی پد یه عدد دیگه تایپ میشه
مهمان
اقا من تو برنامم یه جاییش گیر افتادم که بجای حذف عدد تایپ میکنه هفت میتونین کمکم کنید؟
که فایل برنامه نویسمو بذارم؟
نویسنده این مطلب
بفرست…
زیپش کن
شب (اگه مشکلی پیش نیاد) نگاش میکنم
مهمان
ممنون از لطف بسیارتون
سپاس گذارم
قدردانی میکنم
لطف عالی مستدام
مهمان
همون پروژه که بالا فرستادی رو میگی؟
حالا نمیشه یه نگاهی به پروژه منم بندازی؟خواهش میکنممممم
نویسنده این مطلب
بله….
نوچ…
نویسنده این مطلب
یه پروژه سالم برات فرستادم که…اونو نگاه کن و مشکلت رو حل کن….
اون پروژه هه مشکلی نداره…تستش کردم
مهمان
اینا رو بلدم داداش منظورم اینا چرا هی چشمک میزنه منم اون مدار ماشین حساب مهندسیم تو پروتئوس جواب میداد ولی وقتی رو برد بستمش خودش مقدار دهی میکرد فکرکنم بخاطر همین چشمک زدنای خود به خود درسته؟
نویسنده این مطلب
نه په ربطی داره….مگه خودت برنامه کیپد تا حالا ننوشتی؟؟؟
یا کپی کردی؟؟؟
شاید تو عمل مقاومت پول آپ(دان) نزاشتی….
مهمان
چشم امیدم که همیشه به خدا بوده هست ولی دیگه از خودم نا امید شدم،داداش یه کاریم واسه من بکن که بد جوری گیر افتادم!!! راستی چرا پایه ها چشمک میزنن (ابی و قرمز میشن) علتش چیه؟
نویسنده این مطلب
پایه آبی=۰ولت
پایه قرمز=۵ولت
پایه خاکستری=نامعلوم
===============
توضیح برا شب یا فردا تو مطلب مربوطه اش
مهمان
داداش من هنوزم مشکلم حل نشده

پیغام خطا میده که فایل txt قابل اپلود نیست میشه ادرس میلتونو بدین تا واستون میل کنم؟
فقط قربونت من چشم امیدم به تو به استادم میل دادم که اصلا جوابمو نداد نامرد
نویسنده این مطلب
سلام
یه جای ثایت تو سایت نظرت رو بزار
زیپش میتونستی بکنی—الان دیگه نفرست
این فایل رو ببین
https://dmf313.ir/wp-content/uploads/LCD-KEY-PAD-BUTTONwww.dmf313.ir_.rar
پسوردش هم آدرس سایته…..با حرف کوچیک…www.dmf313.ir
مطلبش رو هم امشب یا فردا یا پسفردا میزارم تو سایت+توضیحات کوچولو موچولو
در ضمن چش امیدت به خدا و تلاش خودت باشه فقط و نه …
مهمان
مشکلشم اینه که تو ساختش خودش خود به خود عدد میزنه
نویسنده این مطلب
سلام
به زودی(تو چند روز آینده) یه مطلب در این باره تو سایت میزارم که دیگه این مشکلات رو نداره (و مقاومت پول دان یا آپ هم لازم نیست برا کیپد بزاریم….کد نویسیش هم فک کنم آسون تر باشه)
(اگه یادم رفت…..خبرم کن…تو همین جا)
مهمان
بچه ها کی میدونه این برنامه مشکلش کجاست؟
#include
#include
#include
#include
#include
#asm
.equ __lcd_port=0x18
#endasm
//#############################################
int key(void);
float _Main(void);
void Mohandes(void);
void Mohasebe(void);
void Alamat(int,int);
float Emoji(int);
//#############################################
float a = 0 , b = 0 , c = 0 , q , t;
int i ;
char y=0 , lcd[25] , z ;
//#############################################
void main(void){
lcd_init(16);
lcd_clear();
lcd_gotoxy(2,0);
lcd_putsf(“JABER NOBAKHT”);
lcd_gotoxy(3,1);
lcd_putsf(“UNI *PAYAM*”);
delay_ms(1000);
lcd_clear();
lcd_gotoxy(1,0);
lcd_putsf(“SH DANESHJUYI”);
lcd_gotoxy(3,1);
lcd_putsf(“9254011017”);
delay_ms(1000);
lcd_clear();
lcd_gotoxy(1,0);
lcd_putsf(“OSTADE RAHNAMA”);
lcd_gotoxy(1,1);
lcd_putsf(“OSTAD HASHEMI”);
delay_ms(1000);
lcd_clear();
DDRB=0x0F;
DDRA=0x07;
DDRD=0x0F;
lcd_init(16);
while (1){
_Main();
}
}
//#############################################################
float _Main(void){
int Loop = 1 ;
y = key();
if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
if( y 9 && y < 16 ){
if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
z = y ;
Alamat(y,1);
while(Loop){
y = key();
if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
if( y 15 ){
lcd_clear();
a= 0 ; b = 0 ; c = 0;
Alamat(y , 2);
z = y ;
Loop = 1 ;
while(Loop){
y = key();
if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
if(y < 10){
a = (a*10) + y ;
itoa(y , lcd);
lcd_puts(lcd);
delay_ms(50);
}else if ( y == 14){
lcd_putchar('=');
Mohandes();
}
Loop = 1 ;
}
}
return 0;
}
//##########################################################
void Mohasebe(void){
if(z == 10)c = a / b ;
if(z == 11)c = a * b ;
if(z == 12)c = a – b ;
if(z == 13)c = a + b ;
ftoa(c , 3 , lcd);
lcd_puts(lcd);
delay_ms(100);
}
//#########################################################
float Emoji(int rr){
q=1;
for(i=0;i<rr;i++)q = q * 2.71728 ;
return q;
}
//#########################################################
void Mohandes(void){
t = (3.1415926535897932384626433832795/180)*a ;
if(z == 16)c = sin(t) ;
if(z == 17)c = cos(t) ;
if(z == 18)c = tan(t) ;
if(z == 19)c = 1/tan(t) ;
if(z == 20)c = sinh(t) ;
if(z == 21)c = cosh(t) ;
if(z == 22)c = log(a) ;
if(z == 23)c = sqrt(a) ;
if(z == 24)c = Emoji(a) ;
ftoa(c , 3 , lcd);
lcd_puts(lcd);
delay_ms(100);
}
//#########################################################
void Alamat(int Moji,int Halat){
if(Halat == 1){
if(Moji == 10)lcd_putchar('/') ;
if(Moji == 11)lcd_putchar('*') ;
if(Moji == 12)lcd_putchar('-') ;
if(Moji == 13)lcd_putchar('+') ;
delay_ms(100);
}
if(Halat == 2){
if(Moji == 16)lcd_putsf("Sin ") ;
if(Moji == 17)lcd_putsf("Cos ") ;
if(Moji == 18)lcd_putsf("Tan ") ;
if(Moji == 19)lcd_putsf("Cot ") ;
if(Moji == 20)lcd_putsf("sinh") ;
if(Moji == 21)lcd_putsf("cosh") ;
if(Moji == 22)lcd_putsf("log ") ;
if(Moji == 23)lcd_putsf("Sqrt ") ;
if(Moji == 24)lcd_putsf("exp ") ;
delay_ms(100);
}
}
//#########################################################
int key(void){
char KEY = 1 ;
while(KEY){
PORTD.0 = 1 ;
PORTD.1 = 0 ;
PORTD.2 = 0 ;
PORTD.3 = 0 ;
if(PIND.4 == 1){return 7 ; KEY = 0;delay_ms(50);}
if(PIND.5 == 1){return 8 ; KEY = 0;delay_ms(50);}
if(PIND.6 == 1){return 9 ; KEY = 0;delay_ms(50);}
if(PIND.7 == 1){return 10; KEY = 0;delay_ms(50);}
//==========================================
PORTD.0 = 0 ;
PORTD.1 = 1 ;
PORTD.2 = 0 ;
PORTD.3 = 0 ;
if(PIND.4 == 1){return 4 ; KEY = 0;}
if(PIND.5 == 1){return 5 ; KEY = 0;}
if(PIND.6 == 1){return 6 ; KEY = 0;}
if(PIND.7 == 1){return 11; KEY = 0;}
//==========================================
PORTD.0 = 0 ;
PORTD.1 = 0 ;
PORTD.2 = 1 ;
PORTD.3 = 0 ;
if(PIND.4 == 1){return 1 ; KEY = 0;}
if(PIND.5 == 1){return 2 ; KEY = 0;}
if(PIND.6 == 1){return 3 ; KEY = 0;}
if(PIND.7 == 1){return 12; KEY = 0;}
//==========================================
PORTD.0 = 0 ;
PORTD.1 = 0 ;
PORTD.2 = 0 ;
PORTD.3 = 1 ;
if(PIND.4 == 1){return 15; KEY = 0;}
if(PIND.5 == 1){return 0 ; KEY = 0;}
if(PIND.6 == 1){return 14; KEY = 0;}
if(PIND.7 == 1){return 13; KEY = 0;}
//=============================================================================
PORTC.0 = 1 ;
PORTC.1 = 0 ;
PORTC.2 = 0 ;
if(PINC.5 == 1){return 16 ; KEY=0;}
if(PINC.6 == 1){return 17; KEY=0;}
if(PINC.7 == 1){return 18 ; KEY=0;}
//=====================================================
PORTC.0 = 0 ;
PORTC.1 = 1 ;
PORTC.2 = 0 ;
if(PINC.5 == 1){return 19 ; KEY=0;}
if(PINC.6 == 1){return 20 ; KEY=0;}
if(PINC.7 == 1){return 21 ; KEY=0;}
//=====================================================
PORTC.0 = 0 ;
PORTC.1 = 0 ;
PORTC.2 = 1 ;
if(PINC.5 == 1){return 22 ; KEY=0;}
if(PINC.6 == 1){return 23 ; KEY=0;}
if(PINC.7 == 1){return 24 ; KEY=0;}
KEY = 1 ;
}
}
//############################################################
نویسنده این مطلب
سلام
اگه مشکلتون تا الان حل نشده لطفا کد رو به صورت txt بزارید تو سایت تا ببینم….
نویسنده سایت
سلام به همه دوستان.
یه نکته توی این برنامه رعایت نشده ،واسه همینه که خیلیا جواب نمیگیرند.
و اون نکته اینه که بعد از تابع return هر چی بنویسی اجرا نمیشه. بیاید سناریوی زیر رو دنبال کنیم:
کاربر کلید 8 رو فشار میده، تابع key اجرا میشه و توی خط 58 ، مقدار 8 رو return میکنه. بقیه کد (تایع تاخیر 50 میلی ثانیه)اجرا نمیشه!
همچنین توی خطهای بعدی خبری از تابع تاخیر نیست.
اگر میکرو توی فرکانس های بالا کار کنه ،بدون اینکه کاربر کلیدی فشار بده چون مقدار ورودی یک هست! دوباره به این تابع میرسیم و باز عدد 7,8,9 رو return میکنه…
راه حل:
1- تابع تاخیر قبل از return قرار گیرد
2- پورت متناظر با یک نیز برابر صفر شود.
به عنوان نمونه در خطهای 65 تا 67 باید با کد زیر جایگزین شود.
if(PIND.4 == 1){PORTD.1 = 0;delay_ms(50); return 4;)
if(PIND.5 == 1){PORTD.1 = 0;delay_ms(50); return 5;)
if(PIND.6 == 1){PORTD.1 = 0;delay_ms(50); return 6;)
مهمان
عجییییییبه
این کدو تست کردم
در حال حاضر هر دو کد کپی همن اما این کد که واسه پسوورده عدد 6 رو هم نشوون میده ولی اون نشوون نمیده !!!
کدااا دقیقا عین همن هیچ فرقی ندارن
داخل کدویژن تنظیمات خاصی انجام ندادید که باعث تفاوت این دو کد شه ؟؟؟
نویسنده این مطلب
یعنی ۲-۳-۵-۶ رو نشون میده؟
رو بقیه کلیک میکنی اصلا نشون نمیده؟؟؟
یه کاری کن ….فرکانس میکرو رو موقع پروگرام کردن بزار رو ۸ میگ(از طریق فیوز بیت ها و نه کدویزارد)
نویسنده این مطلب
اینم یه تست کن….
https://dmf313.ir/%D9%82%D9%81%D9%84-%D8%B1%D9%85%D8%B2-%DB%B4-%D8%B1%D9%82%D9%85%DB%8C-%D8%A8%D8%A7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1-avr/
ببین جواب میده یا نه….
مهمان
راستی کیپد من مقاومت پول دانش بر روی ستون هستش و من طبق کد شما ستون 1 ، 2 و 3 رو به PC6 , PC.5 و PC.7 وصل کردم درسته؟؟ نیاز نیست به PC.1 , PC.0 و PC.3 وصل کنم؟
منظورم اینه مشکل بخاطر این نیست که شاید جای سطر و ستون اشتباهه ؟؟؟؟
نویسنده این مطلب
والا چی بگم…..
مدارش اگه پیشم بود بهتر میتونستم کمکت کنم….
مهمان
بله
قرار دادم
خیلی عجیبه رو همه پورتای میکرو تست کردم فقط اعداد 2 ،3 و 5 رو نمایش میده از بقیه اعداد خبری نیست
مهمان
سلام دوست عزیز
بنده همین پروژه رو به صورت عملی بستم البته روی پورت C یه اتفاق عجیب میوفته !!!
فقط عدد 2 ،3 و 5 نمایش داده میشه . هرچیم چک میکنم تمام قسمت سخت افزاری و تمام برنامه بی مشکله میتونی راهنماییم کنی
در ضمن کیپدم 3*4 هستش به همین منظور PINC.4رو در برنامه غیر فعال کردم
ممنون
نویسنده این مطلب
سلام
مقاومت پول دان(آپ) رو قرار دادی؟؟؟
مهمان
سلام
دوستان من تا به حال مدار نبستم و تازه کارم میخوام واسه پروژه همین مدارو درست کنم ولی نمیدونم از کجا باید شروع کنم میشه راهنماییم کنید
ممنون
نویسنده این مطلب
سلام
کتاب آموزش avr نویسنده = جابر الوندی رو بخر و بخون
مهمان
برنامه عملی کار نمیکنه
نویسنده این مطلب
متوجه منظورت نشدم
….لینک دانلود پروژه که سالمه-فیلم پروژه هم که پخش میشه…….
مهمان
نظر ندی یه وقت…گناه میشه
ممنون داد
نویسنده این مطلب
سالمه که….
مهمان
سلام
ف کنم بازم برنامت مورد داره عزیزم
مهمان
سلام
خسته نباشی
PINC ک ب جایی وصل نیس
کاربردش چیه؟
نویسنده این مطلب
سلام
مثل این که کد ها رو اشتاهی قرار دادم…
پروژه تصحیح شد….
مهمان
سلام ببخشید میخواستم بپرسم که چطور میشه با برنامه پروتیوس کار کرد
نویسنده این مطلب
سلام
آموزشش تو اینترنت هستش
اگه نبود بگو تا بزارم