- /*此函數為按鍵發送 ,同時在數碼管上顯示
- /*功能:單片機向PC發送按鍵字符,0-9 英文
- // 上下左右對錯,U,D,L,R,Y,N
- // 按一下,發送一個,不按不發送,
- // 長按一直發送
- // 數碼管上顯示0-9 ABCDEF
- //日期:2022-4-14AM
- ***********************************************/
- #include <reg52.h>
- #include "key16-2.h"
- typedef unsigned int u16;
- sbit led=P2^2;
- u8 temp,n;
- void delay(u16 n)
- {
- while(n--);
- }
- void UART_init(void)
- {
- SCON = 0x50;
- TMOD = 0x20;
- TH1 = 0xFD;
- TL1 = 0xFD;
- TR1 = 1;
- //ES = 1;
- //EA = 1;
- }
- void Uart_send(u8 dat)
- {
- SBUF = dat;
- while(!TI);
- }
- main()
- {
- UART_init();
- led=0;
- while(1)
- {
- temp=key_scan();
- if(temp!=0xff)
- {
- Uart_send(temp);
- switch (temp)
- {
- case 'Y': temp=11;break;
- case 'N': temp=10;break;
- case 'L': temp=12;break;
- case 'D': temp=13;break;
- case 'U': temp=14;break;
- case 'R': temp=15;break;
-
- }
- P0=~num[temp]; //加“~”是因為我的代碼表是共陰數碼的,而板
- delay(30000); //子上是共陽的
- }
- }
- }
復制代碼
- #ifndef _KEY16_H_
- #define _KEY16_H_
- typedef unsigned char u8;
- sbit hang1=P1^7;
- sbit hang2=P1^6;
- sbit hang3=P1^5;
- sbit hang4=P1^4;
- sbit lie1=P1^3;
- sbit lie2=P1^2;
- sbit lie3=P1^1;
- sbit lie4=P1^0;
- u8 code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
- };
- u8 key_val=0xff;
- void key_delay()
- {
- u8 x,y;
- for(x=200;x>0;x--)
- for(y=220;y>0;y--);
- }
- u8 key_scan()
- {
- hang1=0;
- hang2=1;
- hang3=1;
- hang4=1;
- if(lie1==0) //right 15
- {
- key_delay();
- if(lie1==0)
- {
- return 'R'+'\0';
- }
- while(lie1==0);
- }
- if(lie2==0) //up 14
- {
- key_delay();
- if(lie2==0)
- {
- return 'U'+'\0';
- }
- while(lie2==0);
- }
- if(lie3==0) //down 13
- {
- key_delay();
- if(lie3==0)
- {
- return 'D'+'\0';
- }
- while(lie3==0);
- }
- if(lie4==0) //left 12
- {
- key_delay();
- if(lie4==0)
- {
- return 'L'+'\0';
- }
- while(lie4==0);
- }
- hang1=1;
- hang2=0;
- hang3=1;
- hang4=1;
- if(lie1==0) //ok
- {
- key_delay();
- if(lie1==0)
- {
- return 'Y'+'\0';
- }
- while(lie1==0);
- }
- if(lie2==0) //9
- {
- key_delay();
- if(lie2==0)
- {
- return 9;
- }
- while(lie2==0);
- }
- if(lie3==0) //3
- {
- key_delay();
- if(lie3==0)
- {
- return 3;
- }
- while(lie3==0);
- }
- if(lie4==0) //6
- {
- key_delay();
- if(lie4==0)
- {
- return 6;
- }
- while(lie4==0);
- }
- hang1=1;
- hang2=1;
- hang3=0;
- hang4=1;
- if(lie1==0) //0
- {
- key_delay();
- if(lie1==0)
- {
- return 0;
- }
- while(lie1==0);
- }
- if(lie2==0) //8
- {
- key_delay();
- if(lie2==0)
- {
- return 8;
- }
- while(lie2==0);
- }
- if(lie3==0) //2
- {
- key_delay();
- if(lie3==0)
- {
- return 2;
- }
- while(lie3==0);
- }
- if(lie4==0) //5
- {
- key_delay();
- if(lie4==0)
- {
- return 5;
- }
- while(lie4==0);
- }
- hang1=1;
- hang2=1;
- hang3=1;
- hang4=0;
- if(lie1==0) //ESC
- {
- key_delay();
- if(lie1==0)
- {
- return 'N'+'\0';
- }
- while(lie1==0);
- }
- if(lie2==0) //7
- {
- key_delay();
- if(lie2==0)
- {
- return 7;
- }
- while(lie2==0);
- }
- if(lie3==0) //1
- {
- key_delay();
- if(lie3==0)
- {
- return 1;
- }
- while(lie3==0);
- }
- if(lie4==0) //4
- {
- key_delay();
- if(lie4==0)
- {
- return 4;
- }
- while(lie4==0);
- }
- return 0xff;
- }
- #endif
復制代碼
|