|
大神们真心请教,搞不明白,,按健按了,1或2或3,在把这数值发给电脑串口,,串口接收显示的是01 00或 01 00,为什么呀,他发了几次?
- #include <reg51.h>
- #define led P2
- #define shumaguan P0
- #define anjian P1
- sbit ls138A= P2^2;
- sbit ls138B= P2^3;
- sbit ls138C= P2^4;
- unsigned char b ;biaozhi; c;
- void chuankou()
- {
- SCON=0X50; //设置为工作方式1
- TMOD=0X20; //设置计数器工作方式2
- PCON=0X80; //波特率加倍
- TH1=0XF3; //计数器初始值设置,注意波特率是4800的
- TL1=0XF3;
- ES=1; //打开接收中断
- EA=1; //打开总中断
- TR1=1;
- }
- unsigned char code shuzu[]={ 0x3f ,0x06 , 0x5b , 0x4f , 0x66,
- 0x6d ,0x7d , 0x07 , 0x7f , 0x6f } ;// 0--8数字
- void ls138shuju()
- {
- ls138A= 0;
- ls138B= 0;
- ls138C= 0;
- }
- void yanshi (unsigned int u)
- {
- while(u--) ;
- }
- void shuzihanshu()
- {
- unsigned char v ;
-
- ls138shuju();
- /************* 扫描最右侧一例*************/
- anjian=0XFE; //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
- v=anjian; // anjian赋于V
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- yanshi (200);
- v=anjian; //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- switch(v)
- {
- case 0X70 : b=4; shumaguan=shuzu[b]; break ;
- case 0XB0 : b=8; shumaguan=shuzu[b]; break ;
- }
- }
- while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
- {
- v=anjian; //再次把anjian实际状态值给V
- v=v&0XF0; // v=v&0XF0;取出高4位,如按健弹起高4位为1111
- }
- yanshi (200); // whil`(v!=0XF0), v等于0XF0条件为假退出循环
- }
- /************* 扫描最右侧第二例*************/
- anjian=0XFD; //把1111 1101赋于按键,高4位与低4位组成纵横矩阵
- v=anjian; // anjian赋于V
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- yanshi (200);
- v=anjian; //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- switch(v)
- {
- case 0X70 : b=3; shumaguan=shuzu[b]; break ;
- case 0XB0 : b=7; shumaguan=shuzu[b]; break ;
- }
- }
- while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
- {
- v=anjian; //再次把anjian实际状态值给V
- v=v&0XF0; // v=v&0XF0;取出高4位,如按健弹起高4位为1111
- } // while(v!=0XF0), v等于0XF0条件为假退出循环
- yanshi (200);
- }
- /************* 扫描最右侧第三例*************/
- anjian=0XFB; //把1111 1101赋于按键,高4位与低4位组成纵横矩阵
- v=anjian; // anjian赋于V
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- yanshi (100);
- v=anjian; //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- switch(v)
- {
- case 0X70 : b=2; shumaguan=shuzu[b]; break ;
- case 0XB0 : b=6; shumaguan=shuzu[b]; break ;
- }
- }
- while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
- {
- v=anjian; //再次把anjian实际状态值给V
- v=v&0XF0; // v=v&0XF0;取出高4位,如按健弹起高4位为1111
- } // while(v!=0XF0), v等于0XF0条件为假退出循环
- yanshi (100);
-
- }
- /************* 扫描最右侧第四例*************/
- anjian=0XF7; //把1111 1101赋于按键,高4位与低4位组成纵横矩阵
- v=anjian; // anjian赋于V
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- yanshi (100);
- v=anjian; //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
- v=v&0XF0; //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
- if(v!=0XF0) //有按键按下高4位不等于1111会进入if
- {
- switch(v)
- {
- case 0X70 : b=1; shumaguan=shuzu[b];break ;
- case 0XB0 : b=5; shumaguan=shuzu[b]; break ;
- }
-
- }
- while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
- {
- v=anjian; //再次把anjian实际状态值给V
- v=v&0XF0; // v=v&0XF0;取出高4位,如按健弹起高4位为1111
- } // while(v!=0XF0), v等于0XF0条件为假退出循环
- yanshi (100);
- }
- }
- void main()
- {
- shumaguan=shuzu[0];
- while(1)
- {
- chuankou();
- shuzihanshu();
- switch(b)
- {
- case (1) : led=0X63;SBUF=b;while(!TI);TI=0; b=0;break ; //按健值 发送给电脑串口
- case (2) : led=0XA3;SBUF=b;while(!TI);TI=0; b=0;break ;
- case (3) : led=0XC3;SBUF=b;while(!TI);TI=0; b=0;break ;
- case (4) : led=0XE2;SBUF=b;while(!TI);TI=0; b=0;break ;
- case (5) : led=0XE1;SBUF=b;while(!TI);TI=0; b=0;break ;
- }
- if(biaozhi==1)
- {
- SBUF=c;while(!TI);TI=0; // 单片机接收电脑发来的值再返回给电脑串口,
- biaozhi=0;
- }
- }
- }
- void RX() interrupt 4
- {
- RI=0;
- c=SBUF; //单片机接收电脑发来的值,
- biaozhi=1;
- }
复制代码
|
|