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);//整屏不移动,光标自动右移 |