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

📄 手写板.c

📁 Keil C 编程的手写板
💻 C
📖 第 1 页 / 共 2 页
字号:
		Read_Keypad(&temp1,&temp2);
		Read_Keypad(&x,&y);
		if((temp1==x)&&(temp2==y))
		{	
			
			if(flag&MASK1)
			{
				//之前有触摸
				//加入命令处理
				//#pragma ASM
				//x=0x015f;
				//y=0x03ef;
				temp3=x;
				temp=temp3<<10;		//* 2的10次方,左移10位
				temp|=(y&0x03ff);
				temp=temp<<8;
				temp|=0xa0000050;	//笔迹+力度
				ptr1=&temp;
				putchar(*ptr1);
				ptr1++;
				putchar(*ptr1);
				ptr1++;
				putchar(*ptr1);
				ptr1++;
				putchar(*ptr1);
				//drawPoint(x,y);
				//#pragma ENDASM
				
			}
			else
			{
				//之前无触摸
				flag|=MASK1;		//置触摸位
				//加入命令处理
				temp=x<<10;		//* 2的10次方,左移10位
				temp|=(y&0x03ff);
				temp=temp<<8;
				temp|=0xb0000050;	//下笔+力度
				ptr1=&temp;
				putchar(*ptr1);
				ptr1++;
				putchar(*ptr1);
				ptr1++;
				putchar(*ptr1);
				ptr1++;
				putchar(*ptr1);
			}
			
			drawPoint(x,y);
			//arrive2here();
			//GotoXY(0,0);
			//PrintStr("十",30000);
		}
	}
	else
	{
		if(flag&MASK1)
		{
			//之前有触摸
			//加入提笔命令
			flag&=~(MASK1);		//清触摸位

			putchar(0xc0);
			putchar(0x00);
			putchar(0x00);
			putchar(0x00);
		}
		else
		{
			//之前无触摸
			//return;
			delay(10000);	
			
		}
		 
	}
}
//=============================================================================//
void InitRS232(void)
{
	istart=0;
	iend=0;
	ostart=0;
	oend=0;
	sendactive=0;			//发送器未激活
	sendfull=0;
	
	PCON=PCON|0x80;			//加速位
	TMOD=0X21;			//定时器方式2,常数自动装入的8位定时器
	//TH1=0XF3;			//波特率9600@24MHZ
	TH1=(unsigned char)(256-(XTAL/(16L*12L* baudrate)));
	//TCON=0X40;			//启动计时数1
	TR1=1;				//启动计时数1
	SCON=0X50;			//允许接收,方式2,接收到即置位
	//IE=0X90;		//允许串行口中断
	ES=1;				//允许串行口中断
}
//=============================================================================//
void serial(void) interrupt 4 
{
	char c;
	//arrive2here();
	if(RI)
	{
		c=SBUF;			//读字符
		RI=0;			//清0中断请求标志
		if(istart+ILEN!=iend)
		{
			inbuf[iend++&(ILEN-1)]=c;		//字符送入缓冲区
		}
	}
	if(TI)
	{
		TI=0;					//清零中断请求标志
		if(ostart!=oend)			//IF 字符在缓冲区
		{
			SBUF=outbuf[ostart++&(OLEN-1)];	//发送字符
			sendfull=0;			//清零SENDFULL标志
		}
		else
		{
			sendactive=0;			//若所有字符已发送则清零SENDACTIVE标志
		}
	}
	
}
	

//=============================================================================//
void putbuf(char c)
{
	if(!sendfull)
	{
		if(!sendactive)
		{
			sendactive=1;
			SBUF=c;
		}
		else
		{
			ES=0;
			outbuf[oend++&(OLEN-1)]=c;
			if(((oend^ostart)&(OLEN-1))==0)
			{
				sendfull=1;
			}
			ES=1;
		}
	}
}
//=============================================================================//
/*替换标准库函数putchar程序*/
/*printf函数使用putchar输出一个字符*/
char putchar(char c)
{
	while(sendfull);
	putbuf(c);
	return(c);
}
/*替换标准库函数_getkey程序*/
/*getchar 和 gets 函数使用_getkey 来读字符*/
char _getkey(void)
{
	char c;
	while(iend==istart);
	ES=0;
	c=inbuf[istart++&(ILEN-1)];
	ES=1;
	return(c);
}


