亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ps2.c

?? STM32不完全手冊 例程源碼 29個
?? C
字號:
#include "ps2.h" 
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//Mini STM32開發板
//PS2 驅動代碼		   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2010/6/17 
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 正點原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////	 
 

//PS2產生的時鐘頻率在10~20Khz(最大33K)
//高/低電平的持續時間為25~50us之間.	  
			 
//PS2_Status當前狀態標志
//[5:4]:當前工作的模式;[7]:接收到一次數據
//[6]:校驗錯誤;[3:0]:收到的數據長度;
u8 PS2_Status=CMDMODE; //默認為命令模式 
u8 PS2_DATA_BUF[16];   //ps2數據緩存區

//位計數器
u8 BIT_Count=0;
	   
//中斷15~10處理函數
//每11個bit,為接收1個字節
//每接收完一個包(11位)后,設備至少會等待50ms再發送下一個包
//只做了鼠標部分,鍵盤部分暫時未加入
//CHECK OK 2010/5/2
void EXTI15_10_IRQHandler(void)
{	  	 
	static u8 tempdata=0;
	static u8 parity=0;  	   
	if(EXTI->PR&(1<<15))//中斷15產生了相應的中斷
	{
		EXTI->PR=1<<15;  //清除LINE15上的中斷標志位
		if(BIT_Count==0)
		{
			parity=0;
			tempdata=0;
		}
		BIT_Count++;    
		if(BIT_Count>1&&BIT_Count<10)//這里獲得數據
		{	  
			tempdata>>=1;
			if(PS2_SDA)
			{
				tempdata|=0x80;
				parity++;//記錄1的個數
			}   
		}else if(BIT_Count==10)//得到校驗位
		{
			if(PS2_SDA)parity|=0x80;//校驗位為1
		}	   
		if(BIT_Count==11)//接收到1個字節的數據了
		{
 			BIT_Count=parity&0x7f;//取得1的個數	  
			if(((BIT_Count%2==0)&&(parity&0x80))||((BIT_Count%2==1)&&(parity&0x80)==0))//奇偶校驗OK
			{					    
				//PS2_Status|=1<<7;//標記得到數據	   
				BIT_Count=PS2_Status&0x0f;		
				PS2_DATA_BUF[BIT_Count]=tempdata;//保存數據
				if(BIT_Count<15)PS2_Status++;    //數據長度加1
				BIT_Count=PS2_Status&0x30;	     //得到模式	  
				switch(BIT_Count)
				{
					case CMDMODE://命令模式下,每收到一個字節都會產生接收完成
						PS2_Dis_Data_Report();//禁止數據傳輸
						PS2_Status|=1<<7; //標記得到數據
						break;
					case KEYBOARD:
						break;
					case MOUSE:
						if(MOUSE_ID==0)//標準鼠標,3個字節
						{
							if((PS2_Status&0x0f)==3)
							{
								PS2_Status|=1<<7;//標記得到數據
								PS2_Dis_Data_Report();//禁止數據傳輸
							}
						}else if(MOUSE_ID==3)//擴展鼠標,4個字節
						{
							if((PS2_Status&0x0f)==4)
							{
								PS2_Status|=1<<7;//標記得到數據
								PS2_Dis_Data_Report();//禁止數據傳輸
							}
						}	 
						break;
				}		   		 
			}else
			{
				PS2_Status|=1<<6;//標記校驗錯誤
				PS2_Status&=0xf0;//清除接收數據計數器
			}
			BIT_Count=0;
		} 	 	  
	}			  
}
//禁止數據傳輸
//把時鐘線拉低,禁止數據傳輸
//CHECK OK 2010/5/2
void PS2_Dis_Data_Report(void)
{
	PS2_Set_Int(0);   //關閉中斷
	PS2_SET_SCL_OUT();//設置SCL為輸出
	PS2_SCL_OUT=0;    //抑制傳輸
}
//使能數據傳輸
//釋放時鐘線
//CHECK OK 2010/5/2
void PS2_En_Data_Report(void)
{
	PS2_SET_SCL_IN(); //設置SCL為輸入
	PS2_SET_SDA_IN(); //SDA IN
	PS2_SCL_OUT=1;    //上拉   
	PS2_SDA_OUT=1; 
	PS2_Set_Int(1);   //開啟中斷
}

