打印

1602液晶万年历C语言

[复制链接]
5735|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者

lzxk

使用特权

评论回复
地板
木易洋| | 2008-7-31 15:48 | 只看该作者

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

使用特权

评论回复
5
xwj| | 2008-7-31 16:04 | 只看该作者

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


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

原来也很简单啊....

使用特权

评论回复
6
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

使用特权

评论回复
7
q6826846| | 2010-1-4 20:32 | 只看该作者
下半程序呢

使用特权

评论回复
8
雨人浪浪| | 2010-1-4 21:48 | 只看该作者
这个嘛,也比较简单,只是有些人没有尝试去做而已,大家加油

使用特权

评论回复
9
xiangrui21| | 2010-1-5 09:04 | 只看该作者
LZ,未完的继续呀!我要搭个电路做个万年历,需要你的程序跑跑啊~!!

使用特权

评论回复
10
rain_tz| | 2010-1-5 13:17 | 只看该作者
我也正在做这个,快要完成了

使用特权

评论回复
11
Name_006| | 2010-3-5 15:39 | 只看该作者
哈 我也是学习到这个阶段啦   那程序去分析啦

使用特权

评论回复
12
ningling_21| | 2010-3-5 17:08 | 只看该作者
只有一半....

使用特权

评论回复
13
woxinyh00| | 2011-1-14 12:43 | 只看该作者
电路图传上来看看哦!

使用特权

评论回复
14
dccdaa2222| | 2011-1-14 16:24 | 只看该作者
这个我有现成的..很多51学习板上都有这个例程

使用特权

评论回复
15
hyunbin| | 2011-3-25 21:44 | 只看该作者
程序写的很好啊  等待继续下面的程序

使用特权

评论回复
16
abin0415| | 2011-3-26 20:11 | 只看该作者
好像只写了一部分啊

使用特权

评论回复
17
areshan| | 2011-3-26 21:11 | 只看该作者
前几天做公交车,发现公交车上面老是从2000-2040不停的连续走动,开始认为是秒钟,不像。我就想,为什么到2040就又回到了2000呢,原来是年份!哎,这年份跑的也太快了,2040年,我都快60了,不敢想了!!!!!!

使用特权

评论回复
18
liulei20101008| | 2011-3-26 22:33 | 只看该作者
拿走了,谢谢楼主 啊

使用特权

评论回复
19
我叫zhaofei| | 2011-9-20 13:39 | 只看该作者
楼主有原理图吗   我需要做成一个板子试试  谢谢了

使用特权

评论回复
20
7760448| | 2011-9-20 19:07 | 只看该作者
记号先,学完51后再来参考参考。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

16

帖子

0

粉丝