📄 手写板.c
字号:
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 + -