//PS2中斷屏蔽設置
//en:1,開啟;0,關閉;
//CHECK OK 2010/5/2
void PS2_Set_Int(u8 en)
{
	EXTI->PR=1<<15;  //清除LINE15上的中斷標志位
	if(en)EXTI->IMR|=1<<15;//不屏蔽line15上的中斷
    else EXTI->IMR&=~(1<<15);//屏蔽line15上的中斷   
}
//等待PS2時鐘線sta狀態改變
//sta:1,等待變為1;0,等待變為0;
//返回值:0,時鐘線變成了sta;1,超時溢出;
//CHECK OK 2010/5/2
u8 Wait_PS2_Scl(u8 sta)
{
	u16 t=0;
	sta=!sta;
	while(PS2_SCL==sta)
	{
		delay_us(1);
		t++;
		if(t>16000)return 1;//時間溢出 (設備會在10ms內檢測這個狀態)
	}
	return 0;//被拉低了
}
//在發送命令/數據之后,等待設備應帶,該函數用來獲取應答
//返回得到的值 
//返回0,且PS2_Status.6=1,則產生了錯誤
//CHECK OK 2010/5/2
u8 PS2_Get_Byte(void)
{
	u16 t=0;
	u8 temp=0;
	while(1)//最大等待55ms
	{
		t++;
		delay_us(10);
		if(PS2_Status&0x80)//得到了一次數據
		{
			temp=PS2_DATA_BUF[PS2_Status&0x0f-1];
			PS2_Status&=0x70;//清除計數器,接收到數據標記
			break;	
		}else if(t>5500||PS2_Status&0x40)break;//超時溢出/接收錯誤	   
	}
	PS2_En_Data_Report();//使能數據傳輸
	return temp;    
}	    
//發送一個命令到PS2.
//返回值:0,無錯誤,其他,錯誤代碼
u8 PS2_Send_Cmd(u8 cmd)
{
	u8 i;
	u8 high=0;//記錄1的個數		 
	PS2_Set_Int(0);   //屏蔽中斷
	PS2_SET_SCL_OUT();//設置SCL為輸出
	PS2_SET_SDA_OUT();//SDA OUT
	PS2_SCL_OUT=0;//拉低時鐘線
	delay_us(120);//保持至少100us
	PS2_SDA_OUT=0;//拉低數據線
	delay_us(10);
	PS2_SET_SCL_IN();//釋放時鐘線,這里PS2設備得到第一個位,開始位
	PS2_SCL_OUT=1;
	if(Wait_PS2_Scl(0)==0)//等待時鐘拉低
	{									  
		for(i=0;i<8;i++)
		{
			if(cmd&0x01)
			{
			    PS2_SDA_OUT=1;
				high++;
			}else PS2_SDA_OUT=0;   
			cmd>>=1;
			//這些地方沒有檢測錯誤,因為這些地方不會產生死循環
			Wait_PS2_Scl(1);//等待時鐘拉高 發送8個位
			Wait_PS2_Scl(0);//等待時鐘拉低
		}
		if((high%2)==0)PS2_SDA_OUT=1;//發送校驗位 10
		else PS2_SDA_OUT=0;
		Wait_PS2_Scl(1); //等待時鐘拉高 10位
		Wait_PS2_Scl(0); //等待時鐘拉低
		PS2_SDA_OUT=1;   //發送停止位  11	  
 		Wait_PS2_Scl(1);//等待時鐘拉高 11位
		PS2_SET_SDA_IN();//SDA in
		Wait_PS2_Scl(0);//等待時鐘拉低
		if(PS2_SDA==0)Wait_PS2_Scl(1);//等待時鐘拉高 12位 
		else 
		{
			PS2_En_Data_Report();
			return 1;//發送失敗
		}		
	}else 
	{
		PS2_En_Data_Report();
		return 2;//發送失敗
	}
	PS2_En_Data_Report();
	return 0;    //發送成功
}
//PS2初始化				   
//CHECK OK 2010/5/2
void PS2_Init(void)
{
	RCC->APB2ENR|=1<<2;    //使能PORTA時鐘

	JTAG_Set(JTAG_SWD_DISABLE);	
									  
	GPIOA->CRH&=0X0F0FFFFF;//PA13,15設置成輸入	
	GPIOA->CRH|=0X80800000;//PA13,15設置成輸出	
	GPIOA->ODR|=5<<13;							  	  	 

    AFIO->EXTICR[3]&=0XFFFF0FFF;//EXTI15映射到PA15
    AFIO->EXTICR[3]|=0<<12;     //EXTI15映射到PA15 	    		   

	EXTI->IMR|=1<<15;        //開啟line15上的中斷
	EXTI->EMR|=1<<15;        //不屏蔽line15上的事件	 
    EXTI->FTSR|=1<<15;       //line15 上事件下降沿觸發   				  
	MY_NVIC_Init(1,2,EXTI15_10_IRQChannel,2);//分配到第二組,搶占2,響應3		 
} 














