|
- #include<reg51.h>
- //P0.0-P0.2
- unsigned char leddata[]={
-
- 0xC0, //"0"
- 0xF9, //"1"
- 0xA4, //"2"
- 0xB0, //"3"
- 0x99, //"4"
- 0x92, //"5"
- 0x82, //"6"
- 0xF8, //"7"
- 0x80, //"8"
- 0x90, //"9"
- 0x88, //"A"
- 0x83, //"B"
- 0xC6, //"C"
- 0xA1, //"D"
- 0x86, //"E"
- 0x8E, //"F"
- 0x89, //"H"
- 0xC7, //"L"
- 0xC8, //"n"
- 0xC1, //"u"
- 0x8C, //"P"
- 0xA3, //"o"
- 0xBF, //"-"
- 0xFF, //熄灭
- 0xFF //自定义
-
- };
- unsigned char key;
- void delay(unsigned char x)
- {
- unsigned char i;
- while(x--)
- for(i=0;i<115;i++);
- }
- void keyscan()
- {
- //------先扫描直接接地的3个按键-----//
- P0|=0X07; //先将IO拉高
- if(P0&0X01==0){
- delay(15);
- key=7;
- return;
- }
- else if(P0&0x02==0){
- delay(15);
- key=8;
- return;
- }
- else if(P0&0x04==0){
- delay(15);
- key=9;
- return;
- }
-
- //------接着对逐一对IO口进行扫键-----//
- P0|=0X07; //先将IO拉高,很重要
- P0&=0XFE; //P0.0置0
- if((P0&0X02)==0){
- delay(15);
- if((P0&0X02)==0){
- P0|=0X07; //对地的按键优先级高,这里是为了防止误判
- if((P0&0X07)==0X07)
- key=1;
- else
- key=8;
- return;
- }
- }
- else if((P0&0X04)==0){
- delay(15);
- if((P0&0X04)==0){
- P0|=0X07;
- if((P0&0X07)==0X07)
- key=2;
- else
- key=9;
- return;
- }
- }
- P0|=0X07;//先将IO拉高,很重要
- P0&=0XFD;
- if((P0&0X01)==0){
- delay(15);
- if((P0&0X01)==0){
- P0|=0X07;
- if((P0&0X07)==0X07)
- key=3;
- else
- key=7;
- return;
- }
- }
- else if((P0&0X04)==0){
- delay(15);
- if((P0&0X04)==0){
- P0|=0X07;
- if((P0&0X07)==0X07)
- key=4;
- else
- key=9;
- return;
- }
- }
- P0|=0X07; //先将IO拉高,很重要
- P0&=0XFB;
- if((P0&0X01)==0){
- delay(15);
- if((P0&0X01)==0){
- P0|=0X07;
- if((P0&0X07)==0X07)
- key=5;
- else
- key=7;
- return;
- }
- }
- else if((P0&0X02)==0){
- delay(15);
- if((P0&0X02)==0){
- P0|=0X07;
- if((P0&0X07)==0X07)
- key=6;
- else
- key=8;
- return;
- }
- }
- }
- void main()
- {
- while(1){
- keyscan();
- P3=leddata[key];
- }
- }
复制代码
|
|