قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية bound2u
bound2u
:: مهندس ::
تاريخ التسجيل: Nov 2012
المشاركات: 15
نشاط [ bound2u ]
قوة السمعة:0
قديم 08-12-2012, 03:19 PM المشاركة 1   
افتراضي اين الخطاء في مايكروكنترولر 8051 Twitter FaceBook Google+



السلام عليكم

لي فترة طويله وانا احاول ان اربط الكيباد مع شاشه matrix interface لمايكروكنترولر 8051 ولكن من غير فائده .. هل هناك اي شخص يستطيع تصحيح الكود تبعي ؟؟
اعتقد انه ناقصه شي بسيط جداً .. وهذا الشي لم استطع التوصل اليه .. هل يجب علي اضافة او مسح اي ايعاز ؟

الكود هو كالتالي:
كود:
rw0 equ P0.4;
rw1 equ P0.5;
rw2 equ P0.6;
rw3 equ P0.7;
cl0 equ P0.0;
cl1 equ P0.1;
cl2 equ P0.2;
cl3 equ P0.3;
;*************************************************
;Main program

org 00h
ljmp main

org 30h
main: mov P0,#0ffh       ;Configure input
acall scan_key     ;Scan for keypress
acall display      ;display the key pressed
sjmp main          ;Loop
;*************************************************
;Subroutine to scan keys
scan_key:mov P0,#0ffh
clr cl0
mov a, P0
anl a,#00001111b ;(logical AND)clear the upper nibble and keep the lower
cjne a,#00001111b,Row0 ; compare till all keys released
setb cl0 ; set carry falge 
clr cl1
mov a, P0
anl a,#00001111b
cjne a,#00001111b,Row1
setb cl1
clr cl2
mov a, P0
anl a,#00001111b
cjne a,#00001111b,Row2
setb cl2
clr cl3
mov a, P0
anl a,#00001111b
cjne a,#00001111b,Row3
setb cl3
ret

row0: mov dptr,#led_data ; Fetch the first address of table
mov r6,#04h
clr c	; falge=0 no type has been pressed
rww0: rrc a		 ; shift the port pin into Acc.
jc next0	;jmp if carry flage is set
sjmp over  ;short jump to over
next0:inc dptr
djnz r6,rww0
sjmp scan_key

row1: mov dptr,#led_data+4h
mov r6,#04h
clr c
rww1: rrc a
jc next1
sjmp over
next1:inc dptr
djnz r6,rww1
sjmp scan_key

row2: mov dptr,#led_data+8h
mov r6,#04h
clr c
rww2: rrc a
jc next2
sjmp over
next2:inc dptr
djnz r6,rww2
sjmp scan_key

row3: mov dptr,#led_data+0ch
mov r6,#04h
clr c
rww3: rrc a
jc next3
sjmp over
next3:inc dptr
djnz r6,rww3
sjmp scan_key

over: ret
;*************************************************
;Display subroutine
display:clr a
movc a,*a+dptr
mov P0,a
ret

;*************************************************
;lookup table
led_data:db 0fch,066h,0feh,09dh; For row1:0 1 2 3
db 060h,0b6h,0f6h,0fdh; For row2:4 5 6 7
db 0dah,0beh,0efh,09fh; For row3:8 9 A B
db 0f2h,0e0h,0ffh,08fh; For row4:C D E F

;*************************************************
$include(t89c51cc01.inc)
end

اعلانات

الصورة الرمزية iiirrr
iiirrr
:: عضو فضي ::
تاريخ التسجيل: Jul 2010
الدولة: العراق
المشاركات: 611
نشاط [ iiirrr ]
قوة السمعة:83
قديم 08-12-2012, 05:58 PM المشاركة 2   
افتراضي


السلام عليكم

لي فترة طويله وانا احاول ان اربط الكيباد مع شاشه matrix interface لمايكروكنترولر 8051 ولكن من غير فائده .. هل هناك اي شخص يستطيع تصحيح الكود تبعي ؟؟
اعتقد انه ناقصه شي بسيط جداً .. وهذا الشي لم استطع التوصل اليه .. هل يجب علي اضافة او مسح اي ايعاز ؟

الكود هو كالتالي:
كود:
rw0 equ P0.4;
rw1 equ P0.5;
rw2 equ P0.6;
rw3 equ P0.7;
cl0 equ P0.0;
cl1 equ P0.1;
cl2 equ P0.2;
cl3 equ P0.3;
;*************************************************
;Main program

org 00h
ljmp main

org 30h
main: mov P0,#0ffh       ;Configure input
acall scan_key     ;Scan for keypress
acall display      ;display the key pressed
sjmp main          ;Loop
;*************************************************
;Subroutine to scan keys
scan_key:mov P0,#0ffh
clr cl0
mov a, P0
anl a,#00001111b ;(logical AND)clear the upper nibble and keep the lower
cjne a,#00001111b,Row0 ; compare till all keys released
setb cl0 ; set carry falge 
clr cl1
mov a, P0
anl a,#00001111b
cjne a,#00001111b,Row1
setb cl1
clr cl2
mov a, P0
anl a,#00001111b
cjne a,#00001111b,Row2
setb cl2
clr cl3
mov a, P0
anl a,#00001111b
cjne a,#00001111b,Row3
setb cl3
ret

