找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3256|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

用89C51單片機(jī)寫(xiě)了一個(gè)LCD顯示時(shí)鐘

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
初學(xué)單片機(jī),勿噴,請(qǐng)大俠指正,需要的直接復(fù)制拿走
protues仿真通過(guò)
#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;          //開(kāi)總中斷
        ET0=1;  //開(kāi)定時(shí)器0中斷
        TR0=1;          //啟動(dòng)定時(shí)器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秒定時(shí)
        {
                 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);                //時(shí)
        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液晶屏的操作
讀數(shù)據(jù),寫(xiě)數(shù)據(jù),寫(xiě)命令
定義引腳:P0口是數(shù)據(jù),P2口是控制 
*/
sbit RS=P2^0;          //定義屏的模式管腳位
sbit RW=P2^1;          //定義屏的讀寫(xiě)管腳位
sbit EN=P2^2;          //屏的使能位
sbit BUSY=P0^7;          

void wait()                //實(shí)際是判斷LCD是否忙,是否可進(jìn)入讀寫(xiě)狀態(tài)
{
        P0=0xff;
        do
        {
                RS=0;        //命令(狀態(tài))模式
                RW=1;        //讀操作
                EN=0;        //使能關(guān)
                EN=1;        //使能開(kāi)
        }while(BUSY==1);
        EN=0;
}
void w_dat(unsigned char dat)        //寫(xiě)數(shù)據(jù)
{
        wait();
        EN=0;
        P0=dat;
        RS=1;           //數(shù)據(jù)模式
        RW=0;                //寫(xiě)操作
        EN=1;           //使能開(kāi),數(shù)據(jù)進(jìn)去了
        EN=0;           //使能關(guān)
}
void w_cmd(unsigned char cmd)  //寫(xiě)命令函數(shù)
{
        wait();
        EN=0;
        P0=cmd;               
        RS=0;                //命令(狀態(tài))模式
        RW=0;                //寫(xiě)操作
        EN=1;                //使能開(kāi),命令進(jìn)去了
        EN=0;                //使能關(guān)
}
//void w_string(unsigned char addr,unsigned char  *p)         //寫(xiě)入字符串函數(shù)
//{
//         w_cmd(addr);        //寫(xiě)入命令,讓屏從那里開(kāi)始顯示
//
//        while(*p !='\0')        //循環(huán)字符串中的每個(gè)字符,直到結(jié)尾
//        {
//                 w_dat(*p++);       
//        }
//}
void LCD_init()         //LCD初始化函數(shù)
{
   w_cmd(0x38);           //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
   w_cmd(0x0c);           //顯示器開(kāi)、光標(biāo)開(kāi)、光標(biāo)允許閃爍
   w_cmd(0x06);           //文字不動(dòng)、光標(biāo)自動(dòng)右移
   w_cmd(0x01);           //清屏
}
#endif


20220510151356.jpg (127.46 KB, 下載次數(shù): 94)

20220510151356.jpg

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:16255 發(fā)表于 2022-5-11 17:07 | 只看該作者
這個(gè)電路實(shí)際上是不能工作的。顯示屏的VEE被接地了,顯示屏?xí)伙@示。
還有單片機(jī)的晶振、復(fù)位、ALE等都要安排上,不然單片機(jī)不工作。(用STC單片機(jī)可以不用考慮)
回復(fù)

使用道具 舉報(bào)

板凳
ID:1017814 發(fā)表于 2022-5-13 20:57 | 只看該作者
樓上說(shuō)的是,這個(gè)只是仿真,實(shí)際要用可調(diào)電阻才行,今天有空了,收到從網(wǎng)上購(gòu)的1602屏,就試了,發(fā)現(xiàn)個(gè)問(wèn)題,就是實(shí)物不能顯示,對(duì)比度也不行,所以就加上可調(diào)電阻,顯示對(duì)比度可以了。但還是不正常,后來(lái)
原因找到了,程序問(wèn)題,就是使能口,延時(shí)少了,再加一句就行
每個(gè)EN=0之前加上 EN=1;,意思就是兩句EN=1;可以做到延時(shí)就行了。


評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:1026852 發(fā)表于 2022-5-16 00:50 | 只看該作者
優(yōu)秀,這個(gè)我還做不來(lái)
回復(fù)

使用道具 舉報(bào)

5#
ID:1012735 發(fā)表于 2022-5-16 07:51 | 只看該作者
把中斷函數(shù)中的代碼 if(second0==10)及以下所有行,移入主函數(shù)的while()循環(huán)中執(zhí)行,或許走時(shí)會(huì)更精確些。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表