計算器鍵盤按鍵顯示_第1頁
計算器鍵盤按鍵顯示_第2頁
計算器鍵盤按鍵顯示_第3頁
計算器鍵盤按鍵顯示_第4頁
計算器鍵盤按鍵顯示_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

計算器鍵盤按鍵顯示摘要為了滿足利用AT89C5112864LCD4*4AT89C5112864LCD鍵的系統。系統主要包括硬件和軟件兩部分。其中包括各模塊的器件選擇和電路AT89C51P212864LCDproteuskeil精準的顯示了按鍵信息,達到了目的。關鍵字:計算器鍵盤、液晶顯示屏、按鍵、復位、定時一、系統方案論證與選擇AT89C51AT89C51如圖1,為系統總電路模塊框圖。圖1系統總框圖系統基本方案論證就各方案的優缺點進行了方案選擇。液晶顯示電路的選擇LCD160216行字符型。但只能顯示數字與字符,不可以顯示漢字。不能顯示出題目目的的漢字字符。定時方案二:選用LCD12864液晶顯示器,12864屏幕為64行,每行顯示128個11表1控制器借口信號說明RSR/W功能說明LLMPU寫指令到IRLHBFACHLMPU寫數據到DRHHMPUDRAT89C51到了我需要顯示漢字、符號、數字的要求。控制電路的選擇方案一:選用PIC、或AVR、或凌陽SPCE061A但對于本題目而言,其優勢資源無法得以體現,且成本稍高。AT89C5AT89C51MCS-51兼容;4K字節可編程閃爍存儲器;壽命:1000寫/擦循環;數據保留時間:10年;全靜態工作:0Hz-24MHz;RAM;32I/O16/決硬件電路系統的目的。系統各模塊的最終方案經過仔細分析和論證,決定了系統各模塊的最終方案如下:LCD12864AT89C512二、系統的硬件設計與實現系統硬件的基本組成部分AT89C51POP0AT89C51P1P2LCD12864LS1P3.72,為系統總體電路圖。圖2系統總電路圖主要單元電路的設計時鐘電路AT89S5118、19(XTL1ATAL2)12MHZ47pFC1C21/12us,機31s3AT89C51XTAL1XTAL2XTAL1XTAL2因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平。圖3時鐘電路圖復位電路1K22uFAT89S52RST復位端電阻給電容充電,電容的電壓緩慢上升直到vcc,沒到vccvccVCCRST,0,RST如圖4,為復位電路截圖。4

