Thông báo

Collapse
No announcement yet.

giao tiep voi ban phim may vi tinh

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • giao tiep voi ban phim may vi tinh

    có lẽ chủ đề này ko mới nhưng vẫn rất mong sự giúp đỡ của các cao thủ.hy vọng các cao thủ đừng bỏ qua nhé. em đang gặp khó khăn khi giao tiếp giữa vdk với bàn phím máy vi tính với 89c51.cụ thể là em vẫn chưa biết cách để đọc được một phím được nhấn từ bàn phím và xác nhận nó như thế nào.có cũng đã tham khảo một số nơi rồi nhưng do công lực còn thấp quá lên ko lãnh giáo được. rất mong các cao thủ trong diễn đàn bớt chút thời gian vàng ngọc của mình chỉ giáo cho tại hạ về:giao thức, phần cứng, code, càng chi tiết càng tốt( Note: em dung hợp ngữ)
    thanks các bác trước.

  • #2
    Tuy vẫn gọi cổng bàn phím máy tính là PS2 nhưng về mặt thực tế vẫ là truyền theo dạng chuẩn RS232, 10 bit.
    Có mấy file demo, dễ nhất là nên dọc file demo của AVR dùng C của ATMEL.

    Comment


    • #3
      Trong sách Tăng Cường chương 13 có hướng dẫn rất cụ thể và chi tiết về bàn phím, bạn có thể tham khảo

      Comment


      • #4
        Sách Tăng Cường ở đâu vậy bạn? Chỉ cụ thể cho mình tham khảo với!
        Học cho lắm, tắm hổng có quần thay
        Học cho hay, tắm thay hoài cái quần cũ.

        Comment


        • #5
          Trong diến đàn này cũng có post lên rồi đó. Ở mục 8051 cho người mới bắt đầu. Bạn vào đó mà down

          Comment


          • #6
            Chào bạn! Mình cũng đã từng làm đề tài này rồi. Bạn nên đọc sách của thầy N.T.Cường là hay nhất, ở chương 13 nói về bàn phím.
            Bàn phím về cơ bản được tổ chức theo kiểu ma trận. Trong đó các cột tương ứng với cổng vào, và các hàng tương ứng với cổng ra. Nếu bạn dùng cổng P1 chẳng hạn, và bốn bit cao tương ứng với hàng ; 4 bit thấp tương ứng với cột. Thì đầu tiên bạn nối đất tất cả các hàng, tức là cho 4 bit cao = 0 hết, sau đó bạn đọc tất cả các cột cho đến khi có một cột bằng 0, tức là đã có phím được nhấn. Sau đó bạn xác định phím nhấn bằng cách:
            - Nối đất từng hàng một
            - Đọc tất cả các cột,cho tới khi có 1 cột nào có giá trị =0 thì bạn sẽ xác định được phím đó thuộc về cột nào và hàng nào. Nếu các cột đều có giá trị 1 thì nối đất hàng tiếp theo cho đến khi có cột = 0 thì xác định phím.
            Ví dụ bit P1.0 = 0, tức là bạn đã nối đất hàng 1, bạn đọc được bit P1.4 = 0 thì đó là phím 1 được ấn, sau đó bạn nhảy tới chương trình con( cái này tùy bạn quy định cho từng phím)
            Đây là một chương trình ví dụ điều khiển động cơ 1 chiều dùng bàn phím thông qua con 8255A
            Code:
            #include "reg51.h"
            #include "stdio.h"
            #include "math.h"
            #include "ctype.h"
            #include "stdlib.h"
            unsigned char xdata PORTA _at_ 0x4000;
            unsigned char xdata PORTB _at_ 0x4001;
            unsigned char xdata PORTC _at_ 0x4002;
            unsigned char xdata PORTDK _at_ 0x4003;
            int n;
            int x;
            //----------ham tao tre//
            void delay(unsigned char time)
            {
            	int i;
            	for (i=0;i<time;i++)
            		{
            			TMOD = 0x01;
            			TL0  = 0x18;
            			TH0	 = 0xFC;
            			TR0  = 1;
            			while(!TF0);
            			TR0  = 0;
            			TF0  = 0;
            		}
            }
            //--------------------------------------
            void main (void)
             {	
            	delay(1000);				//delay khoang 1 giay
            	PORTDK=0x88;				//khoi tao 8255 PA,PB ra PC0-3 ra,PC4-7 vao
            	PORTC=0x00;
            	delay(50);
            	while(1)
            	{
            	int x;
            	x=PORTC;
            	x=x&0x30;
            	{
            	if (x==0x20)
            	{
            	delay(200);
            	PORTA=0x5;					//en=1,in1=0,in2=1
            	}
            	else if (x==0x10)
            	{
            	delay(200);
            	PORTA=0x3;
            	}
            	else if (x==0x40)
            	{
            	delay(200);
            	PORTA=0x00;
            
            	}
            }
            }
            }

            Comment


            • #7
              Híc hích, chủ đề này tớ có nêu lên 1 lần rồi ma o thấy cao thủ nào giúp cả. Bữa giờ lu bu mấy cái khác nên cái mạch giao tiếp vdk với bàn phím máy tính vẫn vậy. Làm quá giời mà mới chỉ dừng lại ở đoạn: vdk có thể nhận được mã từ bàn phím gửi lên, do đó có thể xử lí các chương trình theo mã phím nhận. Tuy nhiên rắc rối lớn là tớ không thể thoát được ngắt do bàn phím gây ra(dùng ngắt ngoài). Để lúc nào đưa lên các cao thủ coi tiếp xem có giúp và trao đổi được gì không!
              //---------------------------
              phần cứng, chỉ cần dùng 2 chân: 1 chân ngắt ngoài (làm chân SCK) 1 chân thường làm chân SDA. Cả 2 nối với điện trở kéo lên nguồn(khoảng 10k)
              giao thức: khi có xung ck đầu tiên => xảy ra ngắt ngoài, sau đó hứng từng bit dữ liệu vào biến theo xung ck(lúc này không cho phép ngắt ngoài nữa)
              !e

              Comment


              • #8
                Em cũng dùng ngắt thông qua bàn phím, chạy tốt. Có gì bác zemen post lên xem anh em có giúp được gì không

                Comment


                • #9
                  Đây là đoạn mã tôi viết bằng hợp ngữ, đoạn chương trình chính chỉ chớp tắt port 2, khi có xung ck đầu tiên thi nhảy đến ngắt ngoài
                  Chẳng hạn nhấn phím F9, mã nhận được là 0x01, gửi mã này lên port 0.

                  Code:
                  //------------------------------------------
                  ;p3.2 dung lam duong nhan xung SCK
                  ;P3.1 dung lam duong nhan du lieu SDA
                  
                  org 0
                  ljmp	main
                  
                  org 0003h
                  ljmp	ex0isr			;Chuong trinh ngat ngoai 0
                  
                  main:
                  	mov	ie, #81h		;Cho phep ngat ngoai
                  	setb	it0		;ngat canh
                  lap:
                  	setb	p2.0                    ;chớp tắt led nối chân p2.0
                  	lcall	delay
                  	clr	p2.0
                  	lcall	delay
                  	sjmp	lap
                  
                  ;Chuong trinh ngat ngoai de doc phim nhan
                  ex0isr:
                  	clr	ex0
                  	mov	r1, #8
                  
                  	jb	p3.2, $		;cho bit start => bo qua
                  	jnb	p3.2, $
                  
                  nhan2:	jb	p3.2, nhan2	;cho canh xuong cua xung ck
                  	jnb	p3.2, $
                  	mov 	c, p3.1
                  	rrc	a		;doc bit lsb vao a7 truoc
                  	djnz	r1, nhan2		;doc bit tiep theo cua byte du lieu
                  	mov	p0, a		;dua ma cua phim nhan ra port 2
                  
                  	jb	p3.2, $
                  	jnb	p3.2, $		;cho bit parity => bo qua
                  
                  	jb	p3.2, $
                  	jnb	p3.2, $		;cho bit stop => bo qua
                  
                  	setb	p3.1
                  	setb	p3.2
                  ;	lcall	delay
                  	setb	ex0		;cho phep ngat tro lai
                  reti
                  
                  ;Chuong trinh con tri hoan ms
                  delay:
                  		mov	r7, #255
                  	nhan8:	mov	r6, #255
                  	nhan9:	djnz	r6, nhan9
                  		djnz	r7, nhan8
                  ret
                  end
                  !e

                  Comment


                  • #10
                    Cao thủ giờ đi ngũ hết rồi.
                    hi hi.
                    Xem lại các sự kiện của 1 phím nhấn rồi xử lý lại là xong.
                    Thích thì email tôi share cho mạch giải mã phần cứng khỏi phải lập trình.
                    (email: cuachuabacon@duthu.com)

                    Comment


                    • #11
                      cam on bac. day la dia chi email cua em: automan_hd2005@yahoo.com
                      gui cho em som nhe.thanks!

                      Comment


                      • #12
                        Sau nhiều ngày coi lại rất kĩ và kĩ hơn nữa, tôi vừa tìm ra cái lỗi nho nhỏ nhưng mà vì nó mà tôi chút nữa bó tay. hic hic "IT0 = 1" => hàm o thoát được ngắt, đến đây cũng o hiểu vì sao, có cao thủ nào giải thích được không?
                        Đề nghị của "thanh84" là dùng timer để quét nghe cũng hay, lúc nào làm thử. "Microduyphi" có mạch phần cứng, tôi cũng chưa hiểu lắm, nếu được gửi cho tôi 1 bản: "nguyenhop29@yahoo.com", để tham khảo, sau đó tôi sẽ tổng hợp lại bài viết đưa lên diễn đàn cho anh em cùng trao đổi. Cám ơn 2 bạn nhé!
                        !e

                        Comment


                        • #13
                          chao bac.Van la chuyen cai ban phim may tinh voi vdk. Bac nao lam ngon lanh roi thi post lên cho anh em được ko? em làm hoài mà vẫn ko ổn.

                          Comment


                          • #14
                            Tui nho' co 1 de tai lam ve giao tiep ban phim AT viet bang basic, dung Bacoom de compile, ban thu cai bascom vao thu xem, coi co vi dzu nao ko, hinh nhu trang application note cua Bascom thi phai.

                            Comment


                            • #15
                              Đoạn mã giao tiếp bàn phím

                              Đây là đoạn mã đơn giản viết bằng Keil C. Nhấn phím Enter chạy hàm 1, nhấn phím Space chạy hàm 2, khác: chạy chương trình chính

                              Code:
                              //chuong trinh giao tiep ban phim may tinh 
                              //voi vdk dung 2 chan SCK(p32) va SDA(p33)
                              
                              #include <treg52.h>
                              unsigned char btam = 0;
                              void Delay_ms (unsigned int ms)
                              {
                              	unsigned int  i;
                              	unsigned int j;
                              	for (i= 0; i < ms; i++)
                              	
                              		for (j = 0; j< 1000; j++);		
                              }
                              tatic void Ngat_ngoai (void) interrupt 0
                              {		//xung ck thu 1, bo qua bit start
                              	unsigned char i;
                              
                              	EA = 0;	//khong cho phep ngat xay ra khi dang nhan du lieu
                              	while(!P32){}
                              	
                              	A = 0;
                              	for (i = 0; i < 8; i++)
                              	{
                              		while(P32){}	//xung ck thu 2 bat dau nhan du lieu
                              		A = A >> 1;
                              		A7 = P33;
                              		while(!P32){}	//cho xung ck len tro lai			
                              	}
                              	btam = A;
                              
                              	while(P32){}
                              	while(!P32){}		//bo qua bit parity
                              	while(P32){}
                              	while(!P32){}		//bo qua bit stop
                              	//den day nhan dung ma cua phim duoc nhan
                              
                              	Delay_ms(100);
                              	EA = 1;			//cho phep ngat tro lai
                              }
                              void ham1(void)
                              {
                              	while(btam==0x5A)
                              	{
                              		P00 = 0;
                              		P0 = P0 << 1;
                              		Delay_ms(100);
                              		if(P0 == 0)
                              			P0 = 255;
                              	}
                              
                              }
                              
                              void ham2(void)
                              {
                              	while(btam ==0x29)
                              	{
                              		P0 = ~P0;
                              		Delay_ms(100);
                              	}
                              }
                              
                              void main(void)
                              {
                              //	unsigned char i;
                              	IE = 0x81;
                              //	IT0 = 1;	//ngat canh
                              	while(1)
                              	{
                              		if(btam == 0x5A)//nhan Enter
                              		{
                              			ham1();
                              			P0 = 255;		
                              		}
                              		if(btam == 0x29)//Nhan Space
                              		{		
                              			ham2();
                              			P0 = 255;
                              		}
                              		else
                              		{
                              			P2 = P2 + 1;
                              			Delay_ms(100);
                              		}
                              	}
                              }
                              !e

                              Comment

                              Về tác giả

                              Collapse

                              robincon Tìm hiểu thêm về robincon

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X