




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一、原理圖設(shè)計(jì)說(shuō)明 11.1數(shù)碼管硬件電路設(shè)計(jì) 11.2矩陣鍵盤(pán)電路設(shè)計(jì): 2二、程序設(shè)計(jì)說(shuō)明 32.1鍵盤(pán)掃描程序設(shè)計(jì) 32.2算術(shù)運(yùn)算程序設(shè)計(jì) 42.3顯示程序設(shè)計(jì) 5三、工作原理圖及程序流程圖 6四、程序清單 9五、參考文獻(xiàn) 15一、原理圖設(shè)計(jì)說(shuō)明1.1數(shù)碼管硬件電路設(shè)計(jì)數(shù)碼管數(shù)據(jù)顯示的硬件電路由單片機(jī)、4位共陽(yáng)極數(shù)碼管、位驅(qū)動(dòng)電路、限流電阻等組成。實(shí)驗(yàn)板中用杜邦線將P7與單片機(jī)IO口相連(這里以P0口為例)。用跳線將P8與單片機(jī)P2低四位相連,P0口送出數(shù)碼管段選碼,P2送出位選碼。圖1-1數(shù)碼管硬件電路原理圖1.2矩陣鍵盤(pán)電路設(shè)計(jì):4*4矩陣鍵盤(pán)行輸入接單片機(jī)P1.0-P1.3,列輸入接單片機(jī)P1.4-P1.7,通過(guò)掃描方式檢測(cè)是否有鍵按下,并確定鍵值,使用矩陣鍵盤(pán)時(shí)注意給P10矩陣鍵盤(pán)選擇端使能。對(duì)鍵盤(pán)進(jìn)行編號(hào),S3-S18,按下相應(yīng)按鍵,在數(shù)碼管上顯示相應(yīng)鍵值(0-F)。例如按下S10鍵,顯示A,按下S0鍵,顯示0。圖1-2矩陣鍵盤(pán)電路原理圖二、程序設(shè)計(jì)說(shuō)明2.1鍵盤(pán)掃描程序設(shè)計(jì)鍵盤(pán)掃描程序的過(guò)程為:開(kāi)始時(shí),先判斷是否有鍵閉合,無(wú)鍵閉合時(shí),返回繼續(xù)判斷,有鍵閉合時(shí),先去抖動(dòng),然后確定是否有鍵按下,若無(wú)鍵按下,則返回繼續(xù)判斷是否有鍵閉合,若有鍵按下,則判斷鍵號(hào),然后釋放,若釋放按鍵完畢,則返回,若沒(méi)有釋放按鍵,則返回繼續(xù)釋放。其流程圖如圖2-1所示。圖2-1鍵盤(pán)掃描程序流程圖2.2算術(shù)運(yùn)算程序設(shè)計(jì)算術(shù)運(yùn)算程序的過(guò)程為:先判斷輸入的運(yùn)算符是+、-、*、/中的哪一個(gè),若是+或-,則要判斷運(yùn)算結(jié)果是否溢出,溢出則顯示錯(cuò)誤信息,沒(méi)溢出就顯示運(yùn)算結(jié)果,若是/,則要先判斷除數(shù)是否為零,為零就顯示錯(cuò)誤信息,不為零則顯示運(yùn)算結(jié)果,若是-,則直接顯示運(yùn)算結(jié)果。其流程圖如圖2.2所示。圖2-2算術(shù)運(yùn)算程序設(shè)計(jì)流程圖2.3顯示程序設(shè)計(jì)先是程序的過(guò)程為:顯示開(kāi)始時(shí),先進(jìn)行LED的初始化,判斷是否顯示,若不顯示,則返回,若顯示,則進(jìn)行相應(yīng)功能的設(shè)置,然后送地址和數(shù)據(jù),再判斷是否顯示完,顯示完則返回,沒(méi)有顯示完則繼續(xù)送地址。圖2-3顯示程序流程圖三、工作原理圖及程序流程圖圖3-1仿真工作原理電路圖圖3-2系統(tǒng)組成及總體框圖圖3-3-1PCB原理圖圖3-3-2PCB原理圖圖3-3-33D效果圖圖3-4程序流程圖四、程序清單mian.c://簡(jiǎn)單的數(shù)碼管顯示按鍵編碼0到9#include<reg52.h>typedefunsignedcharuint8;uint8num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共陰極數(shù)碼管uint8s[4]={0,10,10,10};uint8T0RH=0;//重載初值uint8T0RL=0;//重載初值uint8step=0;//步驟標(biāo)號(hào)uint8oprt=0;//運(yùn)算符標(biāo)志longnum1=0;//運(yùn)算數(shù)1longnum2=0;//運(yùn)算數(shù)2longnum3=0;//結(jié)果voidInit_times(uint8ms);externvoid KeyDriver();//定義鍵盤(pán)驅(qū)動(dòng)externvoid KeyScan();//定義鍵盤(pán)掃描voidmain(){ EA=1;//中斷總允許位 Init_times(1);//配置T0定時(shí)1ms while(1) { KeyDriver(); //調(diào)用鍵盤(pán)驅(qū)動(dòng) } }voidInit_times(uint8ms)//配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間{unsignedlongtmp;tmp=11059200/12;//定時(shí)器計(jì)數(shù)頻率tmp=(tmp*ms)/1000;//計(jì)算所需的計(jì)數(shù)值tmp=65536-tmp;//計(jì)算定時(shí)器重載值tmp=tmp+12;//修正中斷響應(yīng)延時(shí)造成的誤差T0RH=(unsignedchar)(tmp>>8);//取高八位T0RL=(unsignedchar)tmp;//取第八位TMOD&=0xF0;//定義計(jì)時(shí)器工作狀態(tài)TMOD|=0x01;TH0=T0RH;//初始值TH0(變量帶入)TL0=T0RL;//初始值TL0ET0=1;//中斷允許TR0=1;}//啟動(dòng)計(jì)時(shí)器/*數(shù)碼管動(dòng)態(tài)掃描函數(shù)*/voidfun(){ staticuint8i; switch(i)//數(shù)碼管的位選和段選 { case0:P2=0xfe;P0=num[s[0]];break; case1:P2=0xfd;P0=num[s[1]];break; case2:P2=0xfb;P0=num[s[2]];break; case3:P2=0xf7;P0=num[s[3]];break; } i++; i&=0x03;}/*T0中斷服務(wù)函數(shù),執(zhí)行按鍵掃描*/voidtime0()interrupt1{ TH0=T0RH; TL0=T0RL; KeyScan(); fun();}/*把數(shù)值的各個(gè)位分別存儲(chǔ)在數(shù)組是s[4]中*/voidfuzhi(longn){ uint8i=0; if(n<0)//小于零為負(fù)數(shù) { s[3]=11; n=-n; } else { s[3]=10; } do{ s[i++]=n%10; n/=10; }while(n!=0); while(i<=2) { s[i++]=10; }}/*復(fù)位*/voidReset(){ num1=0; num2=0; step=0; fuzhi(0);}/*讀取運(yùn)算數(shù)*/voidNumKeyAction(uint8n){ if(step>1){ Reset(); } if(step==0){ num1=num1*10+n; fuzhi(num1); } elseif(step==1){ num2=num2*10+n; fuzhi(num2); }}/*讀取運(yùn)算符*/voidOprtKeyAction(uint8n)//用于判斷按鍵加、減、乘、除{ if(step==0){ fuzhi(0); s[0]=10; step=1; oprt=n; } } /*做運(yùn)算*/voidGetResult()//加、減、乘、除函數(shù)運(yùn)算{ if(step==1){ switch(oprt){ case0:num3=num1+num2;break; case1:num3=num1-num2;break; case2:num3=num1*num2;break; case3:num3=num1/num2;break; default:break; } fuzhi(num3); step=2; } }key.c:鍵盤(pán)按鍵程序#include<reg52.h>typedefunsignedcharuint8;sbitkeyout_1=P1^4;//定義鍵盤(pán)按鍵sbitkeyout_2=P1^5;sbitkeyout_3=P1^6;sbitkeyout_4=P1^7;sbitkeyin_1=P1^0;sbitkeyin_2=P1^1;sbitkeyin_3=P1^2;sbitkeyin_4=P1^3;externvoidReset();externvoid GetResult();externvoid NumKeyAction(uint8dat);externvoid OprtKeyAction(uint8dat);externuint8num[];uint8keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};//全部矩陣鍵盤(pán)的當(dāng)前狀態(tài)uint8keycode[4][4]={{'7','8','9','+'},//矩陣按鍵編號(hào)到標(biāo)準(zhǔn)鍵盤(pán)鍵碼的映射表 {'4','5','6','-'}, {'1','2','3','*'}, {0x11,'0','=','/'}};voidKeyAction(uint8dat)//用于判斷按鍵運(yùn)算法則{ if((dat>='0')&&(dat<='9')){//判斷按下鍵是否為數(shù)值 NumKeyAction(dat-'0'); } elseif(dat=='+'){ OprtKeyAction(0);//加法 } elseif(dat=='-'){ OprtKeyAction(1);//減法 } elseif(dat=='*'){ OprtKeyAction(2);//乘法 } elseif(dat=='/'){ OprtKeyAction(3);//除法 } elseif(dat=='='){ GetResult();//等于 } elseif(dat==0x11){//清零 Reset(); }}/*按鍵驅(qū)動(dòng)函數(shù),檢測(cè)按鍵動(dòng)作,調(diào)度相應(yīng)動(dòng)作函數(shù),需在主循環(huán)中調(diào)用*/voidKeyDriver()/{uint8i,j;staticuint8backup[4][4]={{1,1,1,1},{1,1,1,1},//按鍵值備份,保存前一次的值 {1,1,1,1},{1,1,1,1}}; for(i=0;i<4;i++)//循環(huán)檢測(cè)4*4的矩陣按鍵 for(j=0;j<4;j++) if(keysta[i][j]!=backup[i][j]){//檢測(cè)按鍵動(dòng)作 if(backup[i][j]!=0) //按鍵按下時(shí)執(zhí)行動(dòng)作 KeyAction(keycode[i][j]); //調(diào)用按鍵動(dòng)作函數(shù) backup[i][j]=keysta[i][j]; //刷新前一次的備份值 } }/*按鍵掃描函數(shù),需在定時(shí)中斷中調(diào)用,調(diào)用間隔1ms*/voidKeyScan(){ uint8i; staticuint8keyout=0; //矩陣按鍵掃描輸出索引 staticuint8keybuf[4][4]={ //矩陣按鍵掃描緩沖區(qū) {0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}, {0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};keybuf[keyout][0]=(keybuf[keyout][0]<<1)|keyin_1;//將一行的4個(gè)按鍵值移入緩沖區(qū) keybuf[keyout][1]=(keybuf[keyout][1]<<1)|keyin_2; keybuf[keyout][2]=(keybuf[keyout][2]<<1)|keyin_3; keybuf[keyout][3]=(keybuf[keyout][3]<<1)|keyin_4;//消抖后更新按鍵狀態(tài) for(i=0;i<4;i++){//每行4個(gè)按鍵,所以循環(huán)4次 if(keybuf[keyout][i]==0x00){ //連續(xù)4次掃描值為0,即4*4ms內(nèi)都是按下?tīng)顟B(tài)時(shí),可認(rèn)為按鍵已穩(wěn)定的按下 keysta[keyout][i]=0; } elseif(keybuf[keyout][i]==0x
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026屆安徽淮北市中考聯(lián)考數(shù)學(xué)試題含解析
- 2025年河南省平頂山市郟縣小升初數(shù)學(xué)試卷
- 山西省臨汾市2026屆中考語(yǔ)文對(duì)點(diǎn)突破模擬試卷含解析
- 2026屆江蘇省常州市鐘樓區(qū)二十四中學(xué)中考一模語(yǔ)文試題含解析
- 2026屆陜西省漢中學(xué)市南鄭區(qū)紅廟鎮(zhèn)初級(jí)中學(xué)中考物理全真模擬試卷含解析
- 二零二五年度服裝行業(yè)品牌授權(quán)經(jīng)營(yíng)合同
- 二零二五年度市政道路施工勞務(wù)分包合同參考范本
- 二零二五年度房地產(chǎn)財(cái)務(wù)顧問(wèn)項(xiàng)目執(zhí)行協(xié)議
- 2025版高速鐵路站房包工包料建設(shè)合同
- 二零二五年家電產(chǎn)品檢測(cè)與認(rèn)證服務(wù)合同樣本
- 2025貴州畢節(jié)市七星關(guān)區(qū)招聘城市社區(qū)工作者186人筆試備考題庫(kù)及答案解析
- 幼兒園幼小銜接漢語(yǔ)拼音拼讀練習(xí)15套
- 小學(xué)科學(xué)實(shí)驗(yàn)教學(xué)策略與案例分享
- 基于項(xiàng)目反應(yīng)理論的生物統(tǒng)計(jì)學(xué)課程教學(xué)質(zhì)量評(píng)價(jià)
- 2025年天翼云高級(jí)運(yùn)維工程師認(rèn)證參考試題庫(kù)(含答案)
- 光伏安全施工方案范本
- 住院患者靜脈血栓的預(yù)防及護(hù)理
- 醫(yī)療保險(xiǎn)基金管理?xiàng)l例
- 會(huì)展行業(yè)策劃與執(zhí)行作業(yè)指導(dǎo)書(shū)
- 中醫(yī)治療胃腸道疾病
- 2024年國(guó)家電網(wǎng)公司電力安全工作規(guī)程題庫(kù)及答案(共196題)
評(píng)論
0/150
提交評(píng)論