|
大神們真心請教,搞不明白,,按健按了,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;
- }
復制代碼
|
|