标题:
用89C51单片机写了一个LCD显示时钟
[打印本页]
作者:
wukouyyq
时间:
2022-5-10 15:20
标题:
用89C51单片机写了一个LCD显示时钟
初学单片机,勿喷,请大侠指正,需要的直接复制拿走
protues仿真通过
#include <reg52.h>
#include "1602.h"
typedef unsigned char u8;
u8 n,second0,second1,minute0,minute1,hour0,hour1;
void timer0()
{
TMOD=0X01;
TH0=(65536-46483)/256;
TL0=(65536-46483)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void main()
{
LCD_init();
timer0();
while(1);
}
void interr() interrupt 1
{
TH0=(65536-46483)/256;
TL0=(65536-46483)%256;
n++;
if(n==20) //1秒定时
{
n=0;
second0++;
}
if(second0==10)
{
second0=0;
second1++;
}
if(second1==6)
{
second1=0;
minute0++;
}
if(minute0==10)
{
minute0=0;
minute1++;
}
if(minute1==6)
{
minute1=0;
hour0++;
}
if(hour0==10)
{
hour0=0;
hour1++;
}
if(hour1==2 && hour0==4)
{
hour0=0;
hour1=0;
}
w_cmd(0xc0);
w_dat(hour1+0x30); //时
w_dat(hour0+0x30);
if(n<10)
{
w_dat(':');
}else
{
w_dat(' ');
}
w_dat(minute1+0x30); // 分
w_dat(minute0+0x30);
if(n<10)
{
w_dat(':');
}else
{
w_dat(' ');
}
w_dat(second1+0x30); //秒
w_dat(second0+0x30);
}
//*************************************以下是1602.h文件****************************************************
#ifndef _1602_H_
#define _1602_H_
/*
1602液晶屏的操作
读数据,写数据,写命令
定义引脚:P0口是数据,P2口是控制
*/
sbit RS=P2^0; //定义屏的模式管脚位
sbit RW=P2^1; //定义屏的读写管脚位
sbit EN=P2^2; //屏的使能位
sbit BUSY=P0^7;
void wait() //实际是判断LCD是否忙,是否可进入读写状态
{
P0=0xff;
do
{
RS=0; //命令(状态)模式
RW=1; //读操作
EN=0; //使能关
EN=1; //使能开
}while(BUSY==1);
EN=0;
}
void w_dat(unsigned char dat) //写数据
{
wait();
EN=0;
P0=dat;
RS=1; //数据模式
RW=0; //写操作
EN=1; //使能开,数据进去了
EN=0; //使能关
}
void w_cmd(unsigned char cmd) //写命令函数
{
wait();
EN=0;
P0=cmd;
RS=0; //命令(状态)模式
RW=0; //写操作
EN=1; //使能开,命令进去了
EN=0; //使能关
}
//void w_string(unsigned char addr,unsigned char *p) //写入字符串函数
//{
// w_cmd(addr); //写入命令,让屏从那里开始显示
//
// while(*p !='\0') //循环字符串中的每个字符,直到结尾
// {
// w_dat(*p++);
// }
//}
void LCD_init() //LCD初始化函数
{
w_cmd(0x38); //16*2显示,5*7点阵,8位数据接口
w_cmd(0x0c); //显示器开、光标开、光标允许闪烁
w_cmd(0x06); //文字不动、光标自动右移
w_cmd(0x01); //清屏
}
#endif
20220510151356.jpg
(127.46 KB, 下载次数: 94)
下载附件
2022-5-10 15:16 上传
作者:
mengsiu
时间:
2022-5-11 17:07
这个电路实际上是不能工作的。显示屏的VEE被接地了,显示屏会不显示。
还有单片机的晶振、复位、ALE等都要安排上,不然单片机不工作。(用STC单片机可以不用考虑)
作者:
wukouyyq
时间:
2022-5-13 20:57
楼上说的是,这个只是仿真,实际要用可调电阻才行,今天有空了,收到从网上购的1602屏,就试了,发现个问题,就是实物不能显示,对比度也不行,所以就加上可调电阻,显示对比度可以了。但还是不正常,后来
原因找到了,程序问题,就是使能口,延时少了,再加一句就行
每个EN=0之前加上 EN=1;,意思就是两句EN=1;可以做到延时就行了。
作者:
shiter
时间:
2022-5-16 00:50
优秀,这个我还做不来
作者:
hy47566398
时间:
2022-5-16 07:51
把中断函数中的代码 if(second0==10)及以下所有行,移入主函数的while()循环中执行,或许走时会更精确些。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1