hhdsdy 發表于 2020-9-8 22:47
一般是程序問題,對比度調了嗎?把程序發出來看看
#include <REG52.h>#include<intrins.h>//宏定義#define LCM_Data P0 //將P0口定義為LCM_Data#define uchar unsigned char #define uint unsigned int#define w 6 //定義密碼位數//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串行數據sbit ALAM = P2^1; //報警 //sbit KEY = P3^6; //開鎖sbit led = P2^0; //燈bit operation=0; //操作標志位bit pass=0; //密碼正確標志bit ReInputEn=0; //重置輸入允許標志 bit s3_keydown=0; //3秒按鍵標志位bit key_disable=0; //鎖定鍵盤標志bit flag_REC =0; //串口接受標志位unsigned char buff[5]=0;unsigned char countt0,second; //t0中斷計數器,秒計數器void Delay5Ms(void); //聲明延時函數unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盤掃描控制表//液晶顯示數據數組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]; //輸入密碼暫存區unsigned char CurrentPassword[16]={1,3,1,4,2,0}; //管理員密碼(只可在程序中修改)unsigned char TempPassword[16];unsigned char N=0,M=0,flag=0; //密碼輸入位數記數unsigned char ErrorCont; //錯誤次數計數unsigned char CorrectCont; //正確輸入計數unsigned char ReInputCont; //重新輸入計數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();}/*應答位*/void Ack(void){ Sda=0; Nop(); Scl=1; Nop(); Scl=0;}/*反向應答位*/void NoAck(void){ Sda=1; Nop(); Scl=1; Nop(); Scl=0;} /*發送數據子程序,Data為要求發送的數據*/void Send(uchar Data){ uchar BitCounter=8; uchar temp; do { temp=Data; //將待發送數據暫存temp Scl=0; Nop(); if((temp&0x08)==0x08) //將讀到的數據&0x80 Sda=1; else Sda=0; Scl=1; temp=Data<<1; //數據左移 Data=temp; //數據左移后重新賦值Data BitCounter--; //該變量減到0時,數據也就傳送完成了 } while(BitCounter); //判斷是否傳送完成 Scl=0;}/*讀一字節的數據,并返回該字節值*/uchar Read(void){ uchar temp=0; uchar temp1=0; uchar BitCounter=8; Sda=1; do { Scl=0; Nop(); Scl=1; Nop(); if(Sda) //數據位是否為1 temp=temp|0x11; //為1 temp的最低位為1(|0x01,就是將最低位變為1) else //如果為0 temp=temp&0xfe; //temp最低位為0(&0xfe(11111110)最低位就是0) if(BitCounter-1) //BitCounter減1后是否為真 { temp1=temp<<1; //temp左移 temp=temp1; } BitCounter--; //BitCounter減到0時,數據就接收完了 } 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)//----------------延時函數,后面經常調用----------------------void delay(uint xms)//延時函數,有參函數{ uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);}//--------------------------寫指令---------------------------void write_1602com(uchar com)//****液晶寫入指令函數****{ lcd1602_rs=1;//數據/指令選擇置為指令 lcd1602_rw=1; //讀寫選擇置為寫 P0=com;//送入數據 delay(1); lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準備 delay(1); lcd1602_en=0;//en由高變低,產生下降沿,液晶執行命令}//-------------------------寫數據-----------------------------void write_1602dat(uchar dat)//***液晶寫入數據函數****{ lcd1602_rs=0;//數據/指令選擇置為數據 lcd1602_rw=1; //讀寫選擇置為寫 P0=dat;//送入數據 delay(1); lcd1602_en=1; //en置高電平,為制造下降沿做準備 delay(1); lcd1602_en=0; //en由高變低,產生下降沿,液晶執行命令}//-------------------------初始化-------------------------void lcd_init(void){ write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據 write_1602com(0x0c);//開顯示不顯示光標 write_1602com(0x01);//清顯示 write_1602com(0x06);//整屏不移動,光標自動右移 |