ايران ويج

نسخه‌ی کامل: مشکل با keypad
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با سلام
چندتا سوال دارم:

1.چجوری میشه از طریق keypad،علامتها(مثل/*-+)رو روی lcd نشون داد؟
2.چجوری میشه یک عدد چند رقمی رو از طریق keypad روی lcd نشون داد؟

در ضمن خودم یه شبیه سازی توی proteus کردم(با keypad و lcd) که فقط یک عدد رو نشون میده،اگه میشه از روی همین فایل بگید که چجوری اصلاحش کنم تا بتونم کارایی که گفتم رو انجا بده.
لینک دانلود شبیه سازی keypad و lcd

با تشکر
با سلام
برای نمایش یک عدد دو رقمی روی lcdتوسطkeypad از برنامه زیر استفاده کردم ولی جواب نمیده.چرا؟
کد:
[align=left][align=left]
#include <mega32.h>
#include <delay.h>
#include <stdlib.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>

// Declare your global variables here

void main(void)
{
unsigned char key=0,n=0,key1=0;
char str_key[9];
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

while (1)
      {
       DDRC=0x0f;
       PORTC=0xff;
       while(PORTC==0xff){
       PORTC=0xff;
       PORTC.0=0;
       if(PINC.4==0)key=7;
       if(PINC.5==0)key=8;
       if(PINC.6==0)key=9;
       if(PINC.7==0)key=10;
       delay_ms(5);
      
       PORTC=0xff;
       PORTC.1=0;
       if(PINC.4==0)key=4;
       if(PINC.5==0)key=5;
       if(PINC.6==0)key=6;
       if(PINC.7==0)key=11;
       delay_ms(5);
      
       PORTC=0xff;
       PORTC.2=0;
       if(PINC.4==0)key=1;
       if(PINC.5==0)key=2;
       if(PINC.6==0)key=3;
       if(PINC.7==0)key=12;
       delay_ms(5);
      
       PORTC=0xff;
       PORTC.3=0;
       if(PINC.4==0)key=13;
       if(PINC.5==0)key=0;
       if(PINC.6==0)key=14;
       if(PINC.7==0)key=15;
       delay_ms(5);
       }
       n++;
      
       if(n==1){
       key1=key;
       }
       if(n==2){
       key=(key1*10)+key;
       }
       if(n>2){n=0; }
       itoa(key,str_key);
      
       lcd_gotoxy(0,0);
       lcd_puts(str_key);
       delay_ms(5);
  
      

      [/align][/align]};
}
روش کار هم اینجوریه که اگه بار اول کلید زده شد،علاوه بر ذخیره ی آن،آن عدد رو روی lcd نشون بده و برای با دوم کلید زده شد،عدد اولی رو قبلش ذخیره کرده بودم رو در 10 ضرب کنه و با عدد دومی جمع کنه(که به ما همون عدد 2 رقمی رو بده) واگه کلید برای با سوم زده شد،n(شمارنده ای که تعداد زدن کلید رو بر عهده داره)رو صفر کنه.
به نظرتون مشکل کجاست؟
(در ضمن فایل proteus همون فایل قبلی هست که لینکشو توی پست قبلی گذاشتم)

با تشکر
مشکل توی نحوه خوندن هست
شما اون پینی که صفر می کنید رو به عنوان خروجی تعیین نمی کنید
کد:
DDRC=0x0F;
دیگه مشکل خاصی نداره
این یه تابع که اینکار رو انجام میده
مثل شما هست فقط روی A این کارو می کنه
شما همون حط بالا رو بزاری کار حله
کد:
extern int get_key(void)
{                
int a;
    PORTA=0xFF;
    DDRA=0xF0;
    PORTA.7=0;
    if(PINA.0==0)
    {
        key=1;
    }
    if(PINA.1==0)
    {
        key=2;
    }      
    if(PINA.2==0)
    {
        key=3;      
    }
    if(PINA.3==0)
    {
        key=4;  
    }        
    PORTA=0xFF;
    PORTA.6=0;
    if(PINA.0==0)
    {
        key=5;
    }
    if(PINA.1==0)
    {
        key=6;
    }      
    if(PINA.2==0)
    {
        key=7;
    }        
    if(PINA.3==0)
    {
        key=8;  
    }
    PORTA=0xFF;
    PORTA.5=0;
    if(PINA.0==0)
    {
        key=9;
    }
    if(PINA.1==0)
    {
        key=10;
    }      
    if(PINA.2==0)
    {
        key=11;
    }        
    if(PINA.3==0)
    {
        key=12;  
    }    
    PORTA=0xFF;
    PORTA.4=0;
    if(PINA.0==0)
    {
        key=13;
    }
    if(PINA.1==0)
    {
        key=14;
    }      
    if(PINA.2==0)
    {
        key=15;
    }        
    if(PINA.3==0)
    {
        key=16;
    }
    PORTA=0xFF;  
    return key;    
}
با سلام

(۱۶-بهمن-۱۳۹۲, ۰۱:۱۲:۳۶)behzady نوشته است: [ -> ]مشکل توی نحوه خوندن هست
شما اون پینی که صفر می کنید رو به عنوان خروجی تعیین نمی کنید
اگه به کدهای پست قبلیم نگاه کنید میبینید که اینکار رو توی اولین خط حلقه ی while کردم.
در ضمن توی کد شما،منظورتون از
کد:
extern int get_key(void)
چیه؟(واژه ی extern)
یکم در موردreturn key و extern int get_key(void) توضیح بدید.
(برنامه ی من همچنان مشکل داره)

با تشکر
اینا تابع هستن درمورد توابع اطلاعی ندارید؟
---
اون DDRC رو اضافه کردید مشکل حل نشد؟
(۱۶-بهمن-۱۳۹۲, ۱۸:۲۹:۲۴)behzady نوشته است: [ -> ]اینا تابع هستن درمورد توابع اطلاعی ندارید؟
---
اون DDRC رو اضافه کردید مشکل حل نشد؟

میدونم تابع چیه ولی تا حالا برنامه ای ننوشتم که بخوام توش از تابع استفاده کنم.
این تابع رو توی همین برنامه یه بار مینویسن و براش اسم میزارن و هر وقت بخوان فقط اسمشو مینویسن؟یا اینکه جدا از برنامه نوشته میشه وsave میکنیم و اون فایلو صدا میزنیم؟
---
در مورد DDRCهم که گفتم.اونو از همون اول نوشته بودم ولی شما اونو ندید.(من توی پست اول توی کد توی اولین خط در حلقه while نوشتم.
و مشکل حل نشد.

با تشکر
مشکل حل شد!
کد برنامه بهصورت زیر هست:
کد:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 02/04/2014
Author  : F4CG                            
Company : F4CG                            
Comments:


Chip type           : ATmega32
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
#include <stdlib.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>

// Declare your global variables here

void main(void)
{
unsigned char key=0,n=0,key1=0;
char str_key[9];
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

while (1)
      {
       DDRC=0x0f;
       PORTC=0xff;
       while(PORTC==0xff){
       PORTC=0xff;
       PORTC.0=0;
       if(PINC.4==0){
       key=7;
       goto l1;}
       if(PINC.5==0){
       key=8;
       goto l1;}
       if(PINC.6==0){
       key=9;
       goto l1;}
       if(PINC.7==0){
       key=10;  
       goto l1;}
       delay_ms(5);
      
       PORTC=0xff;
       PORTC.1=0;
       if(PINC.4==0){
       key=4;
       goto l1;}
       if(PINC.5==0){
       key=5;
       goto l1;}
       if(PINC.6==0){
       key=6;  
       goto l1;}
       if(PINC.7==0){
       key=11;
       goto l1;}
       delay_ms(5);
      
       PORTC=0xff;
       PORTC.2=0;
       if(PINC.4==0){
       key=1;
       goto l1;}
       if(PINC.5==0){
       key=2;
       goto l1;}
       if(PINC.6==0){
       key=3;  
       goto l1;}
       if(PINC.7==0){
       key=12;  
       goto l1;}
       delay_ms(5);
      
       PORTC=0xff;
       PORTC.3=0;
       if(PINC.4==0){
       key=13;
       goto l1;}
       if(PINC.5==0){
       key=0;
       goto l1;}
       if(PINC.6==0){
       key=14;
       goto l1;}
       if(PINC.7==0){
       key=15;
       goto l1;}
       delay_ms(5);
       PORTC=0xff;
       }
     l1:  n++;
      
       if(n==1){
       key1=key;
       }
       if(n==2){
       key=(key1*10)+key;
       }
       if(n>2){
       lcd_clear();
       key1=key;
       n=1; }
       itoa(key,str_key);
      
       lcd_gotoxy(0,0);
       lcd_puts(str_key);
       while((PORTC&240)!=0xf0);
       delay_ms(500);
      
  
      

      };
}
لینک فایل پروتئوسش هم توی اولین پستم هست.
فقط یه چیزی که هست من خط آخر برنامه رو که همون delay هست رو همینجوری 500 انتخاب کردم.چه تابعی میشه بجاش گذاشت؟(لطفا بعد از شبیه سازی نتیجه رو اعلام کنید)
در ضمن حالا که برنامه جواب میده آیا میشه همینو به صورت یک فایل کتابخونه ای ذخیره کرد ؟ و هر وقت خواستیم فقط اسم اونو بنویسیم؟لطفا روش کار رو کامل بگید
با تشکر