#include //包含文件 #define uchar unsigned char #define uint unsigned int char b[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6, 0xa1,0x86,0x8e,0x8c,0xc1,0xce,0x91,0x89,0xc7,0xff}; // 共陰極字符碼 //延時函數(shù),用于實現(xiàn)程序中的短暫延時,表示延時cnt個毫秒 void delay(unsigned int cnt) { unsigned char i; while(cnt--) { for(i=220;i>0;i--) ; } } //鍵盤掃描程序 uchar keyboardscan(void) { uchar sccode,recode; P1=0xf0; //P1口附初值 if((P1&0xf0)!=0xf0)//如果P1口電平不等于0xf0,表示有按鍵按下 { delay(20); //延時20毫秒后再判斷,看是否還有按鍵按下,次步為軟件防抖 if((P1&0xf0)!=0xf0)//繼續(xù)判斷是否有按鍵按下 { sccode=0xfe; //進行逐行判斷 while((sccode&0x10)!=0) { P1=sccode; if((P1&0xf0)!=0xf0) { recode=(P1&0xf0|0x0f); switch((~sccode)+(~recode)) { // 下面是鍵盤的編碼識別 case 0x11: return(1); break; case 0x21: return(2); break; case 0x41: return(3); break; case 0x81: return(11); break;//返回對應的鍵值0~15 case 0x12: return(4); break; case 0x22: return(5); break; case 0x42: return(6); break; case 0x82: return(12); break; case 0x14: return(7); break; case 0x24: return(8); break; case 0x44: return(9); break; case 0x84: return(13); break; case 0x18: return(10); break; case 0x28: return(15); break; case 0x48: return(16); break; case 0x88: return(14); break; default:break; } } else sccode = (sccode<<1)|0x01; } } } return(0xff); //如果沒有按鍵按下,則返回0xff } void output(uchar number) { P0=b[number/10]; P2=b[number%10]; } int yunsuan(uchar a,uchar b,uchar c) { switch(c) { case 1:return(a/b);break; case 2:return(a*b);break; case 3:return(a-b);break; case 4:return(a+b);break; } } void main(void) //主函數(shù) { unsigned char n1,n2,key,index,a; n1=n2=index=0; P0=P2=b[0]; while(1) { key = keyboardscan();//鍵盤掃描,看是否有按鍵按下 if(key != 0xff)//如果有按鍵按下,則key不再是0xff了,顯示該按鍵鍵值 { if(key<10) { if(!index) n1=key%10; else n2=key%10; output(key%10); } else if(key==15) { n1=n2=index=0; output(0); } else if(key==16) { if(!index) output(n1); else { a=yunsuan(n1,n2,index); a=a%100; output(a); n1=a; n2=index=0; } } else { if(index==0||n2==0) index=key-10; else { a=yunsuan(n1,n2,index); a=a%100; output(a); n1=a; n2=0; index=key-10; } } } } }
評論