اطلاعیه

Collapse
No announcement yet.

مشکل در خواندن کیبورد کامپیوتر با avr

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در خواندن کیبورد کامپیوتر با avr

    سلام دوستان

    کسی تابحال کیبورد کامپیوترو با بسکام خونده ؟ یا با کدویژن ترجیحا ولی بسکام
    که کلید های ماشین حسابی کیبورد هم کار کنن ؟

    متاسفانه بنده هرکاری میکنم numlock خاموشه و کد کلیدهای ماشین حسابی کد اعدادشون برنمیگرده مثلا عدد 4 رو بخش ماشین حسابی کیبورد کد جهت نمای سمت چپ رو برمیگردونه

    لطفا کمک کنید
    تشکر
    اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

    #2
    پاسخ : مشکل در خواندن کیبورد کامپیوتر با avr

    دوستان بعد از پست کردن مطلب قبلی
    تا الان روش کار کردم و درست شد

    نتیجه رو مینویسم چون هرکسی با بسکام و کتابخونه آمادش کار کنه مشکل بالا رو حتما داره

    ی بار دیگه دقیق تر مشکل رو مطرح میکنم :

    بعضی از کلیدهای کیبورد با جدول keydata ای که خود بسکام سورسش رو منتشر کرده و در کتابخونه آمادش مورد استفاده قرار میگیره کد اسکیشون شناسایی نمیشه مثل کلید capslock کلید های ماشین حسابی و کلید های غیراستانداردم ک به کلی شناسایی نمیشن

    keydata آماده بسکام
    کد:
    Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
    
    Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
    
    Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
    
    Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
    
    Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
    
    Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
    
    Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
    
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    
    
    
    'shifted keys UPPER case
    
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
    
    Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
    
    Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
    
    Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
    
    Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
    
    Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
    
    Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
    
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    و اما رفع مشکل :

    میدونیم که صفحه کلید دونوع اطلاعات در خروجیش ارسال میکنه ، این اطلاعات یا حاوی داده هستن یا دستور خاص
    وقتی کلید فشرده میشه داده ارسال میشه و وقتی رها میشه break code ارسال میشه طبق جدول زیر اکثرا دو بایتی هست


    بیت های ارسالی روی خط دیتا هم 11 بیت هست اولیش استارتش هست هشت بیت داده که معادل یک بایت کاراکتر ارسالی هست بیت توازن و توقف

    و اما نکته اصلی اینجاست که کلید هایی مثل اینتر بخش ماشین حسابی کیبورد نام لاک تقسیم page down delete insert و ... برخلاف بقیه کد action دو بایتی دارن ،
    وقتی از کتابخونه آماده استفاده میشه به طور مثال کلید 4 بخش ماشین حسابی کیبورد کدش با کلید جهت نمای سمت چپ یکی میشه

    اکشن کد کلید 4 بخش ماشین حسابی طبق جدول :6B
    ولی اکشن کد کلید جهت نمای سمت چپ 2 بایتی هست و E06B هست


    برای برطرف کردن مشکل من بدون استفاده از کتابخانه آماده ps2 رو به شکل زیر خوندم :
    قطعه کد زیر از ی پیج چینی کپی شد که راه اندازی کیبورد ps2 کامپیوتر نبود .... ی نوع صفحه لمسی ps2 بود یا ی چیزی مشابه این!!
    کدو متناسب با نیاز اصلاح کردم و ی سابروتین که مورد نیاز بود رو فقط آوردم
    کد:
    Ddrd = &B11111111                      ' Set PortC DDR (PS2 lines toggle direction in code)
    
    
    
    Clockin Alias Pind.2                    ' Touchpad clock (PS2) PINS 1-2
    Clockout Alias Portd.2
    Clockdir Alias Ddrd.2
    Datain Alias Pind.3                     ' Touchpad serial data in/out (PS2) PINS 3-4
    Dataout Alias Portd.3
    Datadir Alias Ddrd.3
    
    Declare Sub Padcfg                     ' Configure touchpad
    Declare Sub Readpad                     ' Read pad data
    Declare Function Readps2() As Byte             ' Recieve PS2 data
    Declare Function Writeps2(byval D As Byte) As Byte     ' Send PS2 data
    
    Dim Text As String * 16                   ' VFD text
    
    Dim T As String * 1                     ' Single character storage
    Dim Tx As String * 5                    ' Text formatting
    Dim Ty As String * 5                    ' Text formatting
    Dim X As Byte                        ' General purpose byte
    Dim I As Byte                        ' For/Next indexing
    Dim P As Byte                        ' Wasted space for hacked code
    Dim Length As Byte                     ' Text length
    
    Dim Ps2 As Byte                       ' PS2 data
    Dim P1 As Byte                       ' PS2 packet byte 1
    Dim P2 As Byte                       ' PS2 packet byte 2
    Dim P3 As Byte                       ' PS2 packet byte 3
    Dim P4 As Byte                       ' PS2 packet byte 4
    Dim P5 As Byte                       ' PS2 packet byte 5
    Dim P6 As Byte                       ' PS2 packet byte 6
    Dim Z As Byte                        ' Pad pressure
    Dim Bleft As Bit                      ' Pad button left
    Dim Bright As Bit                      ' Pad button right
    Dim Xp As Integer                      ' Calculated pad X
    Dim Yp As Integer                      ' Calculated pad Y
    Dim Xs As Single                      ' Float X
    Dim Ys As Single                      ' Float Y
    Dim Rad As Single                      ' Pad angle in radians
    Dim Deg As Byte                       ' Pad angle in degrees 0 = East
    Dim Lastdeg As Integer                   ' Last degree value
    Dim Pdata As Byte                      ' Pad command byte
    Dim Finger As Bit                      ' Finger flag 1 = on pad
    
    Dim Displaymode As Byte                   ' What to display on VFD
    
    
    
    ' ========== PROGRAM CODE BEGINS ==============
    
    Clockdir = 0
    Datadir = 0
    Clockout = 1
    Dataout = 1
    
    'codes
    
    
    
    
    end
    Function Readps2() As Byte
    
      Do
      Loop Until Clockin = 0
      While Clockin = 0                    ' Wait for first clock pulse
      Wend
      Readps2 = 0
    
      For I = 1 To 8
       While Clockin = 1
       Wend
       Shift Readps2 , Right , 1
       If Datain = 1 Then Readps2 = Readps2 + 128      ' Shift in data...
       While Clockin = 0                   ' ...and wait for clock rising edge
       Wend
    
      Next I
    
      For I = 1 To 2
       While Clockin = 1
       Wend
       While Clockin = 0                   ' Wait for parity and stop bits
       Wend
      Next I
    End Function
    از فانکشن بالا جهت خوندن اطلاعات خروجی ps2 استفاده میکنیم ...

    و نکته مهم آخر :

    در هنگام دریافت make کد رو چک میکنیم اگه بایت اول ارسالی E0 بود یعنی کلیدهای خاصی میتونن باشن ک مشخص شده پس دوباره فانکشن رو فراخوانی میکنیم چون باید بایت دومی هم ارسال بشه! طبق جدول
    و بایت دوم کد کلیدمون هست در اکثر موارد ... بجز یکی دومورد ک چندین بایت ارسال میشه

    حالا ب طور مثال E06B مشخص میشه که 6B کلید فشرده شده جهت نمای سمت چپ هست و 6B به تنهایی کلید ماشین حسابی عدد 4

    ....


    دوستان اگه راه حل دیگه ای کتابخونه آماده ای .... دارن دریغ نکنن مطرحش کنن


    اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

    دیدگاه

    لطفا صبر کنید...
    X