我寫了一個(gè)計(jì)算器的程序 但鍵盤掃描程序?qū)懲炅?燒進(jìn)實(shí)驗(yàn)板 按鍵時(shí)沒(méi)反應(yīng) 計(jì)劃寫一個(gè)兩字節(jié)的計(jì)算程序 請(qǐng)高手幫忙看看 感激不盡
#include <stdio.h> #include <AT89x051.H> #define liekey (~P0)&0X0F #define rowkey (~P0)&0XF0 sfr P0 = 0x80; sfr P2 = 0xA0; void Initial(); int Data_In(); int Comput(); bit KeyIn(void); //如果有鍵按下返回 1,健值存在 KEYdata int OP1,OP2,OP,sta;
char KeyData,Buff,Resut; char DisBuffer[8]; char KeyData=0; char KeyTab[]={0x7e,0x7d,0x7b,0x0be,0x0bd,0x0bb,0x0de,0x0dd,0x0db,0x0ee,0x77,0x0b7,0x0d7,0x0e7,0x0eb,0x0ed};//鍵盤的16個(gè)鍵 char Seg_Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x79};//數(shù)字的0~9 + - */ 對(duì)應(yīng) ASCD "E"對(duì)應(yīng)錯(cuò)誤
void main () { bit flag=0; Initial(); while (1)
{ flag=KeyIn(); if( flag) { DisBuffer[1]=KeyData; // Display();
} else { }
} }
bit KeyIn() { int i; char lie,kcode,row; //lie為列對(duì)應(yīng)的低位數(shù)據(jù)的取反 row為行對(duì)應(yīng)的高位數(shù)據(jù)取反 bit keyin=0,last,temp; lie=liekey; row=rowkey; if(lie!=0) { //若低位出現(xiàn)非0的情況則為有鍵按下 kcode=~(lie|row); //將按鍵所對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)送給kcode for(i=0;KeyTab!=kcode&&i<16;i++) KeyData=i+1; keyin=1; } last=keyin; keyin=keyin&temp; temp=~last; return keyin; } void Initial() { OP1=0; OP2=0; sta=0; TH0=0xd8; // ;定時(shí)時(shí)間為10ms TL0=0xf0; ET0=1; EA=1; TR0=1; DisBuffer[0]=0x3f; DisBuffer[1]=0x3f; DisBuffer[2]=0x3f; DisBuffer[3]=0x3f;
}
void dis (void) interrupt 1 using 2 { static char dispPost=0; TR0=0; EA=0; TH0=0xd8; TL0=0xf0; TF0=0; P2=0xff; //先熄滅數(shù)碼管 以免產(chǎn)生掃尾現(xiàn)象 P1=dispPost; P2=DisBuffer[dispPost]; dispPost++; if (dispPost>=8) dispPost=0; TR0=1; EA=1;
} |