找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2223|回复: 4
收起左侧

用89C51单片机写了一个LCD显示时钟

[复制链接]
ID:1017814 发表于 2022-5-10 15:20 | 显示全部楼层 |阅读模式
初学单片机,勿喷,请大侠指正,需要的直接复制拿走
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

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:16255 发表于 2022-5-11 17:07 | 显示全部楼层
这个电路实际上是不能工作的。显示屏的VEE被接地了,显示屏会不显示。
还有单片机的晶振、复位、ALE等都要安排上,不然单片机不工作。(用STC单片机可以不用考虑)
回复

使用道具 举报

ID:1017814 发表于 2022-5-13 20:57 | 显示全部楼层
楼上说的是,这个只是仿真,实际要用可调电阻才行,今天有空了,收到从网上购的1602屏,就试了,发现个问题,就是实物不能显示,对比度也不行,所以就加上可调电阻,显示对比度可以了。但还是不正常,后来
原因找到了,程序问题,就是使能口,延时少了,再加一句就行
每个EN=0之前加上 EN=1;,意思就是两句EN=1;可以做到延时就行了。


评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:1026852 发表于 2022-5-16 00:50 | 显示全部楼层
优秀,这个我还做不来
回复

使用道具 举报

ID:1012735 发表于 2022-5-16 07:51 | 显示全部楼层
把中断函数中的代码 if(second0==10)及以下所有行,移入主函数的while()循环中执行,或许走时会更精确些。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表