⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p0902-ps2.c

📁 单片机与PS2键盘通讯的例子
💻 C
📖 第 1 页 / 共 2 页
字号:
};

//---------------------------------------
//名称: LCD清屏函数
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20081111  
//----------------------------------------- 
void LCD_clear(void)
{
	unsigned char t;
	unsigned char k;   
	for(t=0;t<6;t++)
	{ 
		for(k=0;k<84;k++)
		{ 
			LCD_write_byte(0,1);	 		
		} 
	}
}
//---------------------------------------
//名称: 5110LCD初始化函数
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20081111  
//----------------------------------------- 
void LCD_init(void)
{
	LCD_write_byte(0x21,0);	//LCD功能设置:芯片活动,水平寻址,使用扩展指令
	LCD_write_byte(0xc5,0);	//设置偏置电压
	LCD_write_byte(0x06,0); //温度校正 
  	LCD_write_byte(0x13,0); //1:48 
	LCD_write_byte(0x20,0);	//LCD功能设置:芯片活动,水平寻址,使用基本指令
	LCD_clear();
	LCD_write_byte(0x0C,0);	//设定显示配置:普通模式
}
//---------------------------------------
//名称: 设置坐标函数
//参数:X:0-83 Y:0-5
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20081111  
//-----------------------------------------   
void LCD_set_XY(unsigned char X, unsigned char Y)
{
	LCD_write_byte(0x40 | Y, 0);
	LCD_write_byte(0x80 | X, 0);
}
//---------------------------------------
//名称: 显示英文字符
//参数:c:显示的字符在font6x8表格中的位置
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20081111  
//-----------------------------------------  	
void LCD_write_char(unsigned char c)
{
	unsigned char line;
	c-= 32;
	for (line=0; line<6; line++)
	LCD_write_byte(font6x8[c][line], 1);
}
//---------------------------------------
//名称: 英文字符串显示函数
//参数:*s:英文字符串指针
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20081111  
//-----------------------------------------  
void LCD_write_String(unsigned char X,unsigned char Y,char *s)
{
	LCD_set_XY(X,Y);
	while (*s) 
	{
		LCD_write_char(*s);
		s++;
	}
} 
void LCD_write_String1(unsigned char X,unsigned char Y,unsigned char s)
{
	unsigned char line;
	LCD_set_XY(X*6,Y);
	for (line=0; line<6; line++)
		LCD_write_byte(font6x8[s][line], 1);	
} 
//---------------------------------------
//名称: SPI初始化函数  
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20090325 
//-----------------------------------------  
void init_spi()
{
 	P1M0=0X40;
	P1M1=0XA0;
	SPCTL=0XD0;
	SPSTAT=0XC0;	
}
//---------------------------------------
//名称: 使用SPI接口写数据到LCD
//参数:dt:写入的数据 command: 1-数据/0-命令
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20090325  
//-----------------------------------------  
void LCD_write_byte(unsigned char dt, unsigned char command)
{
	sce=0;
	dc=command;
	SPDAT=dt;
	while(!(SPSTAT&0X80));
	SPSTAT=0XC0;
	dc=1;
	sce=1;
	sdin=1;
}
//---------------------------------------
//名称: 写一个汉字到LCD函数
//参数:x,y:写入汉字的地址 address: 写入汉字在han表格中的位置
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20081111  
//----------------------------------------- 		
void disp16_16(unsigned char x,unsigned char y,unsigned char address) 
{ 
	unsigned char c; 
	LCD_set_XY(x*8, y); 
	for(c=0;c<16;c++) 
	{ 			
		LCD_write_byte(han[address*32+c],1); 
	} 
    LCD_set_XY(x*8, y+1);
	for(c=16;c<32;c++) 
	{ 			
		LCD_write_byte(han[address*32+c],1); 
	} 
} 
unsigned char  Decode(unsigned char ScanCode)
//注意:如SHIFT+G为12H 34H F0H 34H F0H 12H?
//也就是说shift的通码+G的通码+shift的断码+G的断码
{
	unsigned char TempCyc; 
	unsigned char KeyChar=0;
	if (!Key_UP) //当键盘松开时
	{
		switch (ScanCode)
  		{
  			case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
         		Key_UP = 1;
      		break;

  			case 0x12 : // 左 SHIFT
      			Shift = 1;
         	break;

  			case 0x59 : // 右 SHIFT
         		Shift = 1;
            break;
			case 0x66:  //backspace
				if(weizhi>0)
				{
				 	weizhi--;
					disbuf[weizhi]=0;
					disbit=1;
				}
			break;
  			default: 
      			if (DisNum > 15) DisNum = 0; 
         		if(!Shift) //如果SHIFT没按下
         		{
       				for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
          			if (UnShifted[TempCyc][0] == ScanCode) 
					{
                    	KeyChar=UnShifted[TempCyc][1]; 	
						disbit=1;
						disbuf[weizhi]=KeyChar;
						if(weizhi<83) weizhi++;
					}				
          			DisNum++;
         		} 
      			else //按下SHIFT
          		{
         			for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
       				if (Shifted[TempCyc][0] == ScanCode) 
					{
                    	KeyChar=Shifted[TempCyc][1];
						disbit=1;
						disbuf[weizhi]=KeyChar;
						if(weizhi<83) weizhi++;
					}
        			DisNum++;
       			}
      		break;
     	}
	}
	else
	{ 
		Key_UP = 0;
		switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
  		{
  			case 0x12 : // 左 SHIFT
      			Shift = 0;
         	break;
  			case 0x59 : // 右 SHIFT
      			Shift = 0;
         	break;
  		}
	}
	return KeyChar;
} 		  
void scakey()
{		
	if (BF)
	{				
		Decode(keybuf);
		BF=0;
		EX1=0;	
		EA=1;		
	}
	else
    	EX1 = 1; //开中断      		
} 
void init1()interrupt 2 using 0
{
	if ((IntNum > 0) && (IntNum < 9))
	{ 
		KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
		if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
	}
	IntNum++;
	while (!Key_CLK); //等待PS/2CLK拉高
	if (IntNum > 10)
	{
		IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
		BF = 1; //标识有字符输入完了 
		keybuf=KeyV;
		KeyV=0;		 	
	}
}
//---------------------------------------
//名称: 主函数		 
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20081111  
//----------------------------------------- 	
void main()
{
	unsigned char k;
	unsigned char l;
	init_spi();
	res=0;
	for(k=0;k<250;k++);
	for(k=0;k<84;k++) disbuf[k]=0;
	res=1;				//LCD复位
	LCD_init(); 		//初始化LCD模块 
	LCD_clear(); 		//清屏幕	 
	disp16_16(0,0,0);	//宁
	disp16_16(2,0,1);	//波
	disp16_16(4,0,2);	//单
	disp16_16(6,0,3);	//片
	disp16_16(8,0,4);	//机
	disp16_16(1,2,5);	//开
	disp16_16(4,2,6);	//发
	disp16_16(7,2,7);	//网
	LCD_write_String(1,5,"www.nbdpj.com");	//www.nbdpj.com
	back_led=0;			//开背光
	EX1=1;	
	EA=1;
	weizhi=0;
	while(1)
	{
		scakey();
		if(disbit)
		{
		 	disbit=0;
			for(k=0;k<6;k++)
			{
				for(l=0;l<14;l++)
				{
					LCD_write_String1(l,k,disbuf[k*14+l]);
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -