為什么我的lcd1602一直是兩排白塊,老師說我的是程序有問題但是我不會改有沒有大佬幫忙看看。因為我是在網上找的別人51的程序,改成15的。老師說我的延時函數有問題但是我自己改了一下因為不知道原來是延時多久我也不會改。有沒有大佬幫忙看看為什么我的lcd1602一直是兩排白板
#include "stc15.h"
#include <intrins.h>
#define uchar unsigned char
#define unit unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit key0=P1^0;//功能鍵
sbit key1=P1^1;//光標的移動
sbit key2=P1^2;//加
sbit key3=P1^3;//減
sbit buz=P2^7;//蜂鳴器
sbit in1=P1^4;
sbit in2=P1^6;
sbit led=P3^7;//led
sbit hood=P1^7;
unsigned char count=0;
unsigned int hour=0,min=0,sec=0;
unsigned int alarm_h=0,alarm_m=0;
unsigned char str_sw0[]={"off"};
unsigned char str_sw1[]={"on"};
unsigned char str[]={"0123456789"};
unsigned int readtemp=0;
unsigned char a[]={"alarm:"};
unsigned int w=-1,pattern=0,sw=0;
unsigned int i=0;
unsigned char s[]={"T:"};
void delay();
void beep();
void delay(unsigned int t);
void writecom(unsigned char com);
void writedat(unsigned char dat);
void initlcd();
void display_time();
void display_alarm();
void inittimer();
void function();
void main();
void delayms(unsigned int q)//延時函數
{
unsigned int w=0,e=0,k=1;
k=10*q;
for(w=0;w<k;w++)
{
for(e=0;e<120;e++);
}
}
void delay(unsigned int t)//延時函數
{
unsigned int i=0,j=0;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}
//************************LCD1602************************//
void writecom(unsigned char com)//寫命令
{
RS=0;
RW=0;
E=0;
P0=com;
delayms(2);
E=1;
E=0;
}
void writedat(unsigned char dat)//寫數據
{
RS=1;
RW=0;
E=0;
P0=dat;
delayms(2);
E=1;
E=0;
}
void initlcd() // lcd1602初始化
{
writecom(0x38);//設置16*2顯示,5*7點陣,8位數據接口
writecom(0x0c);//設置開顯示,不顯示光標
writecom(0x06);//寫一個字符后地址指針加1
writecom(0x01);//顯示清0,數據指針清0
}
void display_time()//時間顯示
{
unsigned char temp0=0,temp1=0,temp2=0,temp3=0,temp4=0,temp5=0;
temp0=hour/10;//拆分個位十位
temp1=hour%10;
temp2=min/10;
temp3=min%10;
temp4=sec/10;
temp5=sec%10;
writecom(0x80+0x40);//第二行顯示
delay(2);
writedat(str[temp0]);//顯示時分秒
delay(2);
writedat(str[temp1]);
delay(2);
writedat(':');
delay(2);
writedat(str[temp2]);
delay(2);
writedat(str[temp3]);
delay(2);
writedat(':');
delay(2);
writedat(str[temp4]);
delay(2);
writedat(str[temp5]);
delay(2);
}
void display_alarm()//鬧鐘顯示
{
unsigned char temp0=0,temp1=0,temp2=0,temp3=0,i=0,j=0;
writecom(0x80);
delay(2);
temp0=alarm_h/10;//拆分個位十位
temp1=alarm_h%10;
temp2=alarm_m/10;
temp3=alarm_m%10;
while(a[i]!='\0')
{
writedat(a[i]);
delay(5);
i++;
}
writecom(0x80+15);
delay(2);
if(sw==0)
{
writedat('0');
}
if(sw==1)
{
writedat('1');
}
delay(2);
writecom(0x80+0x40+5);
delay(2);
writedat(str[temp0]);
delay(2);
writedat(str[temp1]);
delay(2);
writedat(':');
delay(2);
writedat(str[temp2]);
delay(2);
writedat(str[temp3]);
delay(2);
}
//**************************定時器************************//
void inittimer()//定時器初始化
{
TMOD=0x01;
TH0=0x3c;//50ms
TL0=0xb0;
ET0=1;//開啟定時器0的中斷
EA=1;//開啟總中斷
TR0=1;//啟動定時器0
}
//***********************調時功能*********************//
void function()//調時,鬧鐘功能
{
unsigned int key1sum=0,key2sum=0;
if(key0==0)//判斷按鍵是否按下
{
delay(10);//消抖
if(key0==0)
{
if(pattern<1)
{
pattern++;
}
else pattern=0;
while(!key0);//等待松開
}
}
if(pattern==0)//時間界面
{
if(key1==0)//判斷是否按下
{
delay(10);
if(key1==0)
{
while(!key1);//等待松開
if(key1sum<3)//按幾下光標移到哪一位
{key1sum++;
EA=0;}
else key1sum=0;
if(key1sum==1)
{
writecom(0x80+0x40+7);//移動到秒
writecom(0x0e); //光標顯示
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
key1sum=2;
break;
}
}
if(key2==0) //秒歸零
{
delay(10);
if(key2==0)
{
while(!key2);
sec=0;
display_time();
writecom(0x80+0x40+7);
}
}
if(key3==0) //秒歸零
{
delay(10);
if(key3==0)
{
while(!key3);
sec=0;
display_time();
writecom(0x80+0x40+7);
}
}
}
}
if(key1sum==2)
{
writecom(0x80+0x40+4);//移動到分
writecom(0x0e); //光標顯示
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
key1sum=3;
break;
}
}
if(key2==0)//加
{
delay(10);
if(key2==0)
{
while(!key2);
min++;
if(min==60)//最高為60分
{min=0;}
display_time();
writecom(0x80+0x40+4);
}
}
if(key3==0) //減
{
delay(10);
if(key3==0)
{
while(!key3);
if(min>0)
{min--;}
display_time();
writecom(0x80+0x40+4);
}
}
}
}
if(key1sum==3)
{
writecom(0x80+0x40+1);//移動到時
writecom(0x0e); //光標顯示
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
key1sum=0;
break;
}
}
if(key2==0)//加
{
delay(10);
if(key2==0)
{
while(!key2);
hour++;
if(hour==24)//最高為24時
{hour=0;}
display_time();
writecom(0x80+0x40+1);
}
}
if(key3==0) //減
{
delay(10);
if(key3==0)
{
while(!key3);
if(hour>0)
{hour--;}
display_time();
writecom(0x80+0x40+1);
}
}
}
}
if(key1sum==0)//跑時鐘
{
EA=1;
writecom(0x0c);
}
}
}
}
if(pattern==1)//鬧鐘界面
{
if(key1==0) //開關鬧鐘
{
delay(10);
if(key1==0)//檢驗是否按下
{
while(!key1);//等待按鍵松開
if(sw==0)
{sw=1;}
else sw=0;
display_alarm();
}
}
if(key2==0)//檢測key2是否摁下 //設置鬧鐘
{
delay(10);
if(key2==0)
{
while(!key2);//等待松開
if(key2sum<2)
{key2sum++;}
else key2sum=0;
if(key2sum==1)
{
writecom(0x80+0x40+6);//移動到時
writecom(0x0e); //打開光標
while(1)
{
if(key2==0)
{
delay(10);
if(key2==0)
{
while(!key2);
key2sum=2;
break;
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
while(!key3);
alarm_h++;
if(alarm_h==24)
{alarm_h=0;}
display_alarm();
writecom(0x80+0x40+6);
}
}
}
}
if(key2sum==2)
{
writecom(0x80+0x40+9);//移動到分
writecom(0x0e); //打開光標
while(1)
{
if(key2==0)
{
delay(10);
if(key2==0)
{
while(!key2);
key2sum=0;
break;
}
}
if(key3==0)
{
delay(10);
if(key3==2)
{
while(!key3);
alarm_m++;
if(alarm_m==60)
{alarm_m=0;}
display_alarm();
writecom(0x80+0x40+9);
}
}
}
}
if(key2sum==0) //設置完畢,歸位
{
writecom(0x0c);
}
}
}
}
}
void main()
{
unsigned int flag0=0,flag1=0,flag2=0;
initlcd();
inittimer();
P0M1 = 0; P0M0 = 0; //設置為準雙向口
P1M1 = 0; P1M0 = 0; //設置為準雙向口
P2M1 = 0; P2M0 = 0; //設置為準雙向口
P3M1 = 0; P3M0 = 0; //設置為準雙向口
P4M1 = 0; P4M0 = 0; //設置為準雙向口
P5M1 = 0; P5M0 = 0; //設置為準雙向口
P6M1 = 0; P6M0 = 0; //設置為準雙向口
P7M1 = 0; P7M0 = 0; //設置為準雙向口
buz=1;
while(1)
{
function();
if(pattern==0)//時間界面
{
if(flag0==0)
{
writecom(0x40);
flag0=2;
}
display_time();
flag1=0;
}
if(pattern==1)//鬧鐘界面
{
if(flag1==0)
{
writecom(0x01);
flag1=2;
}
display_alarm();
flag0=0;
}
if((sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in1==1)||(sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in2==1))
{
delay();
while((sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in1==1)||(sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in2==1))
{
beep();
}
}
if((sw==1&&hour==alarm_h&&min>=alarm_m&&in1==1&&hood==1)||(sw==1&&hour==alarm_h&&min>=alarm_m&&in2==1&&hood==1))
{
delay();
while((sw==1&&hour==alarm_h&&min>=alarm_m&&in1==1&&hood==1)||(sw==1&&hour==alarm_h&&min>=alarm_m&&in2==1&&hood==1))
{
beep();
}
}
if((sw==1&&hour>=alarm_h&&in1==1&&hood==1)||(sw==1&&hour>=alarm_h&&in2==1&&hood==1))
{
delay();
while((sw==1&&hour>=alarm_h&&in1==1&&hood==1)||(sw==1&&hour>=alarm_h&&in2==1&&hood==1))
{
beep();
}
}
if(hood==1)
led=1;
if(hood==0)
led=0;
}
}
void beep()
{
for(i=0;i<100;i++)
{
delay();
buz=~buz;
EA=1;
}
}
void timer0_isr() interrupt 1 //定時器中斷服務函數
{
count++;
if(count==19)//1s
{
sec++;
count=0;
}
if(sec==60)
{
min++;
sec=0;
}
if(min==60)
{
hour++;
min=0;
}
if(hour==24)
{
hour=0;
}
} |