|
hhdsdy 發(fā)表于 2020-9-8 22:47
一般是程序問題,對比度調(diào)了嗎?把程序發(fā)出來看看
#include <REG52.h>#include<intrins.h>//宏定義#define LCM_Data P0 //將P0口定義為LCM_Data#define uchar unsigned char #define uint unsigned int#define w 6 //定義密碼位數(shù)//1602的控制腳sbit lcd1602_rs=P2^5;sbit lcd1602_rw=P2^6;sbit lcd1602_en=P2^7;sbit Scl=P3^4; //24C02串行時鐘sbit Sda=P3^5; //24C02串行數(shù)據(jù)sbit ALAM = P2^1; //報警 //sbit KEY = P3^6; //開鎖sbit led = P2^0; //燈bit operation=0; //操作標(biāo)志位bit pass=0; //密碼正確標(biāo)志bit ReInputEn=0; //重置輸入允許標(biāo)志 bit s3_keydown=0; //3秒按鍵標(biāo)志位bit key_disable=0; //鎖定鍵盤標(biāo)志bit flag_REC =0; //串口接受標(biāo)志位unsigned char buff[5]=0;unsigned char countt0,second; //t0中斷計數(shù)器,秒計數(shù)器void Delay5Ms(void); //聲明延時函數(shù)unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盤掃描控制表//液晶顯示數(shù)據(jù)數(shù)組unsigned char code start_line[] = {"password: "};unsigned char code name[] = { "===Coded Lock==="}; //顯示名稱unsigned char code Correct[] = {" correct "}; //輸入正確unsigned char code Error[] = {" error "}; //輸入錯誤unsigned char code codepass[] = {" pass "}; unsigned char code LockOpen[] = {" open "}; //OPENunsigned char code SetNew[] = {"SetNewWordEnable"};unsigned char code Input[] = {"input: "}; //INPUTunsigned char code ResetOK[] = {"ResetPasswordOK "};unsigned char code initword[] = {"Init password..."};unsigned char code Er_try[] = {"error,try again!"};unsigned char code again[] = {"input again "};unsigned char InputData[16]; //輸入密碼暫存區(qū)unsigned char CurrentPassword[16]={1,3,1,4,2,0}; //管理員密碼(只可在程序中修改)unsigned char TempPassword[16];unsigned char N=0,M=0,flag=0; //密碼輸入位數(shù)記數(shù)unsigned char ErrorCont; //錯誤次數(shù)計數(shù)unsigned char CorrectCont; //正確輸入計數(shù)unsigned char ReInputCont; //重新輸入計數(shù)unsigned char code initpassword[16]={0,0,0,0,0,0}; //輸入管理員密碼后將密碼初始為000000unsigned char MM[2]={0,0};//=====================5ms延時==============================void Delay5Ms(void){ unsigned int TempCyc = 5552; while(TempCyc--);}//===================400ms延時==============================void Delay400Ms(void){ unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }}//=============================================================================================//================================24C02========================================================//=============================================================================================void mDelay(uint t) //延時{ uchar i; while(t--) { for(i=0;i<125;i++) {;} }} void Nop(void) //空操作{ _nop_(); //僅作延時用一條語句大約1us _nop_(); _nop_(); _nop_();}/*****24c02程序參照24c02時序圖*****//*起始條件*/void Start(void){ Sda=1; Scl=1; Nop(); Sda=0; Nop();} /*停止條件*/void Stop(void){ Sda=0; Scl=1; Nop(); Sda=1; Nop();}/*應(yīng)答位*/void Ack(void){ Sda=0; Nop(); Scl=1; Nop(); Scl=0;}/*反向應(yīng)答位*/void NoAck(void){ Sda=1; Nop(); Scl=1; Nop(); Scl=0;} /*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/void Send(uchar Data){ uchar BitCounter=8; uchar temp; do { temp=Data; //將待發(fā)送數(shù)據(jù)暫存temp Scl=0; Nop(); if((temp&0x08)==0x08) //將讀到的數(shù)據(jù)&0x80 Sda=1; else Sda=0; Scl=1; temp=Data<<1; //數(shù)據(jù)左移 Data=temp; //數(shù)據(jù)左移后重新賦值Data BitCounter--; //該變量減到0時,數(shù)據(jù)也就傳送完成了 } while(BitCounter); //判斷是否傳送完成 Scl=0;}/*讀一字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/uchar Read(void){ uchar temp=0; uchar temp1=0; uchar BitCounter=8; Sda=1; do { Scl=0; Nop(); Scl=1; Nop(); if(Sda) //數(shù)據(jù)位是否為1 temp=temp|0x11; //為1 temp的最低位為1(|0x01,就是將最低位變?yōu)?) else //如果為0 temp=temp&0xfe; //temp最低位為0(&0xfe(11111110)最低位就是0) if(BitCounter-1) //BitCounter減1后是否為真 { temp1=temp<<1; //temp左移 temp=temp1; } BitCounter--; //BitCounter減到0時,數(shù)據(jù)就接收完了 } while(BitCounter); //判斷是否接收完成 return(temp);}void WrToROM(uchar Data[],uchar Num,uchar Address){ uchar i; uchar *PData; PData=Data; for(i=0;i<Num;i++) { Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Send(*(PData+i)); Ack(); Stop(); mDelay(20); }}void RdFromROM(uchar Data[],uchar Num,uchar Address){ uchar i; uchar *PData; PData=Data; for(i=0;i<Num;i++) { Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Start(); Send(0xa1); Ack(); *(PData+i)=Read(); Scl=0; NoAck(); Stop(); }}//==================================================================================================//=======================================LCD1602=#define yi 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)#define er 0x80+40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)//----------------延時函數(shù),后面經(jīng)常調(diào)用----------------------void delay(uint xms)//延時函數(shù),有參函數(shù){ uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);}//--------------------------寫指令---------------------------void write_1602com(uchar com)//****液晶寫入指令函數(shù)****{ lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為指令 lcd1602_rw=1; //讀寫選擇置為寫 P0=com;//送入數(shù)據(jù) delay(1); lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備 delay(1); lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令}//-------------------------寫數(shù)據(jù)-----------------------------void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****{ lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為數(shù)據(jù) lcd1602_rw=1; //讀寫選擇置為寫 P0=dat;//送入數(shù)據(jù) delay(1); lcd1602_en=1; //en置高電平,為制造下降沿做準(zhǔn)備 delay(1); lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令}//-------------------------初始化-------------------------void lcd_init(void){ write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù) write_1602com(0x0c);//開顯示不顯示光標(biāo) write_1602com(0x01);//清顯示 write_1602com(0x06);//整屏不移動,光標(biāo)自動右移 |
|