1602液晶万年历C语言

[复制链接]
 楼主| ledrgb 发表于 2008-7-30 22:41 | 显示全部楼层 |阅读模式
*日历时钟                                                                      *
*按K1,进入设置状态                                                             *
*按k2,停止闹钟声音                                                             *
*按k3,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,      *
*直到退出设置状态                                                              *
*按k4,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字         *
*LCD第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能                   *
*(可在调整状态进行设置)                                                      *
*正常状态,LCD上排最前面显示自定义字符,LCD下排最前面闪动"XUELIN"                *
*设置状态,LCD上排最前面显示"P",下排最前面在设置闹钟时间时显示"alarm:",         *
*其它状态显示"time"                                                            *
*年代变化2000--2099,星期自动转换                                               *
*程序中有自定义字符写入                                                        *
//[龙图开发网: http://www.longtoo.com ]


#include 
#include 
unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};
unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月参变数
unsigned char data dis_buf1[16];  //lcd上排显示缓冲区
unsigned char data dis_buf2[16];  //lcd下排显示缓冲区  
unsigned char data year,month,date,week;//年、月、日、星期
unsigned char data armhour,armmin,armsec;//闹钟时、分、秒
unsigned char data hour,min,sec,sec100; //时、分、秒、百分之一秒
unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值 
bit alarm; //标识是否启用闹钟,1--启用,0--关闭
sbit  rs = P2^0;    //LCD数据/命令选择端(H/L)
sbit  rw = P2^1;    //LCD读/写选择端(H/L)
sbit  ep = P2^2;    //LCD使能控制
sbit PRE = P1^6;    //调整键(k3)
sbit SET = P1^7;    //调整键(k4)
sbit SPK = P3^7;    
void delayms(unsigned char ms); //延时程序
bit  lcd_busy();    //测试LCD忙碌状态程序
void lcd_wcmd(char cmd);  //写入指令到LCD程序
void lcd_wdat(char dat);  //写入数据到LCD程序
void lcd_pos(char pos);   //LCD数据指针位置程序
void lcd_init();    //LCD初始化设定程序
void pro_timedate();   //时间日期处理程序
void pro_display();    //显示处理程序
void pro_key();     //按键处理程序
void time_alarm();    //定时报警功能(闹钟)
unsigned char scan_key();  //按键扫描程序
unsigned char week_proc();  //星期自动计算与显示函数
bit leap_year();    //判断是否为闰年
void lcd_sef_chr();    //LCD自定义字符程序
void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);   
        //更新显示缓冲区函数
 

// 延时程序
void delay(unsigned char ms)
{ while(ms--)
 { unsigned char i;
  for(i = 0; i< 250; i++)     
  {
   _nop_();      //执行一条_nop_()指令为一个机器周期
   _nop_();
   _nop_();
   _nop_();
  }
 }
}  
 

//测试LCD忙碌状态
bit lcd_busy()

 bit result;
 rs = 0;
 rw = 1;
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1为忙碌,D7=0为空闲
 ep = 0;
 return result; 
}

//写入指令到LCD
void lcd_wcmd(char cmd)
{       
 while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令
 rs = 0;
 rw = 0;
 ep = 0;
 _nop_();
 _nop_(); 
 P0 = cmd;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0;  
}

//写入数据到LCD
void lcd_wdat(char dat) 
{       
 while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据
 rs = 1;
 rw = 0;
 ep = 0;
 P0 = dat;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0; 
}

//LCD数据指针位置程序
void lcd_pos(char pos)
{      
 lcd_wcmd(pos|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
}

//[龙图开发网: http://www.longtoo.com ]
//设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)
//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)
void lcd_sef_chr()
{ //第一个自定义字符
 lcd_wcmd(0x40); //"01 000 000"  第1行地址 (D7D6为地址设定命令形式
sz_kd 发表于 2008-7-30 22:51 | 显示全部楼层

楼主做了2份啊

zhonghx 发表于 2008-7-31 13:44 | 显示全部楼层
木易洋 发表于 2008-7-31 15:48 | 显示全部楼层

什么时候我也能达到这个水平啊

xwj 发表于 2008-7-31 16:04 | 显示全部楼层

与其临渊羡鱼,不如退而结网


加油学习吧,等你达到一定的水平时再来看,你会发现:

原来也很简单啊....
hotpower 发表于 2008-8-1 07:51 | 显示全部楼层

新战法是可以抛弃星期月参变数的~~~以3月为基月~~~

今年的1,2月为"上1年的最后2个月",明年的1,2月为"本年的最后2个月".

这样排列后的"年"中的月除了"年底2月"外全部月内的天数不变~~~

变的那个"年底2月"只有闰年少1天~~~

这样排列的好处"变量"在"年底的最后1天"~~~
相关链接:http://www.google.cn/search?hl=zh-CN&q=%E6%98%9F%E6%9C%9F+hotpower&meta=&aq=f
q6826846 发表于 2010-1-4 20:32 | 显示全部楼层
下半程序呢
雨人浪浪 发表于 2010-1-4 21:48 | 显示全部楼层
这个嘛,也比较简单,只是有些人没有尝试去做而已,大家加油
xiangrui21 发表于 2010-1-5 09:04 | 显示全部楼层
LZ,未完的继续呀!我要搭个电路做个万年历,需要你的程序跑跑啊~!!
rain_tz 发表于 2010-1-5 13:17 | 显示全部楼层
我也正在做这个,快要完成了
Name_006 发表于 2010-3-5 15:39 | 显示全部楼层
哈 我也是学习到这个阶段啦   那程序去分析啦
ningling_21 发表于 2010-3-5 17:08 | 显示全部楼层
只有一半....
woxinyh00 发表于 2011-1-14 12:43 | 显示全部楼层
电路图传上来看看哦!
dccdaa2222 发表于 2011-1-14 16:24 | 显示全部楼层
这个我有现成的..很多51学习板上都有这个例程
hyunbin 发表于 2011-3-25 21:44 | 显示全部楼层
程序写的很好啊  等待继续下面的程序
abin0415 发表于 2011-3-26 20:11 | 显示全部楼层
好像只写了一部分啊
areshan 发表于 2011-3-26 21:11 | 显示全部楼层
前几天做公交车,发现公交车上面老是从2000-2040不停的连续走动,开始认为是秒钟,不像。我就想,为什么到2040就又回到了2000呢,原来是年份!哎,这年份跑的也太快了,2040年,我都快60了,不敢想了!!!!!!
liulei20101008 发表于 2011-3-26 22:33 | 显示全部楼层
拿走了,谢谢楼主 啊
我叫zhaofei 发表于 2011-9-20 13:39 | 显示全部楼层
楼主有原理图吗   我需要做成一个板子试试  谢谢了
7760448 发表于 2011-9-20 19:07 | 显示全部楼层
记号先,学完51后再来参考参考。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

16

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部