Thông báo

Collapse
No announcement yet.

giao tiếp PS/2 với 89V51RB2 hoàn thiện sơ bộ

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

  • giao tiếp PS/2 với 89V51RB2 hoàn thiện sơ bộ

    Code:
    					//*******De An VDK Nhom OV_DHKHTN_TPHCM*******//
    								//Tran Hoang Dat//
    					/*chuong trinh DEMO giao tiep 8051 voi PS/2*/
    #include <REGX51.H>
    #define rs 			P0_0
    #define rw 			P0_1
    #define enable 		P0_2
    #define	lcd_data 	P1
    #define zise		20
    unsigned char count=0,scancode=0,ip=0,capslock=0;
    const unsigned char 
    meg_lcd_comman[5]=			{
    							0x38,0x0E,0x01,0x06
    							},
    meg_scancode_abc[47]={
    							0x45,0x16,0x1E,0x26,0x25,0x2E,0x36,0x3D,0x3E,0x46,
    							0x1C,0x32,0x21,0x23,0x24,0x2B,0x34,0x33,0x43,0x3B,
    							0x42,0x4B,0x3A,0x31,0x44,0x4D,0x15,0x2D,0x1B,0x2C,
    							0x3C,0x2A,0x1D,0x22,0x35,0x1A,0x29,0x4E,0x55,0x54,
    							0x5B,0x5D,0x4C,0x52,0x41,0x49,0x4A
    							},
    meg_ascii_ABC[47]=			{
    		  					48,49,50,51,52,53,54,55,56,57,
    							65,66,67,68,69,70,71,72,73,74,
    							75,76,77,78,79,80,81,82,83,84,
    							85,86,87,88,89,90,32,45,61,91,
    							93,92,59,39,44,46,47
    		  					};
    unsigned char lcd_ready()
    {
    	unsigned char busy;
    	lcd_data = 0xFF;
    	rw = 1;
    	rw = 1;
    	enable = 1;
    	enable = 1;
    	busy = lcd_data;
    	enable = 0;
    	return(busy);
    }
    void delay_us(unsigned char n)
    {
    	unsigned char i;
    	for(i=0;i<n;i++);
    }
    void delay_ms(unsigned int n)
    {
    	unsigned int i;
    	for(i=0;i<n;i++) delay_us(255);
    }
    void lcd_send_data( unsigned char data_or_comman )
    {
    	lcd_data = data_or_comman;
    	lcd_data = data_or_comman;
    	delay_us(10);
    	enable = 1;
    	delay_us(10);
    	enable = 0;
    	delay_us(10);
    }
    void lcd_buffer( unsigned char choice, unsigned char data_or_comman )
    {
    	rs = 0;
    	while ( lcd_ready()&0x80) ; 
    	rs = choice;
    	delay_us(10);
    	rw = 0;
    	delay_us(10);
    	enable = 0;
    	lcd_send_data(data_or_comman);
    }
    void lcd_sets()
    {
    	char i;
    	rs = 0;
    	rw = 0;
    	enable = 0;
    	delay_ms(15);
    	for(i=0;i<4;++i)
    		lcd_buffer(0,meg_lcd_comman[i]);
    }
    void lcd_point_x_y( unsigned char x, unsigned char y)
    {
    	unsigned char point;
    	switch(y)
    	{
    	case 1 : point=0x80;break;
    	case 2 : point=0xC0;break;
    	case 3 : point=0x94;break;
    	case 4 : point=0xD4;break;
    	}
    	point+=x-1;
    	lcd_buffer(0,point);
    }
    void lcd_puts_char(char c)
    {
    	lcd_buffer(1,c);
    }
    void lcd_puts_string( const char *msg)
    {
    	while(*msg) 
    		lcd_puts_char(*msg++);
    	ip++;
    }				 			
    void inter_external(void) interrupt 0 
    {
    	if(count<9)
    	{
    		scancode=scancode>>=1;
    		if(P3_3)
    			scancode|=0x80;
    		else
    			scancode|=0x00;
    	}
    	count++;
    }
    unsigned char cover_to_ascii(unsigned char temp_scancode)
    {
    	unsigned char i,test;
    	for(i=0;i<47;i++)
    	{
    		if(temp_scancode==meg_scancode_abc[i])
    		{
    			test=1;
    			break;
    		}
    		else
    			test=0;
    	}
    	if(temp_scancode==0x58)
    	{
    			capslock=!capslock;
    			ip--;
    	}
    	if(test)
    	{
    	 	if((capslock)||(i<10)||(scancode==0x29)||(i>=36))
    			return(meg_ascii_ABC[i]);
    		else	
    			return(meg_ascii_ABC[i]+32);
    	}
    	else
    	{	ip--;
    		return(0);
    	}	
    }
    
    void main(void)
    {
    	char temp_lcd[1];
    	P3_3=1;//	data
    	P3_2=1;//	clock
    	TR1=1;
    	lcd_sets();	
    	while(scancode!=0x76)
    	{		
    		while(count<33)
    		{
    	
    			EA=1;
    			EX0=1;
    			IT0=1;		
    		}
    		temp_lcd[0]=cover_to_ascii(scancode);
    		if(scancode!=0x66)
    		{
    			lcd_buffer(0,meg_lcd_comman[3]);
    		 }
    		else
    		{
    			lcd_buffer(0,0x04);
    			lcd_puts_string(" ");
    			ip=ip-3;				 
    		}
    		lcd_puts_string(temp_lcd);
    		count=0;
    		if((ip==16)||(scancode==0x5A))
    		{
    			lcd_buffer(0,0xC0);
    			ip=17;
    		}		
    	}
    	///////////////////////////////////////////////
    	while(1)
    	{
    		delay_ms(800);
    		lcd_buffer(0,0x0A);
    		delay_ms(800);
    		lcd_buffer(0,0x0C);
    	}
    }
    nếu có tiền mua con RD2 thì sẽ hoàn thiện hơn
    mong anh em góp ý để hoàn thiện đề tài
    Attached Files

  • #2
    sao bật đèn capslock Numlock scrolllock khó quá!
    ai hiểu rõ vấn đề này hướng dẫn giúp mình, có tài liệu thì cho mình xin (tài liệu độc vào chứ mình search hết trên mạng rồi) nó toàn nói đến DOS mà thôi.

    Comment


    • #3
      Diễn đàn dạo này chùng quá,đề tài khá hay mà sao không có ai hứng thú gì hết vậy.Bà kon không còn mặn mà với môn điện tử nữa hay sao ý!


      email:
      Giá mà mạch điện tử không có nhiễu (noise) thì mình bây giờ đã là ... đại gia

      Comment

      Về tác giả

      Collapse

      anh_tran Ninh Hòa là quê tôi Tìm hiểu thêm về anh_tran

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

      Collapse

      Đang tải...
      X