标题:
想用51单片机制作电子时钟,但LCD1602只发光不显示东西 求帮助
[打印本页]
作者:
maps
时间:
2019-12-19 20:36
标题:
想用51单片机制作电子时钟,但LCD1602只发光不显示东西 求帮助
#include<REGX51.h>
#define LCD1602_DATAPINS P0
#define uchar unsigned char
#define uint unsigned int
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit k1=P3^1; //????P3.1????k1 ????????
sbit k2=P3^2; //????P3.1??K1
sbit k3=P3^3; //????P3.1??k1
uchar LED1,LED2,LED4,LED5,LED7,LED8;//???????????????
uchar select_function;
uchar time1,time2,time3;
code uchar display[]="TIME:";
void Lcd1602_Delaylms(uint z)
{
uint x,y;
for(;z>0;z--)
{
for(y=199;y>0;y--)
{
for(x=1;x>0;x++);
}
}
}
void Timer0Init()
{
TMOD=0x01;//?????????0???????????1??????TR0???????
TH0=0xD8; //?????????????????10ms
TL0=0xF0;
EA=1; //?????ж?
ET0=1;//???????0?ж?????
TR0=1;//???????0
}
void LcdWriteCom(uchar com) //д??????
{
LCD1602_RS = 0; //?????????
LCD1602_RW = 0; //???д??
LCD1602_DATAPINS = com; //????????
Lcd1602_Delaylms(1); //??????????
LCD1602_E = 1; //???
LCD1602_E = 0; //д?????
Lcd1602_Delaylms(5); //???????
}
void LcdWriteData(uchar dat)
{
LCD1602_RS = 1; //???????????
LCD1602_RW = 0; //???д??
LCD1602_DATAPINS = dat; //д??????
Lcd1602_Delaylms(1);
LCD1602_E = 1; //???????
LCD1602_E = 0; //д?????
Lcd1602_Delaylms(5); //???????
LCD1602_E = 0;
}
void LcdInit()
{
LcdWriteCom(0x38); //?????
LcdWriteCom(0x0C); //?????????????
LcdWriteCom(0x06); //д???????1
LcdWriteCom(0x01); //????
LcdWriteCom(0x80); //??????????????
}
void show_string(uchar *dat)
{
uint i;
for(i=0;i<16;i++)
{
if(*(dat+i)=='\0')
break;
LcdWriteData(*(dat+i));
}
}
void lcd_pos(uchar pos)
{
LcdWriteCom(pos | 0x80);
}
void timer_calculate() //????????
{
time1++;
if(time1==60)
{
time1=0;
time2++;
}
if(time2==60)
{
time1=0;
time2=0;
time3++;
}
if(time3==24)
{
time1=0;
time2=0;
time3=0;
}
}
void time_display(void) //??????
{
lcd_pos(0x05);
LcdWriteData(LED8+'0');
lcd_pos(0x06);
LcdWriteData(LED7+'0');
lcd_pos(0x07);
LcdWriteData('-');
lcd_pos(0x08);
LcdWriteData(LED5+'0');
lcd_pos(0x09);
LcdWriteData(LED4+'0');
lcd_pos(0x0a);
LcdWriteData('-');
lcd_pos(0x0b);
LcdWriteData(LED2+'0');
lcd_pos(0x0c);
LcdWriteData(LED1+'0');
}
void keypros() //?????
{
if(k1==0)//?????k1?????
{
Lcd1602_Delaylms(10); //???????? ?????10ms
if(select_function==4)
{
select_function=0;
}
if(select_function!=0)
{
TR0=0;
}
while(!k1); //???????????
if(select_function==0)
TR0=1;
}
if(select_function==1)
{
if(k2==0) //????ж?????????
{
time1++; //??? ????1,2 ????1,2 ???1,2
if(time1>=60)
{
time1=0;
}
}
while(!k2); //??????????
if(k3==0) //????ж?????????
{
if(time1==0)time1=60;
time1--; //??? ????1,2 ????1,2 ???1,2
}
while(!k3); //???????????
}
if(select_function==2)
{
if(k2==0) //????ж?????????
{
time2++; //????ж?????????
if(time2>=60)
time2=0;
}
while(!k2); //???????????
if(k3==0) //????ж?????????
{
if(time2==0)
time2=60;
time2--; //?????????????
}
}
if(select_function==3)
{
if(k2==0) //????ж?????????
{
time3++; //??? ????1,2 ????1,2 ???1,2
if(time3>=24)
time3=0;
}
while(!k2);//???????????
if(k3==0) //????ж?????????
{
if(time3==0)
time3=24;
time3--; //??? ????1,2 ????1,2 ???1,2
}
while(!k3); //???????????
}
LED1=time1%10;
LED2=time1/10;
LED4=time2%10;
LED5=time2/10;
LED7=time3%10;
LED8=time3/10;
}
//??????
void main()
{
LcdInit();
show_string(display); //???time
Timer0Init();
LED1=0; //??????λ???????
LED2=0; //??????λ???????
LED4=0; //??????λ???????
LED5=0; //??????λ???????
LED7=0; //?????λ???????
LED8=0; //?????λ???????
select_function=0;
time1=0;
time2=0;
time3=0;
while(1)
{
keypros();
time_display();
}
}
//?????ж?
void Timer0() interrupt 1
{
static uint k=0;
TH0=0xD8; //?????????????????10ms
TL0=0xF0;
k++;
if(k==100)
{
k=0;
timer_calculate(); //????????
}
}
IMG_20191219_203215.jpg
(6.44 MB, 下载次数: 98)
下载附件
2019-12-19 20:36 上传
作者:
man1234567
时间:
2019-12-20 08:15
一般是1602的驱动问题,先想办法点亮再调试其他功能才是王道。
1602这个东东,不是所有程序是通用的,而且每型器件都可能在时序上有点区别。
作者:
pcbboy
时间:
2019-12-20 08:45
一看就是拷贝过来的,自己检查引脚定义看看,IO口配置啥的都检查一下。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1