دوستان سلام
من در اين كد كانتر يك رقمي 7سگمنت اين سوالات براي من ايجاد شده لطفا راهنمايي كنيد ممنون.
كد:
#include <mega16.h>
#define xtal 4000000
flash char digits[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char p_state;
unsigned char key;
unsigned char i;
void main(void)
{
DDRD = 0xFF;
PORTD = digits[0];
DDRC = 0x00;
PORTC = 0xFF;
while(1)
{
key = PINC & 0b00000001;
delay_ms(10);
if(key==0)
{
if(key!=p_state)
{
if(i==15)
{
i=0;
PORTD=digits[i];
}
else
i++;
PORTD = digits[i];
p_state=0;
};
}
else
p_state=1;
}
}
-----------------------------------------------------
مشكلات من:
1- خط سبز اولي: 0x3f به باينري 6 تا 1 ميشه پس اگر به يك پورت كه 8 تا پين داره بديم 2 تا پين ديگه چي مي شه؟
2- خط سبز دومي: P_state چيه؟
3- خط سبز سومي: اگر i از نوع كاركتري هست پس چرا با 15 كه عدد صحيح هست مقايسه شده؟
فعلا سوالام همينه اگر كمكي كنيد ممنون مي شم.
با تشكر از كمكتون
(۱۲-دى-۱۳۹۱, ۱۳:۰۳:۲۴)complexcoding نوشته است: [ -> ]مشكلات من:
1- خط سبز اولي: 0x3f به باينري 6 تا 1 ميشه پس اگر به يك پورت كه 8 تا پين داره بديم 2 تا پين ديگه چي مي شه؟
2- خط سبز دومي: P_state چيه؟
3- خط سبز سومي: اگر i از نوع كاركتري هست پس چرا با 15 كه عدد صحيح هست مقايسه شده؟
فعلا سوالام همينه اگر كمكي كنيد ممنون مي شم.
با تشكر از كمكتون
1-دو پین دیگه واسه سگمنت های دیگه استفاده شده؛مثلا برای نمایش عدد صفر از شش سگمنت،عدد 1،دو سگمنت و... استفاده میشه1
2-P_state ذاتا ی متغیر هست ولی حالا چرا با مقدار key مقایسه شده؟!
3-کلا ایراد داره
کل ماجرا از این قراره که میخواسته با ی سوئیچ مقدار 0 تا 15 رو (البته فکر کنم)که احتمالا معادل کد هگز هست رو بریزه رو پورت D؛حالا چرا اینقدر برنامه رو کش داده خدا میدونه!

سلام
فکر کنم سازنده نمی خواسته کسی بفهمه چکار کرده
دوست گرامی من برنامشه ساده و قابل فهم دارم اگر می خواهی بگو تا برات بذارم

اگه بذاريد ممنون مي شم خيلي احتياج براي يادگيري هست!!
با تشكر
و ديگه اينكه Xtal = 4000000 فركانس نوسان سازي كريستال هست؟ كه ميشه 4 گيگاهرتز
و در اين قسمتkey = PINC & 0b00000001;
در واقع همان آگاهي ما از فشرده شدن كليد هست؟ چون كاملا پورت سي به صورت ورودي مقدار دهي شده؟
من يك پروژه دارم كه كنترل دور موتور DC با PWM هست كه دور موتورش رو بايد با ولوم تغيير بدم و سرعتش رو از 0 تا 9 روي يك سون سگمنت نمايش بده ...
تازه 2 يا 3 روزه نشستم سر ميكرو؟ كلي سردرد گرفتم همش وسطاش سرم گيج مي ره؟ مثلا نمي دونم چرا پايه هاي سون سگمنت كاملا به پايه هاي پورت D وصل نشده؟ و يك پايه آزاده و در كدها در مرحله اول 0x3F, مقداردهي شده كه فقط 6 پايه مقدار مي گيره؟ يكي از دوستان گفت دو پايه اي كه مقداردهي نشده صفر هست؟ آيا درست گفت؟ اينم عكسه پايه هاي سون سگمنت وصل شده به ميكرو:
http://www.niloblog.com/files/images/ddb...t3wubh.png
(۱۳-دى-۱۳۹۱, ۰۳:۰۱:۲۹)complexcoding نوشته است: [ -> ]با تشكر
و ديگه اينكه Xtal = 4000000 فركانس نوسان سازي كريستال هست؟ كه ميشه 4 گيگاهرتز
و در اين قسمتkey = PINC & 0b00000001;
در واقع همان آگاهي ما از فشرده شدن كليد هست؟ چون كاملا پورت سي به صورت ورودي مقدار دهي شده؟
من يك پروژه دارم كه كنترل دور موتور DC با PWM هست كه دور موتورش رو بايد با ولوم تغيير بدم و سرعتش رو از 0 تا 9 روي يك سون سگمنت نمايش بده ...
تازه 2 يا 3 روزه نشستم سر ميكرو؟ كلي سردرد گرفتم همش وسطاش سرم گيج مي ره؟ مثلا نمي دونم چرا پايه هاي سون سگمنت كاملا به پايه هاي پورت D وصل نشده؟ و يك پايه آزاده و در كدها در مرحله اول 0x3F, مقداردهي شده كه فقط 6 پايه مقدار مي گيره؟ يكي از دوستان گفت دو پايه اي كه مقداردهي نشده صفر هست؟ آيا درست گفت؟ اينم عكسه پايه هاي سون سگمنت وصل شده به ميكرو:
http://www.niloblog.com/files/images/ddb...t3wubh.png
اینا نشونه ی یادگیریه خیلی خوبه

هر سگمنت 7 تا لامپ داره در سگمنت کاتد مشترک پایه های مثبت تمام لامپ ها رو به هم وصل می کنن و باید مستقیم وصل کنیم به منفی و 7 تا پایه مثبت وصل می کنم به میکرو و با میکرو این پایه ها رو کنترل می کنیم تو عکسی که شما گذاشتین پایه مشترک به منفی وصل کردن و 6 تا پایه رو با میکرو کنترل کردن
با این کد 0x3F 6 تا پایه ای رو که به سگمنت وصل کرده اول بار یک کرده یعنی عدد 8 رو نمایش داده
کد:
#include <mega8.h>
#include <delay.h>
void main(void)
{
char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
int a,f;
PORTB=0x00;
DDRB=0xFF;
while (1)
{
if((PINC.0==1)&& (f==0)){
f=1;
a++;}
if((PINC.0==0)&&(f==1)){
f=0;}
if (a>9){a=0;}
PORTB=seg[a];
};
}
خط اول تعریف میکرو
خط دوم کتابخانه تاخیر فعال کردم
خط 3 و 4 برنامه رو شروع کردم
خط 5 کد های مربوط به سگمنت آند مشترک
خط 6 2 تا متغیر تعریف کردم
خط 7 و 8 پورت b رو خروجی تعریف کردم
خط 9 شروع حلقه ی اصلی
خطوط 11 و 12 و 13 و 14 و 15 شرط مربوط به کلید
توضیحات کلید
در حالت عادی متغیر f=0 است و پایه d.0 هم صفر است پس هیچکدام از شرط ها برقرار نیستند و در لحظه ای که کلید یک شود در یک بار اجرای برنامه متغییر a یک واحد زیاد می شود و f=1 می شود و دوباره هیچکدام از شرط ها برقرار نمی شوند و زمانی که کلید رها شود پایه صفر می شود و شرط دوم برقرار می شود و f=0می شود که در این صورت هیچکدام از شرط ها بر قرار نمی شوند.در صورت استفاده از شرط ساده در هر بار که کلید فشار داده شود تا لحظه ای که پایه یک باشد متغیر زیاد می شود ولی با این روش در هر بار فشار دادن هر قدر هم که کلید را فشار دهیم فقط یک واحد متغیر اضافه می شود
خط 16 اگر a از 9 بیشتر شد صفر میشه
با آرایه ها متغیر a روی سگمنت نمایش می دیم
برنامه ی کامل پیوست کردم
موفق باشید