圖4復位電路圖鍵盤電路的設計原理首先行列式鍵盤中的鍵實際上就是一個機械開關,該44Y0~Y34線交叉的某一個按鍵中。如圖5,為4*4按鍵電路圖。圖54*4按鍵電路圖三、系統軟件設計主程序流程圖6,下,如果有進行按鍵掃描,否則一直進行檢測直到按鍵按下。5圖6系統主流程圖按鍵操作子函數流程圖下,則進行數據處理、顯示處理,否則一直判斷是否有按鍵按下。如圖7,為按鍵操作流程圖。6Ke圖7按鍵操作流程圖四、系統測試測試儀器表2測試使用的儀器設備序號 名稱、型號、規格 數量 備注1 UNI-T數字萬用表 12 秒表精度0.01s 17指標測試硬件調試把各個模塊合在一起進行聯調,即可完成整個硬件調試工作。軟件調試邏輯錯誤并加以排除糾正的過程。調試過程:1、代碼錄入完成進行調試。2、在Keil uVision3中檢測查找錯誤。3、檢測過程中總是有一處錯誤無法解決。4、最后把原程序分開逐個調試,檢查每段程序的錯誤,修正每個代碼錯誤。5運行結果沒有錯誤,電路顯示也完全正確。軟硬件調試軟硬件聯調是指把調試無誤的軟件程序燒制進單片機芯片內部,通上電源功。8參考文獻范立南,謝子殿等.單片機原理及應用教程[M].北京大學出版社C北京航空航天大學出版社,2006.高等教育出版社,2003.譚浩強《C(第二版》清華大學出版社1999122005158王麗娟,徐軍,戴寶華,榮政《C西安電子科技大學出版社20036月第五版20008C100電子工業出版社2012691:程序代碼//12864LCD#include<reg51.h>#include<intrins.h>#defineucharunsigned#defineuint unsignedint//定義DotMatri.c中的點陣,數字,符號等編碼externucharcodeWord_String[][32];externucharcodeKeyboard_Chars[][16];externucharcodeKeyPosTable[];externucharKeyScan();//keypad.c中的鍵盤掃描函數//定義在LCP_12864.c中的相關液晶顯示函數externLCD_Initialize();voidDisplay_A_Char(uchar,uchar,uchar*);voidDisplay_A_WORD(uchar,uchar,uchar*);voidDisplay_A_WORD_String(uchar,uchar,uchar,uchar*);//0bitKeyPressDown=0;ucharT_Count=0;sbitSPK=P3^7;//Keybord_Chars中數字與符號編碼與鍵盤按鍵對照表ucharcodeKeyPosTable[]={7,8,9,10,4,5,6,11,1,2,3,12,15,0,14,13};//蜂鳴器發聲voidBeep(){uchari,x=20;while(x--){for(i=0;i<120;i++);SPK=~SPK;}}//主程序void{uchari;LCD_Initialize(); //LCD10for(i=0;i<7;i++) //16716*16的中文提示信息Display_A_WORD_String(1,16*(i+1),1,Word_String[i]);P1=0x0f;IE=0x83; //00IT0=1; //0掃描處理TH0=(65536-5000)/256;//50ms定時TL0=(65536-5000)%256;while(1){//if(KeyPressDown==1){Beep();KeyPressDown=0;Display_A_Char(4,55,Keyboard_Chars[KeyPosTable[KeyScan()]]);TR0=0;}}}//外部中斷0控制消抖延時voidEX0_INT()interrupt0{TR0=1;//開啟定時器0,延時300ms消抖}//定時器用于消抖并確認有鍵按下,啟動主程序中的按鍵掃描voidT0_INT()interrupt1{if(++T_Count==6) //50*6=300ms{T_Count=0;KeyPressDown=1; //確定有鍵按下}TH0=(65526-50000)/256; //50msTL0=(65526-50000)%256;}//LCD_12864.C//名稱:12864LCD顯示驅動程序(不帶字庫)//11#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineLCD_DB_PORTP0//DB0~DB7#defineLCD_START_ROW0xC0//起始行#defineLCD_PAGE0xB8//頁指令#defineLCD_COL0x40//列指令//液晶引腳定義sbitDI=P2^0;sbitRW=P2^1;sbitE=P2^2;sbitCS1=P2^3;sbitCS2=P2^4;sbitRST=P2^5;//檢查LCD是否忙bitLCD_Check_Busy(){LCD_DB_PORT=0xFF;RW=1;_nop_();DI=0;E=1;_nop_();E=0;return(bit)(P0&0X80);}//向LCD發送命令voidLCD_Write_Command(ucharc){while(LCD_Check_Busy());LCD_DB_PORT=0xFF;RW=0;_nop_();DI=0;LCD_DB_PORT=c;E=1;_nop_();E=0;}//向LCD發送數據voidLCD_Write_Data(uchard){while(LCD_Check_Busy());LCD_DB_PORT=0xFF;RW=0;_nop_();DI=1;LCD_DB_PORT=d;E=1;_nop_();E=0;}//初始化LCDvoidLCD_Initialize(){CS1=1;CS2=1;LCD_Write_Command(0x38); //8,212LCD_Write_Command(0x0F); //開顯示LCD_Write_Command(0x01); //清屏LCD_Write_Command(0x06); //畫面不動光標右LCD_Write_Command(LCD_START_ROW);//設置起始行}//通用顯示函數//從第P頁第L列開始顯示W字節數據,數據在r所指向的緩沖//每字節8位是垂直顯示的,高位在下,低位在上//每個8*128的矩形區域為一頁(每頁分左半頁與右半頁)//LCD64*6464*64voidCommon_Show(ucharP,ucharL,ucharW,uchar{uchari;if(L<64)//顯示在左半屏或右半屏{CS1=1;CS2=0;LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL+L);if(L+W<64)//全部顯示在左半屏{for(i=0;i<W;i++)LCD_Write_Data(r[i]);}else//如果越界則跨越左右半屏顯示{for(i=0;i<64-L;i++)LCD_Write_Data(r[i]);//左半屏顯CS1=0;CS2=1; //右半屏顯LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL);for(i=64-L;i<W;i++)LCD_Write_Data(r[i]);}}else//全部顯示在右半屏{CS1=0;CS2=1;LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL+L-64);for(i=0;i<W;i++)LCD_Write_Data(r[i]);}}//8*16voidDisplay_A_Uchar(ucharP,ucharL,uchar*M){Common_Show(P,L,8,M);Common_Show(P+1,L,8,M+8);13}//顯示一個16*16點陣漢字(漢字上半部分與下半部分分別處在相鄰兩頁中)voidDisplay_A_WORD(ucharP,ucharL,uchar*M){Common_Show(P,L,16,M); //顯示漢字上半部分Common_Show(P+1,L,16,M+16); //顯示漢字下半部}//顯示一串16*16點陣漢字voidDisplay_A_WORD_String(ucharP,ucharL,ucharC,uchar*M){uchari;for(i=0;i<C;i++)Display_A_WORD(P,L+i*16,M+i*32);}//DotMatrix.c//本例中相關漢字與數字的點陣編碼//#defineucharunsigned#defineuint unsignedint//中文提示(16*16點陣)ucharcodeWord_String[][32]={{0x10,0x28,0xE7,0x24,0x24,0xC2,0xB2,0x8E,0x10,0x54,0x54,0xFF,0x54,0x7C,0x10,0x00,0x01,0x01,0x7F,0x21,0x51,0x24,0x18,0x27,0x48,0x89,0x89,0xFF,0x89,0xCD,0x48,0x00},{0x20,0x20,0x20,0xFE,0x22,0x22,0xAB,0x32,0x22,0x22,0x22,0xFF,0x22,0x30,0x20,0x00,0x40,0x42,0x7D,0x44,0x44,0x7C,0x44,0x45,0x44,0x7D,0x46,0x45,0x7C,0x40,0x40,0x00}};//鍵盤數字與符號點陣(8*16ucharcodeKeyboard_Char[][16]={{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0f,0x00},{0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x60,0x01,0x00,0x00,0x00},14{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0f,0x01,0x01,0x01,0x01},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0X1F,0x01,0x01,0x01,0x00},{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},};//KeyPad.c//鍵盤掃描程序#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//掃描鍵盤時發送到0~3列上的掃描ucharKeyboardScanCode[4]={0xEF,0xDF,0xBF,0x7F};//掃描鍵盤并返回按鍵在鍵盤上的位置序號ucharKeyScan(){ucharRow=0,Col=0,Temp;EX0=0; //防抖關閉for(Col=0;Col<4;Col++) //掃描各列{P1=KeyboardScanCode[Col];//輸出掃描Temp=P1&0x0F; //讀取掃描if(Temp!=0x0F){switch(Temp) //i{case0x0E:Row=0;break;//得到對應的行號case0x0D:Row=1;break;case0x0B:Row=2;break;case0x07:Row=3;break;}break;}}P1=0x0F;EX0=1; //重新許可按鍵中斷returnRow*4+Col; //0~15}15LCD1LGM12641BS1RLCD1LGM12641BS1R12DCSSNC0I/ BBBBB

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論