版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Main.c/*- 名稱:液晶顯示計算器 編寫:人言者 日期:2013.5 內(nèi)容:由于單片機浮點數(shù)限制,可以計算6位數(shù)字運算,大于這個長度,用科學計數(shù)法表示 小數(shù)位精度后6位,大于6位按四舍五入-*/#include<reg52.h> /包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義#include<stdio.h>#include"1602.h"#include"delay.h"#include"keyboard.h"#include"mimasuo.h"#define u
2、char unsigned charvoid calculate(void);sbit SPK=P23;unsigned char num,i,sign; unsigned char s;/通用循環(huán)變量bit firstflag;/輸入為第一個數(shù)據(jù)還是第二個數(shù)據(jù)的標志float a=0,b=0;/輸入的數(shù)據(jù)緩沖器及運算的中間變量void Timer0_Init()TH0=(65536-7000)/256;TL0=(65536-7000)%256;EA=0;TR0=1;ET0=1; /*- 主程序-*/main() LCD_Init(); /初始化液晶屏 Timer0_Init(); Delay
3、Ms(10); /延時用于穩(wěn)定,可以去掉 LCD_Write_String_Move(0,0,"Welcome use Chu Zhe Rong Calculator "); /寫入第一行信息,主循環(huán)中不再更改此信息,所以在while之前寫入 for(s=0;s<30;s+) DelayMs(250); /0.5S向右移動一格,結(jié)合for語句共延時5s LCD_Write_Com(0x18);/左平移畫面 0x1C 是右平移 /*/ LCD_Clear(); /清屏 mimasuo();/密碼鎖程序 while (1) /主循環(huán) num=KeyPro(); /掃描鍵盤
4、 if(num!=0xff) /如果掃描是按鍵有效值則進行處理calculate(); void calculate(void) unsigned char temp16; /最大輸入16個if(i=0) LCD_Clear(); /輸入是第一個字符的時候需要把液晶屏清空,方便觀看 if('+'=num)| (i=16) | ('-'=num) | ('x'=num)| ('/'=num) | ('='=num)/輸入數(shù)字最大值16,輸入符號表示輸入結(jié)束 i=0; /計數(shù)器復位,記一次性輸入的數(shù)據(jù)個數(shù),液晶一行只能
5、顯示16個,所以i<=16 if(firstflag=0) /如果是輸入的第一個數(shù)據(jù),賦值給a,并把標志位置1,到下一個數(shù)據(jù)輸入時可以跳轉(zhuǎn)賦值給b sscanf(temp,"%f",&a); firstflag=1; else sscanf(temp,"%f",&b);for(s=0;s<16;s+) /賦值完成后把緩沖區(qū)清零,防止下次輸入影響結(jié)果temps=0; LCD_Write_Char(0,1,num); /if(num!='=') /判斷當前符號位并做相應(yīng)處理 sign=num; /如果不是等號記下標
6、志位else firstflag=0; switch(sign) /檢測到輸入=號,判斷上次讀入的符合 case '+':a=a+b;break;case '-':a=a-b;break;case 'x':a=a*b; break;case '/':a=a/b;break;default:break; sprintf(temp,"%g",a); /輸出浮點型,無用的0不輸出 LCD_Write_String(1,1,temp);/顯示到液晶屏 sign=0;a=b=0; /用完后所有數(shù)據(jù)清零 for(s=0;s
7、<16;s+) temps=0; else if(i<16) if(1=i)&& (temp0='0') )/如果第一個字符是0,判讀第二個字符 if(num='.') /如果是小數(shù)點則正常輸入,光標位置加1 temp1='.'LCD_Write_Char(1,0,num);/輸出數(shù)據(jù)i+; /這里沒有判斷連續(xù)按小數(shù)點,如0.0.0 else temp0=num; /如果是1-9數(shù)字,說明0沒有用,則直接替換第一位0 LCD_Write_Char(0,0,num);/輸出數(shù)據(jù) else tempi=num; LCD_W
8、rite_Char(i,0,num);/輸出數(shù)據(jù) i+; /輸入數(shù)值累加 void Timer0() interrupt 1TH0=(65536-7001)/256;TL0=(65536-7001)%256;SPK=!SPK;keyboard.h#ifndef _MIMASUO_H_#define _MIMASUO_H_void mimasuo(void);void password_Right();void password_Wrong();#endifkeyboard.c/包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義#include<reg52.h> #inc
9、lude"keyboard.h"#include"delay.h"#define KeyPort P3sbit SPK=P23;/*-按鍵掃描函數(shù),返回掃描鍵值-*/unsigned char KeyScan(void) /鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 unsigned char cord_h,cord_l;/行列值中間變量 unsigned char i; KeyPort=0x0f; /行線輸出全為0 cord_h=KeyPort&0x0f; /讀入列線值 if(cord_h!=0x0f) /先檢測有無按鍵按下 DelayMs(10); /
10、去抖 if(KeyPort&0x0f)!=0x0f) cord_h=KeyPort&0x0f; /讀入列線值 KeyPort=cord_h|0xf0; /輸出當前列線值 cord_l=KeyPort&0xf0; /讀入行線值for(i=0;i<171;i+) /按鍵使蜂鳴器發(fā)聲 / DelayUs2x(200); / DelayUs2x(200); / SPK=!SPK; /810us電平取反,頻率越大聲音越尖 while(KeyPort&0xf0)!=0xf0);/等待松開并輸出 return(cord_h+cord_l);/鍵盤最后組合碼值 retur
11、n(0xff); /返回該值/*- 按鍵值處理函數(shù),返回掃鍵值 可以根據(jù)需要改變返回值 | 1 | 2 | 3 | + | | 4 | 5 | 6 | - | | 7 | 8 | 9 | * | | . | 0 | = | / | -*/unsigned char KeyPro(void) switch(KeyScan() case 0x7e:return '+'break;/0 按下相應(yīng)的鍵顯示相對應(yīng)的碼值 case 0x7d:return '-'break;/1 case 0x7b:return 'x'break;/2 case 0x77:r
12、eturn '/'break;/3 case 0xbe:return '3'break;/4 case 0xbd:return '6'break;/5 case 0xbb:return '9'break;/6 case 0xb7:return '='break;/7 case 0xde:return '2'break;/8 case 0xdd:return '5'break;/9 case 0xdb:return '8'break;/a case 0xd7:retur
13、n '0'break;/b case 0xee:return '1'break;/c case 0xed:return '4'break;/d case 0xeb:return '7'break;/e case 0xe7:return '.'break;/f default:return 0xff;break; delay.h#ifndef _DELAY_H_#define _DELAY_H_/*- uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變
14、量,其值的范圍是 0255 這里使用晶振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t);/*- mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12M,精確延時請使用匯編-*/void DelayMs(unsigned char t);#endifdelay.c#include "delay.h"/*- uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 un
15、signed char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*- mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12M,精確延時請使用匯編-*/void DelayMs(unsigned char t) while(t-) /大致延時1mS DelayUs2x(245); DelayUs2x(245);
16、1602.h/*- 名稱:LCD1602.h 日期:2009.5 引腳定義如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK-*/#include<reg52.h> /包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義#include<intrins.h>#ifndef _1602_H_ #define _1602_H_ bit LCD_Check_Busy(void) ; void LCD_Write_Com(unsigned char com) ; void LCD_Write_Da
17、ta(unsigned char Data) ; void LCD_Clear(void) ; void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; void LCD_Init(void) ; void LCD_Write_String_Move(unsigned char x,unsigned char y,unsigned char *s) ; #en
18、dif1602.c/*- 引腳定義如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK-*/#include "1602.h"#include "delay.h"#define CHECK_BUSYsbit RS = P20; /液晶定義端口 sbit RW = P21; /sbit EN = P22; /sbit RS = P24; /定義端口 /sbit RW = P25;/sbit EN = P26;#define RS_CLR RS=0 #define RS_SET RS=1#
19、define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*- 判忙函數(shù)- bit LCD_Check_Busy(void) #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80);#else return 0;#endif */*- 寫入命令函數(shù)-*/ void LCD_Write_Com(unsi
20、gned char com) / while(LCD_Check_Busy(); /忙則等待 DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 寫入數(shù)據(jù)函數(shù)-*/ void LCD_Write_Data(unsigned char Data) /while(LCD_Check_Busy(); /忙則等待 DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函數(shù)-*/ void LCD_Clear(void
21、) LCD_Write_Com(0x01); DelayMs(5); /*- 靜態(tài)顯示字符串函數(shù)-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) while (*s) LCD_Write_Char(x,y,*s); s +; x+; /*- 移動顯示字符串函數(shù)-*/ void LCD_Write_String_Move(unsigned char x,unsigned char y,unsigned char *s) /字符串的起始位置 ,字符串的行0為第一行1為第二行,放字符串 if (y
22、= 0) LCD_Write_Com(0x80 + x); /表示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 寫入字符函數(shù)-*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函數(shù)-*/ vo
23、id LCD_Init(void) LCD_Write_Com(0x38); /*顯示模式設(shè)置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*顯示關(guān)閉*/ LCD_Write_Com(0x01); /*顯示清屏*/ LCD_Write_Com(0x06); /*顯示光標移動設(shè)置*/ DelayMs(5); LCD_Write_Com(0x0C); /*顯示開及光標設(shè)置*/ mimasuo.h#i
24、fndef _MIMASUO_H_#define _MIMASUO_H_void mimasuo(void);void password_Right();void password_Wrong();#endifmimasuo.c/包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義#include<stdio.h>#include"1602.h"#include"delay.h"#include"keyboard.h"#include "mimasuo.h"unsigned char temp
25、17;/用于存放動態(tài)顯示的字符串 bit Flag=0; /密碼是否正確標志位 unsigned char inputtimes,sen=3,j;/密碼輸入錯誤次數(shù),剩余次數(shù),通用循環(huán)變量unsigned char time; /倒計時時間變量void mimasuo(void) unsigned char num,i=0;/鍵盤掃描的返回值,計算輸入次數(shù),普通循環(huán)變量,剩余輸入次數(shù),字符指針, unsigned char passwordtemp16; /最大輸入16個, unsigned char passwordlength,PLEN; /輸入密碼長度,實際密碼長度 unsigned c
26、har code password='1','2','3','4'/可以更改此密碼做多組測試 /定義密碼,實際上密碼需要存在eeprom中,可以通過程序更改。 PLEN=sizeof(password)/sizeof(password0);/用于計算出實際密碼長度 LCD_Clear(); LCD_Write_String(0,0,"Input Password:"); /寫入第二行信息,提示輸入密碼 LCD_Write_String(0,1,"Finished By '='"
27、;); num=0xff; while(num=0xff) num=KeyPro(); /循環(huán)掃描鍵盤,直到按鍵有效_mima LCD_Write_String(0,1," ");/用16個空格來模擬表示清除第二行 for(;Flag!=1;) num=KeyPro(); /掃描鍵盤_mima_ if(num!=0xff) /如果掃描是按鍵有效值則進行處理 if(i<16) passwordtempi=num; LCD_Write_Char(i,1,'*');/輸入的密碼用"*"代替i+; /輸入次數(shù)值累加if('='
28、;=num)|(i=16)/輸入按鍵'='或者密碼輸入到最大值16,表示輸入結(jié)束,需要進行比對 passwordlength=i-1; /計算輸入密碼長度,除去等號占有的一位 i=0; /計數(shù)器復位 if(passwordlength=PLEN)/長度相等則比較,否則直接輸出錯誤 Flag=1;/先把比較位置1 for(j=0;j<PLEN;j+)/循環(huán)比較8個數(shù)值,如果有一個不等 則最終Flag值為0 Flag=Flag&&(passwordtempj=passwordj);/比較輸入值和已有密碼,如果比較全部相同,標志位置1 if(Flag) password_Right(); /密碼正確,進入打開界面 break; /跳出for大循環(huán) else password_Wrong(); /密碼錯誤,提示重新輸入 void password_Right()unsigned char a=0;unsigned char code *p="Opening!>>>>>>>>"EA=1;LCD_Clear(); /清屏/LCD_Write_String(0,0,"Password Right!");/密碼正確顯示的信息DelayMs(250
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信陽涉外職業(yè)技術(shù)學院《高級生物化學1》2023-2024學年第一學期期末試卷
- 信陽航空職業(yè)學院《版式與書籍設(shè)計》2023-2024學年第一學期期末試卷
- 2024年個人貸款擔保合同范本
- 2024年度房屋買賣合同借款擔保條款變更及執(zhí)行通知3篇
- 2024圓通快遞物流解決方案及收費標準合同3篇
- 配電箱購銷合同的交貨期限3篇
- 車輛修護合同3篇
- 轉(zhuǎn)讓劇本著作權(quán)合同3篇
- 酒店客房經(jīng)理勞動合同3篇
- 電力供應(yīng)行業(yè)勞動合同模板2篇
- GB/T 45089-20240~3歲嬰幼兒居家照護服務(wù)規(guī)范
- 政府還款協(xié)議書(2篇)
- 院內(nèi)獲得性肺炎護理
- 居家養(yǎng)老服務(wù)報價明細表
- MOOC 研究生學術(shù)規(guī)范與學術(shù)誠信-南京大學 中國大學慕課答案
- 24春國家開放大學《離散數(shù)學》大作業(yè)參考答案
- 浙江大學實驗報告(流體力學)
- 2023年大學生《思想道德與法治》考試題庫附答案(712題)
- 2023年華南理工大學自然辯證法期末考試真題回憶版帶參考答案
- 防護設(shè)備操作手冊
- 學前教育-幼兒園環(huán)境創(chuàng)設(shè)對幼兒創(chuàng)造力和審美性影響研究
評論
0/150
提交評論