资源描述
#include<stc12c5a.h>
#define uchar unsigned char
#define uint unsigned int
sbit c=P1^0;
sbit d=P1^1;
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
void delay(int z)
{
int x,y;
for(x=0;x<z;x++)
for(y=0;y<10;y++);
}
void ledxierushuju(char shuju)
{
RS=1;
RW=0;
P0=shuju;
delay(1);
E=1;
delay(1);
E=0;
}
void ledxiezhiling(uchar zhiling)
{
RS=0;
RW=0;
P0=zhiling;
delay(1);
E=1;
delay(1);
E=0;
}
void ledchushihua()
{
E=0;
ledxiezhiling(0x38);
ledxiezhiling(0x0c);
ledxiezhiling(0x06);
ledxiezhiling(0x01);
}
void xiezhiling(uchar zhiling)//鼠标写指令函数
{
uchar x;
int i;
int a;
x=zhiling;
while(c==0||d==0);
d=0;
while(c==1);
for(i=1;i<12;i++)
{
a=x%2;
d=a;
while(c==0);
while(c==1);
x=x/2;
}
c=1;
d=1;
delay(1);
}
uchar dushuju()//鼠标读数据函数
{
uchar x=0;
int i;
int a;
int m=0;
while(d==0);
// 时钟是由键盘给的,不需要单片机提供
//P0=0xfe;
for(i=0;i<11;i++)
{
//P0=0xaa;
if(i==1)
m=1;
else
m=m*2;
while(c!=0);
//P0=0xaa;
while(c!=1);
//P0=0xaa;
if(i<9)
{
a=d;
x=x+a*m;
}
}
c=1;
d=1;
delay(1);
return x;
}
void shujuxianshi(uchar shuju,uint x,uint y,uint i)
{
if(x>0)
x--;
if(i==1)
return;
switch(y)
{
case 0:
switch(shuju)
{
case 0x70:ledxiezhiling(0x80+x);//0
ledxierushuju(0x30);
break;
case 0x69:ledxiezhiling(0x80+x);//1
ledxierushuju(0x31);
break;
case 0x72:ledxiezhiling(0x80+x);//2
ledxierushuju(0x32);
break;
case 0x7a:ledxiezhiling(0x80+x);//3
ledxierushuju(0x33);
break;
case 0x6b:ledxiezhiling(0x80+x);//4
ledxierushuju(0x34);
break;
case 0x73:ledxiezhiling(0x80+x);//5
ledxierushuju(0x35);
break;
case 0x74:ledxiezhiling(0x80+x);//6
ledxierushuju(0x36);
break;
case 0x6c:ledxiezhiling(0x80+x);//7
ledxierushuju(0x37);
break;
case 0x75:ledxiezhiling(0x80+x);//8
ledxierushuju(0x38);
break;
case 0x7d:ledxiezhiling(0x80+x);//9
ledxierushuju(0x39);
break;
case 0x77:ledxiezhiling(0x80+x);//numlock
ledxierushuju(0xff);
break;
//case 0x7f:ledxiezhiling(0x80);// /
//ledxierushuju(0x2f);
//break;
case 0x7c:ledxiezhiling(0x80+x);//*
ledxierushuju(0xff);
break;
case 0x7b:ledxiezhiling(0x80+x);//-
ledxierushuju(0x2d);
break;
case 0x79:ledxiezhiling(0x80+x);//+
ledxierushuju(0x2b);
break;
case 0x15:ledxiezhiling(0x80+x);//Q
ledxierushuju(0x51);
break;
case 0x1d:ledxiezhiling(0x80+x);//W
ledxierushuju(0x57);
break;
case 0x24:ledxiezhiling(0x80+x);//E
ledxierushuju(0x45);
break;
case 0x2d:ledxiezhiling(0x80+x);//R
ledxierushuju(0x52);
break;
case 0x2c:ledxiezhiling(0x80+x);//T
ledxierushuju(0x54);
break;
case 0x35:ledxiezhiling(0x80+x);//Y
ledxierushuju(0x59);
break;
case 0x3c:ledxiezhiling(0x80+x);//U
ledxierushuju(0x55);
break;
case 0x43:ledxiezhiling(0x80+x);//I
ledxierushuju(0x49);
break;
case 0x44:ledxiezhiling(0x80+x);//O
ledxierushuju(0x4f);
break;
case 0x4d:ledxiezhiling(0x80+x);//P
ledxierushuju(0x50);
break;
case 0x54:ledxiezhiling(0x80+x);//[
ledxierushuju(0x5b);
break;
case 0x5b:ledxiezhiling(0x80+x);// ]
ledxierushuju(0x5d);
break;
//case 0x5a:ledxiezhiling(0x80+x);// enter
//ledxierushuju(0xff);
//break;
case 0x52:ledxiezhiling(0x80+x);// '
ledxierushuju(0x27);
break;
case 0x4c:ledxiezhiling(0x80+x);//;
ledxierushuju(0x3b);
break;
case 0x4b:ledxiezhiling(0x80+x);//L
ledxierushuju(0x4c);
break;
case 0x42:ledxiezhiling(0x80+x);//K
ledxierushuju(0x4b);
break;
case 0x3b:ledxiezhiling(0x80+x);//J
ledxierushuju(0x4a);
break;
case 0x33:ledxiezhiling(0x80+x);//H
ledxierushuju(0x48);
break;
case 0x34:ledxiezhiling(0x80+x);//G
ledxierushuju(0x47);
break;
case 0x2b:ledxiezhiling(0x80+x);//F
ledxierushuju(0x46);
break;
case 0x23:ledxiezhiling(0x80+x);//D
ledxierushuju(0x44);
break;
case 0x1b:ledxiezhiling(0x80+x);//S
ledxierushuju(0x53);
break;
case 0x1c:ledxiezhiling(0x80+x);//A
ledxierushuju(0x41);
break;
case 0x1a:ledxiezhiling(0x80+x);//Z
ledxierushuju(0x5a);
break;
case 0x22:ledxiezhiling(0x80+x);//X
ledxierushuju(0x58);
break;
case 0x21:ledxiezhiling(0x80+x);// C
ledxierushuju(0x43);
break;
case 0x2a:ledxiezhiling(0x80+x);//V
ledxierushuju(0x56);
break;
case 0x32:ledxiezhiling(0x80+x);//B
ledxierushuju(0x42);
break;
case 0x31:ledxiezhiling(0x80+x);//N
ledxierushuju(0x4e);
break;
case 0x3a:ledxiezhiling(0x80+x);//M
ledxierushuju(0x4d);
break;
case 0x41:ledxiezhiling(0x80+x);//,
ledxierushuju(0x2c);
break;
case 0x49:ledxiezhiling(0x80+x);//.
ledxierushuju(0x2e);
break;
case 0x4a:ledxiezhiling(0x80+x);// /
ledxierushuju(0x2f);
break;
//case 0x59:ledxiezhiling(0x80+x);//SHIFT
//ledxierushuju(0x34);
//break;
default:ledxiezhiling(0x80+x);
ledxierushuju(0xff);
break;
}
break;
case 1:
switch(shuju)
{
case 0x70:ledxiezhiling(0xc0+x);//0
ledxierushuju(0x30);
break;
case 0x69:ledxiezhiling(0xc0+x);//1
ledxierushuju(0x31);
break;
case 0x72:ledxiezhiling(0xc0+x);//2
ledxierushuju(0x32);
break;
case 0x7a:ledxiezhiling(0xc0+x);//3
ledxierushuju(0x33);
break;
case 0x6b:ledxiezhiling(0xc0+x);//4
ledxierushuju(0x34);
break;
case 0x73:ledxiezhiling(0xc0+x);//5
ledxierushuju(0x35);
break;
case 0x74:ledxiezhiling(0xc0+x);//6
ledxierushuju(0x36);
break;
case 0x6c:ledxiezhiling(0xc0+x);//7
ledxierushuju(0x37);
break;
case 0x75:ledxiezhiling(0xc0+x);//8
ledxierushuju(0x38);
break;
case 0x7d:ledxiezhiling(0xc0+x);//9
ledxierushuju(0x39);
break;
case 0x77:ledxiezhiling(0xc0+x);//numlock
ledxierushuju(0xff);
break;
//case 0x7f:ledxiezhiling(0xc0);// /
//ledxierushuju(0x2f);
//break;
case 0x7c:ledxiezhiling(0xc0+x);//*
ledxierushuju(0xff);
break;
case 0x7b:ledxiezhiling(0xc0+x);//-
ledxierushuju(0x2d);
break;
case 0x79:ledxiezhiling(0xc0+x);//+
ledxierushuju(0x2b);
break;
case 0x15:ledxiezhiling(0xc0+x);//Q
ledxierushuju(0x51);
break;
case 0x1d:ledxiezhiling(0xc0+x);//W
ledxierushuju(0x57);
break;
case 0x24:ledxiezhiling(0xc0+x);//E
ledxierushuju(0x45);
break;
case 0x2d:ledxiezhiling(0xc0+x);//R
ledxierushuju(0x52);
break;
case 0x2c:ledxiezhiling(0xc0+x);//T
ledxierushuju(0x54);
break;
case 0x35:ledxiezhiling(0xc0+x);//Y
ledxierushuju(0x59);
break;
case 0x3c:ledxiezhiling(0xc0+x);//U
ledxierushuju(0x55);
break;
case 0x43:ledxiezhiling(0xc0+x);//I
ledxierushuju(0x49);
break;
case 0x44:ledxiezhiling(0xc0+x);//O
ledxierushuju(0x4f);
break;
case 0x4d:ledxiezhiling(0xc0+x);//P
ledxierushuju(0x50);
break;
case 0x54:ledxiezhiling(0xc0+x);//[
ledxierushuju(0x5b);
break;
case 0x5b:ledxiezhiling(0xc0+x);// ]
ledxierushuju(0x5d);
break;
//case 0x5a:ledxiezhiling(0xc0+x);// enter
//ledxierushuju(0xff);
//break;
case 0x52:ledxiezhiling(0xc0+x);// '
ledxierushuju(0x27);
break;
case 0x4c:ledxiezhiling(0xc0+x);//;
ledxierushuju(0x3b);
break;
case 0x4b:ledxiezhiling(0xc0+x);//L
ledxierushuju(0x4c);
break;
case 0x42:ledxiezhiling(0xc0+x);//K
ledxierushuju(0x4b);
break;
case 0x3b:ledxiezhiling(0xc0+x);//J
ledxierushuju(0x4a);
break;
case 0x33:ledxiezhiling(0xc0+x);//H
ledxierushuju(0x48);
break;
case 0x34:ledxiezhiling(0xc0+x);//G
ledxierushuju(0x47);
break;
case 0x2b:ledxiezhiling(0xc0+x);//F
ledxierushuju(0x46);
break;
case 0x23:ledxiezhiling(0xc0+x);//D
ledxierushuju(0x44);
break;
case 0x1b:ledxiezhiling(0xc0+x);//S
ledxierushuju(0x53);
break;
case 0x1c:ledxiezhiling(0xc0+x);//A
ledxierushuju(0x41);
break;
case 0x1a:ledxiezhiling(0xc0+x);//Z
ledxierushuju(0x5a);
break;
case 0x22:ledxiezhiling(0xc0+x);//X
ledxierushuju(0x58);
break;
case 0x21:ledxiezhiling(0xc0+x);// C
ledxierushuju(0x43);
break;
case 0x2a:ledxiezhiling(0xc0+x);//V
ledxierushuju(0x56);
break;
case 0x32:ledxiezhiling(0xc0+x);//B
ledxierushuju(0x42);
break;
case 0x31:ledxiezhiling(0xc0+x);//N
ledxierushuju(0x4e);
break;
case 0x3a:ledxiezhiling(0xc0+x);//M
ledxierushuju(0xcd);
break;
case 0x41:ledxiezhiling(0xc0+x);//,
ledxierushuju(0x2c);
break;
case 0x49:ledxiezhiling(0xc0+x);//.
ledxierushuju(0x2e);
break;
case 0x4a:ledxiezhiling(0xc0+x);// /
ledxierushuju(0x2f);
break;
//case 0x59:ledxiezhiling(0xc0+x);//SHIFT
//ledxierushuju(0x34);
//break;
default:ledxiezhiling(0xc0+x);
ledxierushuju(0xff);
break;
}
break;
}
}
void clare(uint x,uint y)//led清除函数(不知道什么原因不能直接使用清屏指令)
{
if(y==0)
{
ledxiezhiling(0x80+x);
ledxierushuju(0x20);
ledxiezhiling(0x80+x+1);
ledxierushuju(0x20);
}
else
{
ledxiezhiling(0xc0+x);
ledxierushuju(0x20);
ledxiezhiling(0xc0+x+1);
ledxierushuju(0x20);
}
}
void main()
{
uchar sj1,sj2;
uint x,y,i;
ledchushihua();
i=0;
x=0;
y=0;
P0=0x00;
delay(100);
P0=0xff;
xiezhiling(0xf4);
sj1=dushuju();
if(sj1==0xf8)
{
P0=0xfe;
delay(100);
P0=0xff;
}
//ledxiezhiling(0x83);
//ledxierushuju(0x52);
while(1)
{
if(sj1==0x66&&x>0)
{
x--;
clare(x,y);
}
else
x++;
sj1=dushuju();
if(sj1==0xf0)
sj1=dushuju();
sj2=dushuju();
if(sj2!=0xf0)
if(i==1)
{
ledxiezhiling(0x01);
i=0;
}
if(sj1==0x5a)
{
y=1;
x=0;
}
if(x>=16&&y==1)
{
x=0;
i=1;
y=0;
}
if(x>16)
{
x=0;
y=1;
}
shujuxianshi(sj1,x,y,i);
delay(10000);
}
}
展开阅读全文