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

📄 test1.c

📁 nRF401串口通信的C语言程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		 case 'y': zf_disp8(R_ye,R_lie,smally);R_lie=R_lie+8;  break;
		 case 'z': zf_disp8(R_ye,R_lie,smallz);R_lie=R_lie+8;  break;			
	} 
	//翻页
	if(R_lie>127) 
	{
		R_lie = 64+16; 
		R_ye=R_ye+1;
		if(R_ye>7)  
		{
			R_ye = 0;
		    R_lie = 80;
			Clr_Scr();
			zf_disp8(0,0,biga);
	        zf_disp8(0,8,maohao);
	        zf_disp8(0,64,bigb);
	        zf_disp8(0,72,maohao);
		}
	}
	//	zf_disp8(R_ye,R_lie,kongge); R_lie = R_lie+8;	//一组数据传输完之后要显示一个空格 	
}

void Keyboard_out(void) interrupt 2			  //键盘中断
{
	if ((IntNum > 0) && (IntNum < 9))
		{			
			KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
			if (Key_Data) 	  //数据线的电平
				KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位	KevV的值将在此处发生改变
		}
	IntNum++;		   //  中断次数计数
	while (!Key_CLK);  //  等待PS/2CLK拉高

	if (IntNum > 10)
		{
			IntNum = 0;  //当中断11次后表示一帧数据收完,清变量准备下一次接收
			BF = 1;      //标识有字符输入完成
			EA = 0;      //     关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)
		}
}

void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
	unsigned char TempCyc;	

	if (!Key_UP)                //当键盘松开时	Key_UP初始是0
		{
			switch (ScanCode)
				{
					case 0xF0 :	// 当收到0xF0,Key_UP置1表示断码开始
						Key_UP = 1;	break;

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

					case 0x59 :	// 右 SHIFT
						Shift = 1; 	break;

					default:					
						if(!Shift)	//如果SHIFT没按下
							{
								for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++)
								          ; //查表显示
								if (UnShifted[TempCyc][0] == ScanCode) 	   										
										Display_Right(UnShifted[TempCyc][1]);
									    //DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);	//改,用128*64显示
								buf[DisNum] =  UnShifted[TempCyc][1];
								DisNum++;	 //显示用指针
							} 
						else  //按下SHIFT
							{
								for(TempCyc = 0; (Shifted[TempCyc][1]!=ScanCode)&&(TempCyc<59); TempCyc++)
								           ; //查表显示
								if (Shifted[TempCyc][0] == ScanCode) 
										Display_Right(Shifted[TempCyc][1]); // 显示								         
								buf[DisNum] =  Shifted[TempCyc][1];
								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;
				}
		}
	BF = 0; //标识字符处理完了
} 

/***    键盘处理程序   ***/
void DealKeyboard()
{
	if (BF)
		Decode(KeyV);
	else
		EA = 1; //开中断
	if(buf[DisNum-1]==' ')	 //DisNum 多加了一次,所以要减一
	{
		flag = 1;  
	    zf_disp8(R_ye,R_lie,kongge); R_lie = R_lie+8;	//一组数据输入完之后要显示一个空格 	
	}
}

		  
/* 主程序 */

void main()
{ 
	uchar i = 0,L_ye=0,L_lie=0+16;
	uchar tmp = 0xff;

	P27 = 1;					// 发光管不亮  	
	init_lcd();	 //液晶初始化	 
    Clr_Scr();
    //开机画面
	Disp_Img(Bmp);
	delay(1000);
    Clr_Scr();
	zf_disp8(0,0,biga);
	zf_disp8(0,8,maohao);
	zf_disp8(0,64,bigb);
	zf_disp8(0,72,maohao);
		 
	init_serial();			   // 串口初始化  
	EA = 1;					   // 打开所有中断
	ES = 1;
	SM2 = 1;	               // 只接收地址帧

	IT1 = 0;                   // 外部中断低电平触发	 
	EX1 = 1;
	/* 进入设备应答 */
	while(1)
	{	
		ES = 1;   //开串口中断 
		EX1 = 1;  //开外部中断  用于PS2
	   /*	 if() // 发送数据  要先发送地址	ADDR_B	  还要发送数据长度,数据,校检字节
		{
			SBUF = ;		//发送键盘输入的数据  
		}*/		   	
	
		DealKeyboard();
	
	    /******   发送数据   ******/
	    if(flag == 1)
	    /* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */
	    {   
	        ES = 0;      //关闭串口中断
	
    		flag = 0;
			
			*(buf+DisNum) = 0;		// 缓冲区最后一个字节为0表示数据结束   			
			DisNum = 0;

			delay(10);  //  发送时置模式时最好延时			
			/* 发送从机地址 */
			TI = 0;
			TB8 = 1;				// 发送地址帧   good	
			SBUF = ADDR_A;	        // 发送本机地址
	    	while(!TI);
		    TI = 0;	 	   

			senddata(buf);			// 发送数据	


			//清空 buf[]
			for(i = 0;i<10;i++)
			{ 
					buf[i] = 0;	  
			}
			ES = 1;
	    }		
	   // SM2 = 1;				// 只接收地址帧	
	   // 地址位中断接收了  
	   /************    接收数据  ************/
		if(addr == ADDR_B)		//
		{	
			addr = addr - 5;
			SM2 = 0;	    // 	 
			ES = 0;		    //  关串口中断
			/* 数据接收 */  
			tmp = 0xff;
			while(tmp==0xff)		// 如果校验失败则重新接收数据
			{
					/* 校验失败返回0xff,检测到地址帧则返回0xee,接收成功返回0 */
					tmp = recvdata(buf); 			
				
			} 		
			if(tmp==0x00)			// 校验正确,表示接收成功
			{
				/*   红灯状态变化,表示接收数据成功  */
				P27 = ~P27;				
				for(i = 0;i<strlen(buf);i++)		//左半屏显示 接收到的数据
				{					 			
						switch(buf[i]) 
						{
							 case '0': zf_disp8(L_ye,L_lie,sz_0);L_lie=L_lie+8;   break;      
                    		 case '1': zf_disp8(L_ye,L_lie,sz_1);L_lie=L_lie+8;   break;  
                   			 case '2': zf_disp8(L_ye,L_lie,sz_2);L_lie=L_lie+8;   break; 
		            	 	 case '3': zf_disp8(L_ye,L_lie,sz_3);L_lie=L_lie+8;   break; 
                    		 case '4': zf_disp8(L_ye,L_lie,sz_4);L_lie=L_lie+8;   break;
                   			 case '5': zf_disp8(L_ye,L_lie,sz_5);L_lie=L_lie+8;   break; 
		           			 case '6': zf_disp8(L_ye,L_lie,sz_6);L_lie=L_lie+8;   break; 
                			 case '7': zf_disp8(L_ye,L_lie,sz_7);L_lie=L_lie+8;   break; 
                  			 case '8': zf_disp8(L_ye,L_lie,sz_8);L_lie=L_lie+8;   break; 
		        		     case '9': zf_disp8(L_ye,L_lie,sz_9);L_lie=L_lie+8;   break;
							 case 'a': zf_disp8(L_ye,L_lie,smalla);L_lie=L_lie+8;  break;
							 case 'b': zf_disp8(L_ye,L_lie,smallb);L_lie=L_lie+8;  break;
							 case 'c': zf_disp8(L_ye,L_lie,smallc);L_lie=L_lie+8;  break;
							 case 'd': zf_disp8(L_ye,L_lie,smalld);L_lie=L_lie+8;  break;
							 case 'e': zf_disp8(L_ye,L_lie,smalle);L_lie=L_lie+8;  break;
							 case 'f': zf_disp8(L_ye,L_lie,smallf);L_lie=L_lie+8;  break;
							 case 'g': zf_disp8(L_ye,L_lie,smallg);L_lie=L_lie+8;  break;
							 case 'h': zf_disp8(L_ye,L_lie,smallh);L_lie=L_lie+8;  break;
							 case 'i': zf_disp8(L_ye,L_lie,smalli);L_lie=L_lie+8;  break;
							 case 'j': zf_disp8(L_ye,L_lie,smallj);L_lie=L_lie+8;  break;
							 case 'k': zf_disp8(L_ye,L_lie,smallk);L_lie=L_lie+8;  break;
							 case 'l': zf_disp8(L_ye,L_lie,smalll);L_lie=L_lie+8;  break;
							 case 'm': zf_disp8(L_ye,L_lie,smallm);L_lie=L_lie+8;  break;
							 case 'n': zf_disp8(L_ye,L_lie,smalln);L_lie=L_lie+8;  break;
							 case 'o': zf_disp8(L_ye,L_lie,smallo);L_lie=L_lie+8 ; break;	
							 case 'p': zf_disp8(L_ye,L_lie,smallp);L_lie=L_lie+8 ; break;
							 case 'q': zf_disp8(L_ye,L_lie,smallq);L_lie=L_lie+8 ; break;
							 case 'r': zf_disp8(L_ye,L_lie,smallr);L_lie=L_lie+8 ; break;
							 case 's': zf_disp8(L_ye,L_lie,smalls);L_lie=L_lie+8 ; break;
							 case 't': zf_disp8(L_ye,L_lie,smallt);L_lie=L_lie+8 ; break;
							 case 'u': zf_disp8(L_ye,L_lie,smallu);L_lie=L_lie+8 ; break;
							 case 'v': zf_disp8(L_ye,L_lie,smallv);L_lie=L_lie+8 ; break;
							 case 'w': zf_disp8(L_ye,L_lie,smallw);L_lie=L_lie+8 ; break;
							 case 'x': zf_disp8(L_ye,L_lie,smallx);L_lie=L_lie+8 ; break;
							 case 'y': zf_disp8(L_ye,L_lie,smally);L_lie=L_lie+8 ; break;
							 case 'z': zf_disp8(L_ye,L_lie,smallz);L_lie=L_lie+8 ; break;			
						} 
						if(L_lie>63) 
						{
					        	L_lie = 0+16; 
								L_ye = L_ye +1 ;
								if(L_ye>7)  
								{
							     	  L_ye = 0;
									  L_lie = 16;
									  Clr_Scr();
									  zf_disp8(0,0,biga);
	                                  zf_disp8(0,8,maohao);
	                                  zf_disp8(0,64,bigb);
	                                  zf_disp8(0,72,maohao);
								}
						}	 												 
				}				 

		    	zf_disp8(L_ye,L_lie,kongge); L_lie = L_lie+8;	//一组数据传输完之后要显示一个空格 	
			}
			SM2 = 1;		// 只接收地址帧	  
		}	
	 
	}
}

⌨️ 快捷键说明

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