//=============================================================================//
void rs232_mouse(void)
{
	//unsigned char control=0;
	unsigned char ismotion=1;
	
	TMOD=0x21;
	TH0=0x8a;
	TL0=0xd0;
	TR0=1;
	sensor_reset();
	senddata[0]=0x00;
	while(1)
	{
		
		
			
			senddata[1]=0x00;
			senddata[2]=0x00;
			while(1)
			{
				//putchar('a');
				if(TF0)
				{
					
					TF0=0;
					TH0=0xb0;
					TL0=0xd0;
					
					ismotion=read_move(senddata);
					
					if(ismotion == 1)
					{
						
						putchar(0xF0);
						putchar(senddata[0]);		
						putchar(senddata[1]);		//x
						putchar(senddata[2]);		//y
						putchar(0x00);			//z
						//putchar('a');
						//putchar('b');
						//putchar('c');
						
					}
					break;
				}
			}
			
		
	}
}

//name:sensor_reset()
void sensor_reset(void)
{
	SPD=1;
	SCLK=0;
	delayM(3);
	SCLK=1;
	SPD=0;
}


//batdelay
void batdelayM(void)
{
	unsigned char i=200;
	while(--i)
		delayM(200);
}


//name:sensor_init
void sensor_init(void)
{
	SPD=1;
	delayM(20);
	SPD=0;
}



//name:read_move
//function: read sensor's value ,move or not ,if move read x,y value and return moved
//in: *senddata
//out: a signed
unsigned char read_move(unsigned char *senddata)
{
	unsigned char temp;
	unsigned char temp1;
	lenght=3;
	temp=read_sensor(2);		//读取sensor的mode
	temp1=temp;
//判断有没有移动
	if(temp & 0x80)
	{
		//delay(10);
		senddata[1]=read_sensor(3);			//有移动,继续读取x轴,y轴的偏移量
		//delay(10);
		senddata[2]=read_sensor(4);			
		temp <<=3;							//将溢出位写在senddata[0]相应的位
		temp &=0xc0;						
		senddata[0] &=0x3f;
		senddata[0] |=temp;
		if(senddata[1] & 0x80)				//判断x移动正负,并置senddata[0]响应的位
		{
			senddata[0] |=0x10;
	 	}
	 	else
	 	{
	 		senddata[0] &=0xef;
	 	}
		if(senddata[2] & 0x80)				//判断y移动正负,并置senddata[0]响应的位
		{
			senddata[0] |=0x20;
	 	}
	 	else
	 	{
	 		senddata[0] &=0xdf;
	 	}
	}
//没有移动则清相应的变量	
	else
	{
		//read_sensor(3);
		//read_sensor(4);
		//senddata[0] &=0x02;
		//senddata[1]=0;
		//senddata[2]=0;
	 }

	pdcount--;
	if(pdcount == 0)
	{
		pdcount=600;
		sensor_init();
	 }
//判断有没有按键
	 if((temp1 & 0x80)| read_button())
	{
		return	1;		//有移动或按键返回1
	}
	else
	{
		return	0;		//没有返回0
	}
}



//name:read_button
//function: read button,if changed or not
//in: *senddata
//out: a signed
unsigned char read_button(unsigned char *senddata)
{
	unsigned char buffer;
	P0=0XFF;
	buffer=P0;
	if((senddata[0] &  0x07)^(buffer & 0X07))		//有移动则返回1,否返回0
   	 {
		senddata[0] &=0xf8;
		senddata[0] |=buffer & 7;
		return 0x80;
	 }
	 return 0;
}



//name:read_sensor
//function:read an address' data from sensor
//int: address
//out:data
unsigned char read_sensor(unsigned char address)
{
	unsigned char temp2=0;
	unsigned char temp1=0x80;
	while(temp1 != 0)		//发送sensor的地址,上升沿sensor读取值,下降沿mcu改变值
	{
		SCLK=0;
		if(temp1 & address)
		{
			SDIO=1;
		}
		else
		{
			SDIO=0;
		}
		temp1 >>= 1;
		delayM(2);
		SCLK=1;
		delayM(2);
	}
	delayM(1);
	temp1=0x80;
	delayM(4);
	SDIO=1;
	while(temp1 != 0)				//mcu接收sensor相应地址的值
	{							//sensor在下降沿改变数据
		SCLK=0;					//mcu在上升沿读取,存于temp并返回
		delayM(6);
		SCLK=1;
		delayM(5);
		if(SDIO==1)
		{
		temp2|=temp1;
		}
		temp1 >>=1;
		
		delayM(2);
		//SDIO=1;
    	}
	//SCLK=0;
	//delayM(2);
	//SCLK=1;
	//sensor_init();
	LCD_CmdWrite(0x00,0xCD); 
	GotoXY(6,80);
	putHEX2(temp2);
	return temp2;
}

void delayM(signed char count)
{
	while(--count);				//延迟时间为(2+count)us
}
//=============================================================================//
//=============================================================================//
//=============================================================================//
//=============================================================================//
		

⌨️ 快捷键说明

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