?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品996| 欧美一区二区网站| 欧美绝品在线观看成人午夜影视| 精品国产一区久久| 亚洲视频一区二区在线观看| 亚洲一区二区四区蜜桃| 国产一区啦啦啦在线观看| 91国偷自产一区二区使用方法| 国产精华液一区二区三区| 欧美亚洲高清一区二区三区不卡| 成人免费视频网站在线观看| 欧美性受xxxx| 亚洲欧美区自拍先锋| 国产成人在线视频网站| 精品国产一区二区三区久久久蜜月| 欧美tk—视频vk| 日韩主播视频在线| 欧美日韩dvd在线观看| 国产精品国产自产拍高清av| 精品在线观看视频| 日韩视频在线你懂得| 日韩精品一二区| 欧美人狂配大交3d怪物一区| 亚洲一区二区三区四区五区中文| 三级精品在线观看| 欧美丝袜丝交足nylons图片| 伊人性伊人情综合网| 在线看一区二区| 亚洲精品国产品国语在线app| 亚洲老妇xxxxxx| 99久久99精品久久久久久| 亚洲欧美综合色| 91色porny在线视频| 亚洲欧美日韩一区二区 | 久久久久久影视| 日韩黄色片在线观看| 欧美疯狂性受xxxxx喷水图片| 精品日韩一区二区| 国产精品一级片| 国产欧美日韩精品在线| 成人精品免费视频| 成人免费小视频| 色偷偷88欧美精品久久久| 亚洲电影欧美电影有声小说| 51精品视频一区二区三区| 青青草原综合久久大伊人精品优势| 国产suv一区二区三区88区| 亚洲国产成人私人影院tom | 国产无一区二区| 不卡一区中文字幕| 亚洲精品你懂的| 欧美一区二区三区视频| 国产精品一区三区| 一区二区三区资源| 欧美一区二区女人| 国产不卡高清在线观看视频| 亚洲欧洲中文日韩久久av乱码| 国产一区二区不卡老阿姨| 国产精品免费免费| 欧美精品三级在线观看| 国产在线精品不卡| 国产精品国产三级国产普通话99 | 亚洲欧洲中文日韩久久av乱码| 国产不卡视频在线播放| 国产女人18水真多18精品一级做| 午夜视频一区二区| 2021中文字幕一区亚洲| 色噜噜狠狠成人网p站| 欧美a级一区二区| 亚洲品质自拍视频网站| 久久综合久久99| 色噜噜狠狠成人网p站| 久久99精品视频| 亚洲一二三专区| 久久久综合精品| 欧美日韩黄色一区二区| 成人福利视频网站| 欧美aa在线视频| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲国产日产av| 国产亚洲一区二区三区| 欧美日韩一二三| 91性感美女视频| 免费在线看一区| 亚洲国产综合视频在线观看| 国产精品视频yy9299一区| 日韩视频在线你懂得| 欧美网站一区二区| 91小视频免费观看| 国产精品一区一区三区| 久久精品国产一区二区三区免费看| 日韩一区和二区| 91美女在线观看| 成人爽a毛片一区二区免费| 久久草av在线| 五月婷婷欧美视频| 91成人在线免费观看| 丁香激情综合五月| 国产又粗又猛又爽又黄91精品| 久久久不卡网国产精品二区 | 午夜久久电影网| 亚洲免费成人av| 国产精品欧美一区二区三区| 久久久夜色精品亚洲| 日韩一区二区三| 日韩午夜激情电影| 日韩欧美国产综合在线一区二区三区| 青青草国产成人av片免费| 亚洲精品乱码久久久久久久久| 欧美日韩精品免费| 欧美日韩中文国产| 在线观看三级视频欧美| 在线观看视频一区二区| 在线观看av一区| 欧美色视频在线观看| 欧美日韩免费电影| 欧美日韩在线观看一区二区| 欧美日本国产视频| 9191久久久久久久久久久| 欧美日韩久久久久久| 欧美日韩精品是欧美日韩精品| 日韩黄色在线观看| 久久成人免费日本黄色| 美女一区二区在线观看| 蜜桃久久久久久| 国产精品影视天天线| fc2成人免费人成在线观看播放| 亚洲视频在线观看三级| 亚洲免费毛片网站| 亚洲成av人片在www色猫咪| 日韩 欧美一区二区三区| 久久er99精品| voyeur盗摄精品| 欧美日韩一区二区三区在线看 | 一本一道久久a久久精品 | 精品国产免费人成电影在线观看四季 | 欧美午夜片在线看| 欧美一卡2卡三卡4卡5免费| 精品国产乱码久久久久久1区2区| 色综合色狠狠天天综合色| 91色九色蝌蚪| 欧美一级久久久| 久久久久久久综合狠狠综合| 国产精品久久久久婷婷二区次| 欧美一区二区啪啪| 亚洲国产经典视频| 亚洲毛片av在线| 蜜臀精品久久久久久蜜臀| 国产一区二区福利视频| 色综合天天综合网天天狠天天| 国产精品原创巨作av| 色菇凉天天综合网| 欧美一区二区福利视频| 国产精品不卡在线| 丝袜国产日韩另类美女| 国产成人免费视频一区| 欧美日韩一区国产| 中文字幕一区二区在线观看| 天天综合网天天综合色| 国产成人午夜精品影院观看视频| 国产自产高清不卡| 欧美亚洲自拍偷拍| 亚洲精品一区二区三区精华液 | 国产精品美女一区二区在线观看| 日韩欧美一级精品久久| 亚洲人一二三区| 国产成人无遮挡在线视频| 91麻豆精品国产综合久久久久久| 在线观看精品一区| 日本一区二区三区久久久久久久久不| 精品少妇一区二区三区免费观看| 欧美一区二区三区视频| 亚洲精品视频在线| 精品亚洲国产成人av制服丝袜| 激情成人午夜视频| 欧美揉bbbbb揉bbbbb| 亚洲视频小说图片| 国产jizzjizz一区二区| 日韩免费视频线观看| 午夜久久久久久| 欧美中文字幕一区二区三区亚洲| 色天天综合色天天久久| 日本一区二区三区四区| 蜜臀av性久久久久av蜜臀妖精| 美美哒免费高清在线观看视频一区二区| 午夜精品视频在线观看| 色婷婷亚洲一区二区三区| 国产精品免费看片| 国产**成人网毛片九色| 日韩欧美一区在线| 美女视频一区在线观看| 91精品免费在线观看| 午夜精品福利一区二区三区av| 久久精品国产一区二区| 欧美视频完全免费看| 一区二区三区精品视频| 97se亚洲国产综合自在线| 中文字幕在线不卡一区二区三区 | 中文字幕不卡在线观看| 懂色av一区二区夜夜嗨|