امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 2
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با keypad
نویسنده پیام
cortex-m3 آفلاین
كاربر دو ستاره
**

ارسال‌ها: 93
موضوع‌ها: 40
تاریخ عضویت: اسفند ۱۳۹۱

تشکرها : 11
( 24 تشکر در 13 ارسال )
ارسال: #1
مشکل با keypad
با سلام
چندتا سوال دارم:

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

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

با تشکر
۱۲-بهمن-۱۳۹۲, ۱۴:۱۰:۰۲
ارسال‌ها
پاسخ
cortex-m3 آفلاین
كاربر دو ستاره
**

ارسال‌ها: 93
موضوع‌ها: 40
تاریخ عضویت: اسفند ۱۳۹۱

تشکرها : 11
( 24 تشکر در 13 ارسال )
ارسال: #2
RE: مشکل با keypad
با سلام
برای نمایش یک عدد دو رقمی روی 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 همون فایل قبلی هست که لینکشو توی پست قبلی گذاشتم)

با تشکر
۱۵-بهمن-۱۳۹۲, ۱۷:۰۶:۰۶
ارسال‌ها
پاسخ
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #3
RE: مشکل با keypad
مشکل توی نحوه خوندن هست
شما اون پینی که صفر می کنید رو به عنوان خروجی تعیین نمی کنید
کد:
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.)
۱۶-بهمن-۱۳۹۲, ۰۱:۱۲:۳۶
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy
cortex-m3 آفلاین
كاربر دو ستاره
**

ارسال‌ها: 93
موضوع‌ها: 40
تاریخ عضویت: اسفند ۱۳۹۱

تشکرها : 11
( 24 تشکر در 13 ارسال )
ارسال: #4
RE: مشکل با keypad
با سلام

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

با تشکر
۱۶-بهمن-۱۳۹۲, ۱۶:۰۹:۰۷
ارسال‌ها
پاسخ
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #5
RE: مشکل با keypad
اینا تابع هستن درمورد توابع اطلاعی ندارید؟
---
اون DDRC رو اضافه کردید مشکل حل نشد؟

به همه عشق بورز، به معدودی اعتماد کن و در حق کسی بدی نکن.
ویلیام شکسپیر

نباید ایمان به انسانیت را از دست دهید. انسانیت یک اقیانوس است؛ اگر قطرات اندکی از اقیانوس کثیف است، اقیانوس کثیف نمی‌شود.
مهاتما گاندی

يَا أَيُّهَا الَّذِينَ آمَنُواْ اسْتَعِينُواْ بِالصَّبْرِ وَالصَّلاَةِ إِنَّ اللّهَ مَعَ الصَّابِرِينَ
۱۶-بهمن-۱۳۹۲, ۱۸:۲۹:۲۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy
cortex-m3 آفلاین
كاربر دو ستاره
**

ارسال‌ها: 93
موضوع‌ها: 40
تاریخ عضویت: اسفند ۱۳۹۱

تشکرها : 11
( 24 تشکر در 13 ارسال )
ارسال: #6
RE: مشکل با keypad
(۱۶-بهمن-۱۳۹۲, ۱۸:۲۹:۲۴)behzady نوشته است: اینا تابع هستن درمورد توابع اطلاعی ندارید؟
---
اون DDRC رو اضافه کردید مشکل حل نشد؟

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

با تشکر
۱۶-بهمن-۱۳۹۲, ۱۹:۰۸:۳۳
ارسال‌ها
پاسخ
cortex-m3 آفلاین
كاربر دو ستاره
**

ارسال‌ها: 93
موضوع‌ها: 40
تاریخ عضویت: اسفند ۱۳۹۱

تشکرها : 11
( 24 تشکر در 13 ارسال )
ارسال: #7
RE: مشکل با keypad
مشکل حل شد!
کد برنامه بهصورت زیر هست:
کد:
/*****************************************************
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 انتخاب کردم.چه تابعی میشه بجاش گذاشت؟(لطفا بعد از شبیه سازی نتیجه رو اعلام کنید)
در ضمن حالا که برنامه جواب میده آیا میشه همینو به صورت یک فایل کتابخونه ای ذخیره کرد ؟ و هر وقت خواستیم فقط اسم اونو بنویسیم؟لطفا روش کار رو کامل بگید
با تشکر
۲۲-بهمن-۱۳۹۲, ۰۱:۲۶:۳۷
ارسال‌ها
پاسخ
تشکر شده توسط : babyy, Ambassador


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 4 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS