|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
大蝦們幫小弟分析一下這個鍵盤掃描程序,不勝感激 |
| 作者:bonny95 欄目:單片機 |
各位大蝦: 小弟以自己入門級的水平編了一個自制簡易計算器的程序,硬件由Proteus仿真,顯示部分已經(jīng)證明正確無誤,但鍵盤掃描部分卻不正常,不能讀入按鍵的值,還望各位多多指教!拜謝! //頭文件:hmycal.h #define ON 0 #define OFF 1 #define DTMIN 30 //最小延遲時間 #define DTMAX 30 //最大延遲時間 #define TURE 1 #define FALSE 0 #define T 1 #define F 0 #define NUM 4 //最大操作數(shù)位數(shù) //主程序 #include<reg51.h> #include<string.h> #include"HmyCal.h" //數(shù)碼管共陰極接法,顯示列表:0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,H,P unsigned CHAR dispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x73}; //操作數(shù) unsigned int oprt1,oprt2; unsigned CHAR pos; //加、減、乘、除、等于及開關(guān)標(biāo)志位 unsigned CHAR flagPlus; unsigned CHAR flagSub; unsigned CHAR flagMul; unsigned CHAR flagDiv; unsigned CHAR flagEqu; unsigned CHAR flagPower; //函數(shù)聲明 void delay(unsigned int n); //延時子程序 void dispNum(unsigned int n); //數(shù)字顯示子程序 void dispLetter(unsigned int n); //字母顯示子程序 unsigned CHAR isKeyDown(); //檢測是否有鍵按下 unsigned CHAR getKey(); //返回鍵值 void decode(unsigned CHAR key); //鍵值解碼 void clearFlag(); //清除標(biāo)志位 unsigned CHAR testFlag(); //檢測標(biāo)志位 unsigned int op(unsigned int op1,unsigned int op2); //計算結(jié)果 void init(); //初始化 unsigned int pow(unsigned int base,unsigned int n); //冪函數(shù) void main() { unsigned int TEMP; TEMP=0; init(); while(1) { if(isKeyDown()) { decode(getKey()); if(flagPower) { if(!testFlag()) TEMP=oprt1; else TEMP=oprt2; if(flagEqu) { TEMP=op(oprt1,oprt2); oprt1=0; oprt2=0; } } else { init(); dispLetter(0); } } dispNum(TEMP); } } //延時子程序 void delay(unsigned int n) { unsigned CHAR i; for(;n>0;n--) for(i=100;i>0;i--); } //數(shù)字顯示子程序 void dispNum(unsigned int n) { unsigned CHAR i,j,seg,TEMP; unsigned int m; for(j=0;j<DTMAX;j++) { m=n; for(i=4,seg=0xEF;i>0;i--) { TEMP=m%10; m/=10; P2=seg; P0=dispTab[TEMP]; delay(DTMIN); seg<<=1; } } } //字母顯示子程序 void dispLetter(unsigned int n) { unsigned CHAR i,j,seg; for(j=0;j<DTMAX;j++) for(i=4,seg=0xEF;i>0;i--) { P2=seg; P0=dispTab[n]; delay(DTMIN); seg<<=1; } } //檢測是否有鍵按下 unsigned CHAR isKeyDown() { unsigned CHAR TEMP; P1=0xF0; TEMP=P1; if(TEMP!=0xF0)return(TURE); else return(FALSE); } //返回鍵值 unsigned CHAR getKey() { unsigned CHAR i,TEMP,nowc,nowr,pre; for(i=4,TEMP=0x10;i>0;i--) //列掃描 { pre=TEMP; P1=TEMP; nowc=P1; if(nowc==pre) &nbs |
| 2樓: | >>參與討論 |
| 作者: bonny95 于 2006/7/28 15:27:00 發(fā)布:
是我的硬件電路鍵盤部分有問題?還是軟件有錯誤? 是我的硬件電路鍵盤部分有問題?還是軟件有錯誤? |
|
| 3樓: | >>參與討論 |
| 作者: bonny95 于 2006/7/29 11:54:00 發(fā)布:
好心人幫忙啊 拜托各位了! 我實在看不出哪里有問題 |
|
| 4樓: | >>參與討論 |
| 作者: 沈老 于 2006/7/29 16:20:00 發(fā)布:
請把行掃套在列掃內(nèi) 即: for 每列 輸出F0 for 每行 讀入X0 next next |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |