基于AT89C51的电子钟(C语言编程)

 先看看电路图


P3.0是设置选择位,按一次选择一个,再按一次,顺序往下执行

#include<reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint  unsigned int
int i,sec,min,h,date,month,year,flag;
uchar code digit[10]={"0123456789"}; 
sbit RS=P2^0;           //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1;           //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2;            //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7;           //忙碌标志位,,将BF位定义为P0.7引脚
sbit key_ch=P3^0;
sbit key_add=P3^1;
sbit key_minus=P3^2;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
void control(void);
void delay1ms()
{
    unsigned char i,j;
for(i=0;i<10;i++)
  for(j=0;j<33;j++)
  ;  
 }
 /*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
 void delay(uint n)
 {
    uint i;
for(i=0;i<n;i++)
delay1ms();
 }
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
 bit BusyTest(void)
  {
    bit result;
RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
    RW=1;
    E=1;        //E=1,才允许读写
    _nop_();   //空操作
    _nop_();
    _nop_(); 
    _nop_();   //空操作四个机器周期,给硬件反应时间
    result=BF;  //将忙碌标志电平赋给result
E=0;
    return result;
  }
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void Write_com (uchar dictate)
{   
    while(BusyTest()==1);   //如果忙就等待
RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;   
E=0;                   //E置低电平(写指令时,就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();               //空操作两个机器周期,给硬件反应时间
P0=dictate;            //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();               //空操作四个机器周期,给硬件反应时间
E=1;                   //E置高电平
_nop_();
_nop_();
_nop_();
_nop_();               //空操作四个机器周期,给硬件反应时间
 E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
 }
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
 void WriteAddress(uchar x)
 {
     Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
 }
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
 void WriteData(uchar y)
 {
    while(BusyTest()==1);  
 RS=1;           //RS为高电平,RW为低电平时,可以写入数据
 RW=0;
 E=0;            //E置低电平(写指令时,就是让E从0到1发生正跳变,所以应先置"0"
 P0=y;           //将数据送入P0口,即将数据写入液晶模块
 _nop_();

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值