row0: mov dptr,#led_data ; Fetch the first address of table
mov r6,#04h
clr c	; falge=0 no type has been pressed
rww0: rrc a		 ; shift the port pin into Acc.
jc next0	;jmp if carry flage is set
sjmp over  ;short jump to over
next0:inc dptr
djnz r6,rww0
sjmp scan_key

row1: mov dptr,#led_data+4h
mov r6,#04h
clr c
rww1: rrc a
jc next1
sjmp over
next1:inc dptr
djnz r6,rww1
sjmp scan_key

row2: mov dptr,#led_data+8h
mov r6,#04h
clr c
rww2: rrc a
jc next2
sjmp over
next2:inc dptr
djnz r6,rww2
sjmp scan_key

row3: mov dptr,#led_data+0ch
mov r6,#04h
clr c
rww3: rrc a
jc next3
sjmp over
next3:inc dptr
djnz r6,rww3
sjmp scan_key

over: ret
;*************************************************
;Display subroutine
display:clr a

[movc a,*a+dptr

mov P0,a
ret

;*************************************************
;lookup table
led_data:db 0fch,066h,0feh,09dh; For row1:0 1 2 3
db 060h,0b6h,0f6h,0fdh; For row2:4 5 6 7
db 0dah,0beh,0efh,09fh; For row3:8 9 A B
db 0f2h,0e0h,0ffh,08fh; For row4:C D E F

;*************************************************
$include(t89c51cc01.inc)
end
لديك 3 اخطاء حول استخدام ال dptr
فلا يجوز استخدام الجمع مع ال dptr, يجب ان تعطيه عنوان مباشرة


التعديل الأخير تم بواسطة : iiirrr بتاريخ 08-12-2012 الساعة 06:31 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية bound2u
bound2u
:: مهندس ::
تاريخ التسجيل: Nov 2012
المشاركات: 15
نشاط [ bound2u ]
قوة السمعة:0
قديم 08-12-2012, 06:57 PM المشاركة 3   
افتراضي


شكرا على ردك اخي iiirrr

لكن المشكلة اني لازم اتنقل من سطر الى اخر في الجدول الاخير , والانديكس عندي شي واحد الي هو led-data

مش عارف كيف اضع العنوان مباشرة بدون ان ازيد المؤشر ؟؟

عندما اعمل compile لا يوجد اخطاء في الكود .. لكن المشكلة ال مايكروكنترولر لا يعمل كما يجب .. !!


الصورة الرمزية iiirrr
iiirrr
:: عضو فضي ::
تاريخ التسجيل: Jul 2010
الدولة: العراق
المشاركات: 611
نشاط [ iiirrr ]
قوة السمعة:83
قديم 08-12-2012, 08:30 PM المشاركة 4   
افتراضي


اعمل اكثر من اندكس
led1 led2 led3 و هكذا


الصورة الرمزية bound2u
bound2u
:: مهندس ::
تاريخ التسجيل: Nov 2012
المشاركات: 15
نشاط [ bound2u ]
قوة السمعة:0
قديم 09-12-2012, 02:59 PM المشاركة 5   
افتراضي


عملت الاندكس ياخي لكنه لا يعمل ..


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:409
قديم 10-12-2012, 06:07 AM المشاركة 6   
افتراضي


أخى
لديك اخطاء كثيرة و إطالة غير مبررة
فأنت أولا تستخدم P0 وهو Open drain مما يجعله يحتاج توصيلات خاصة لكى يتعامل مع الكى باد و الأفضل استخدام أى بورت آخر مع مقاومات
ثانيا تجعل C10 = صفر ثم تقرأ البورت كله و تحذف نصفة الأيسر ثم أخيرا تقارنة ب 0F لتنتقل إلى العنوان وهذا خطأ لأن عندما لا يضغط سيكون الناتج 0F و عندما تضغط سيكون أقل من ذلك أى عكس المطلوب

الأفضل استخدام الأمر JNB وهو يختبر البت المعنية إن كانت صفر ينتقل ولا حاجة لكل هذه الأوامر

كود:
  JNB    C10,ROW0
لتكتب الناتج فى جدول ببساطة استخدم الأمر
ضع بداية الجدول فى أى ريجيتر مثلا R1 أو أى من R0-R7 ثم استخدم الأمر
كود:
MOV αR1,A

لاحظ أن العلامة الصحيحة تحذف بواسطة الموقع وهى علامة At و بعدها
كود:
INC R1

و تختبر R1 لتعلم كم حرف تم ادخاله


التعديل الأخير تم بواسطة : ماجد عباس محمد بتاريخ 10-12-2012 الساعة 06:21 AM
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 03:07 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025