搜索
bottom↓
回复: 53

12864液晶实现多功能菜单该如何合并功能

[复制链接]

出0入0汤圆

发表于 2011-12-26 20:35:33 | 显示全部楼层 |阅读模式
12864实现开机密码,字幕、温度、时间、图片、音乐、动画、闹钟外加时间闹钟可调能行么?我的毕业设计,可是不知怎么下手,只有网上找到几个只有2,3个菜单的,谁能帮帮忙呢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-12-26 20:53:19 | 显示全部楼层
本站就有多层菜单的实例啊,像
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=798580
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=457580
都很经典.

出0入0汤圆

发表于 2011-12-26 20:55:14 | 显示全部楼层
搜索了一下"菜单",有这么多.其实,想找资料时先在本站搜....嘿嘿.

出0入0汤圆

 楼主| 发表于 2011-12-26 21:42:21 | 显示全部楼层
回复【1楼】AIHHLI 咚冬
-----------------------------------------------------------------------

是单片机C的么,,,我看着咋感觉不像,好复杂的

出0入0汤圆

发表于 2011-12-27 16:04:40 | 显示全部楼层
回复【楼主位】sunsisijiang  
-----------------------------------------------------------------------
字幕,图片和音乐是什么意思啊?
12864显示黑白图片?
音乐是放MP3吗?
字幕啥子意思,没猜到。

其他的能行。

出0入0汤圆

发表于 2011-12-27 16:16:06 | 显示全部楼层
楼主是老乡

出0入0汤圆

发表于 2011-12-27 23:06:14 | 显示全部楼层
回复【3楼】sunsisijiang  
回复【1楼】aihhli 咚冬
-----------------------------------------------------------------------
是单片机c的么,,,我看着咋感觉不像,好复杂的
-----------------------------------------------------------------------
是啊,只不过扯上些数据结构 状态机什么的...

出0入0汤圆

 楼主| 发表于 2011-12-28 15:42:59 | 显示全部楼层
回复【4楼】614229816 听雨
-----------------------------------------------------------------------

刚开始就是显示我的信息,,比如名字啊,班级的。。。。然后开机需要密码对才进入,,,然后有好几个菜单选择么,有显示图片的菜单,播放音乐的菜单,然后其它功能的菜单。图片是黑白的。。。老师说我可以不用做实物只要protues仿真出来

出0入0汤圆

 楼主| 发表于 2011-12-28 15:43:23 | 显示全部楼层
回复【5楼】llsenyue
-----------------------------------------------------------------------

嘿嘿,这样的啊

出0入0汤圆

 楼主| 发表于 2011-12-28 15:44:10 | 显示全部楼层
回复【6楼】AIHHLI 咚冬
-----------------------------------------------------------------------

那些数据的结构的看不懂呀,,那个很像嵌入式的东西,,很难

出0入0汤圆

发表于 2011-12-29 11:44:45 | 显示全部楼层
回复【7楼】sunsisijiang  
-----------------------------------------------------------------------
回复【9楼】sunsisijiang  
-----------------------------------------------------------------------
我也是才学单片机没多久,实现菜单应该可以做到,显示一张图片也应该行,但是播放音乐表示无能为力。

这个自己做其实比较有意思,一般不要看别人的代码,看看思路就可以了。看看核心代码参考也可以。

我现在学的汇编,如果看其他人的长代码会吐血的。

你可以自己尝试着做呗。

出0入0汤圆

发表于 2011-12-29 11:53:09 | 显示全部楼层
1.先初始化液晶,显示出你的名字啊,班级的,提示输入密码。

2.然后验证密码,正确的话才进入。你的直接比较就好了。

3.打开定时计数器或时钟芯片。

4.显示时间温度,1秒刷新一次就差不多。并且不断扫描键盘。

5.有按键的话就进入菜单。菜单中时间要保持正常运行,但是不显示。

6.扫描键盘,根据键盘刷新菜单。或进入子菜单。

7.想好从菜单或子菜单中返回的方法。

出0入0汤圆

发表于 2011-12-29 14:21:47 | 显示全部楼层
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=798580
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=457580
都很经典.

出0入0汤圆

 楼主| 发表于 2011-12-29 15:26:15 | 显示全部楼层
回复【11楼】614229816 听雨
-----------------------------------------------------------------------

我现在能显示自己的信息,,然后进入可以看图片,音乐,动画菜单,,然后其它实现不起来,纠结死了,我合并不来

出0入0汤圆

发表于 2011-12-29 15:32:49 | 显示全部楼层
回复【楼主位】sunsisijiang
12864实现开机密码,字幕、温度、时间、图片、音乐、动画、闹钟外加时间闹钟可调能行么?我的毕业设计,可是不知怎么下手,只有网上找到几个只有2,3个菜单的,谁能帮帮忙呢
-----------------------------------------------------------------------

之前有看到这类的毕业设计程序,你去找找网络上应该有
一楼也给出了链接,都是很好的图文菜单控制程序
LZ好好研究一下,收获肯定很大

出0入0汤圆

发表于 2011-12-29 15:46:18 | 显示全部楼层
回复【13楼】sunsisijiang  
-----------------------------------------------------------------------
我也是菜鸟,声明一下。

画个流程图,根据流程图一点点的加功能,分配好资源。

我放假打算学C语,以前学的汇编。

加油吧

出0入0汤圆

发表于 2011-12-29 16:16:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-11 00:15:55 | 显示全部楼层
mark.

出0入0汤圆

发表于 2012-1-12 14:45:20 | 显示全部楼层
期待楼主早日做出来。

出0入0汤圆

发表于 2012-1-13 15:02:57 | 显示全部楼层
lz,你玩轮滑的啊?

出0入0汤圆

发表于 2012-1-15 01:32:34 | 显示全部楼层
还没有做出来?

出0入0汤圆

发表于 2012-1-15 21:47:50 | 显示全部楼层
呵呵 lz本不是做技术的 糊弄一下就行  出去了好好混

出0入0汤圆

发表于 2012-1-16 23:11:21 | 显示全部楼层
音乐可以烧入 一首 梁祝 。好玩的东西

出0入0汤圆

发表于 2012-1-16 23:55:54 | 显示全部楼层
美女,又是你呀,你可是这里的红人哦。
结构体菜单,只要你慢慢看懂,写菜单就
很容易了。这个论坛里有很好的帖子,你搜搜就有了。
如果你找不到,可以加我qq我发给你。
我写过一个1602的二级菜单就是用这个,大家就交流
下。目的就是为了提高,不为别的。我还是菜鸟。

出0入0汤圆

发表于 2012-1-17 00:01:13 | 显示全部楼层
哎,阿莫大哥是会封人qq的,我把文件发到这里好了。
点击此处下载 ourdev_713437USP0CR.rar(文件大小:1.61M) (原文件名:最好的写菜单方法.rar)

出0入0汤圆

 楼主| 发表于 2012-1-17 11:44:43 | 显示全部楼层
回复【24楼】downtoearth
-----------------------------------------------------------------------

你写过12864的么,,,我现在有2个程序和仿真,,可是我不会结合

出0入0汤圆

 楼主| 发表于 2012-1-17 11:45:58 | 显示全部楼层
回复【22楼】gongxd
-----------------------------------------------------------------------

糊弄难啊,毕业论文都不知从何下手,现在程序仿真都没更不好糊弄了

出0入0汤圆

发表于 2012-1-17 12:03:43 | 显示全部楼层
回复【26楼】sunsisijiang  
-----------------------------------------------------------------------
我没有写个12864,用大循环不行吗?

出0入85汤圆

发表于 2012-1-17 12:14:15 | 显示全部楼层
菜单

出0入0汤圆

发表于 2012-1-17 13:19:39 | 显示全部楼层
回复【27楼】sunsisijiang
回复【22楼】gongxd  
-----------------------------------------------------------------------
糊弄难啊,毕业论文都不知从何下手,现在程序仿真都没更不好糊弄了
-----------------------------------------------------------------------

花点钱 给老师
不行一哭二闹三上吊
毕业论文什么的 都是抄

出0入0汤圆

发表于 2012-1-17 15:32:13 | 显示全部楼层
另起一帖,标题: 小女子特此求助12864多功能菜单问题,为表诚意附上近身照nP

作为论坛上稀贵物种,有时候只需要发挥一下本性特长,很多问题就不成问题了

出0入0汤圆

 楼主| 发表于 2012-1-19 18:19:54 | 显示全部楼层
回复【28楼】downtoearth
-----------------------------------------------------------------------

只要能把功能出来了,老师看到结果就ok的,,不看程序的

出0入0汤圆

发表于 2012-1-19 20:51:15 | 显示全部楼层
/*******************************************************************
*名称:基于LCD12864的多功能数字电子钟         
*功能:实现了基本显示(包括年、月、日、时、分、秒、星期、当前室温)
*    和校时功能,并能够设定闹铃(按key3确定键停止响铃)。                  
********************************************************************/



#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int


sbit dula="P2"^6;  //定义数码管段选端
sbit wela="P2"^7;  //定义数码管位选端
sbit lcden="P3"^4;  //定义lcd使能端
sbit lcdrs="P3"^5;  //定义lcd数据命令选择端
sbit lcdwr="P3"^6;  //定义lcd读写选择端
sbit lcdrd="P3"^7;  //定义并串选择端
sbit beep="P2"^3;  //定义蜂鸣器端口
sbit key0=P3^0;  //定义key0
sbit key1=P3^1;  //定义key1
sbit key2=P3^2;  //定义key2
sbit key3=P3^3;  //定义key3
sbit DQ="P2"^2;  //定义DS18B20数据线引脚端


bit flag_alarm;
uchar high,low;
uint i,j,temp;
float f_temp;
char a,d2,d1,d0,t0,k0,k1,mon=12,day=31,hour=23,min=59,sec=50,temp_day,hour_alarm=0,min_alarm=0;
int year="2009";
uchar code line1[]="20  年  月  日";
uchar code line2[]="  时  分  秒";
uchar code line3[]="星期  ";
uchar code line4[]="当前室温:00.0度";
uchar code alarm2[]="闹铃时间:";
uchar code alarm3[]="  时  分";


uchar code week0[]="日";
uchar code week1[]="一";
uchar code week2[]="二";
uchar code week3[]="三";
uchar code week4[]="四";
uchar code week5[]="五";
uchar code week6[]="六";


//-------------------毫秒级延时函数-------------------------
void delay_ms(uint z)  //延时z毫秒
{
uint x,y;
for(x=z;x>0;x--)
  for(y=115;y>0;y--);
}


//----------------微妙级延时函数---------------------
void delay_us(uint z)  //延时z*10us
{
uint x,y;
for(x=z;x>0;x--)
  for(y=1;y>0;y--);
}


//---------------蜂鸣器发声函数--------------------------
void beep_pro(char be)  //产生几种不同频率声音
{
switch(be)
{
  case 0:   //用于闹铃
  {
   for(i=50;i>0;i--)
   {
    for(j=2;j>0;j--)
    {
     beep=~beep;
     delay_us(1);
    }
   }
  }
  case 1:  //用于整点前报时
  {
   for(i=1250;i>0;i--)
   {
    beep=~beep;
    delay_us(20);
   }
  }break;
  case 2:  //用于整点报时
  {
   for(i=2500;i>0;i--)
   {
    beep=~beep;
    delay_us(10);
   }
  }break;
}
}


//------------lcd写指令函数-------------
void wr_cmd(uchar cmd)
{
lcden=0;
lcdrs=0;
P0=cmd;
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}


//-----------lcd写数据函数-----------
void wr_dat(uchar dat)
{
lcden=0;
lcdrs=1;
P0=dat;
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}


//-------------星期计算及显示函数--------------
void week_day(int y,char m,char d)  //根据已知的日期计算星期几(适用2001年~2099年)
{
//-------------------------以下部分为蔡勒公式-------------------------------------
/*c是世纪数减一,y是年份后两位,m是月份(从3月开始,1月和2月要按上一年的13月和14月
来算,这时c和y均按上一年取值),d是日数。w 等于多少就是星期几,等于0即为星期天*/
// 亦可不用此公式,当day自加时,星期数也自加
char w,c,a;  
if(m==1||m==2)
{
  m=m+12;
  y=y-1;
}
c=20;
y=y%100;
w=(y+y/4+c/4-2*c+26*(m+1)/10+d-1)%7;
if(w<0||w>6)
  w=w+7;
//-------------------------------------------------------------------------------         
switch(w)   //根据计算得到的值显示到lcd相应位置上
{
  case 0:
  {
   wr_cmd(0x8d);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<2;a++)  //写入第一行数据
   {
    wr_dat(week0[a]);         
   }
   break;
  }
  case 1:
  {
   wr_cmd(0x8d);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<2;a++)  //写入第一行数据
   {
    wr_dat(week1[a]);
   }break;
  }
  case 2:
  {
   wr_cmd(0x8d);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<2;a++)  //写入第一行数据
   {
    wr_dat(week2[a]);
   }break;
  }
  case 3:
  {
   wr_cmd(0x8d);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<2;a++) //写入第一行数据
   {
    wr_dat(week3[a]);
   }break;
  }
  case 4:
  {
   wr_cmd(0x8d);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<2;a++)  //写入第一行数据
   {
    wr_dat(week4[a]);
   }break;
  }
  case 5:
  {
   wr_cmd(0x8d);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<2;a++)  //写入第一行数据
   {
    wr_dat(week5[a]);
   }break;
  }
  case 6:
  {
   wr_cmd(0x8d);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<2;a++)  //写入第一行数据
   {
    wr_dat(week6[a]);
   }break;
  }
}  
}


//-----------------------用户界面文字显示函数--------------------------
void face_dis()      
{
wr_cmd(0x30);   //选择功能:8位数据基本指令操作
wr_cmd(0x0c);  //整体显示开,不显示光标
wr_cmd(0x01);  //lcd清屏
wr_cmd(0x02);  //游标归原点
wr_cmd(0x80);  //设置第一行第二个汉字地址为起始位
for(a=0;a<14;a++) //写入第一行数据
{
  wr_dat(line1[a]);
}
wr_cmd(0x91);  //设置第二行起始位
for(a=0;a<12;a++)  //写入第二行数据
{
  wr_dat(line2[a]);
}
wr_cmd(0x8b);  //设置第三行第三个汉字地址为起始位
for(a=0;a<6;a++)  //写入第三行数据
{
  wr_dat(line3[a]);
}
wr_cmd(0x98);  //设置第四行起始位
for(a=0;a<16;a++)  //写入第四行数据
{
  wr_dat(line4[a]);
}


wr_cmd(0x81);   //显示年
wr_dat(0x30+year%100/10);
wr_dat(0x30+year%100%10);


wr_cmd(0x83);   //显示月
wr_dat(0x30+mon/10);
wr_dat(0x30+mon%10);


wr_cmd(0x85);   //显示日
wr_dat(0x30+day/10);
wr_dat(0x30+day%10);


wr_cmd(0x91);   //显示时
wr_dat(0x30+hour/10);
wr_dat(0x30+hour%10);


wr_cmd(0x93);    //显示分     
wr_dat(0x30+min/10);      
wr_dat(0x30+min%10);


wr_cmd(0x95);   //显示秒
wr_dat(0x30+sec/10);     
wr_dat(0x30+sec%10);


wr_cmd(0x9d);  //显示温度
wr_dat(0x30+d2);
wr_dat(0x30+d1);
wr_dat(0x2e);  //写入“.”号
wr_dat(0x30+d0);
}


//------------------------用户界面数据显示函数-------------------------------
void dat_dis()
{
wr_cmd(0x81);   //显示年
wr_dat(0x30+year%100/10);
wr_dat(0x30+year%100%10);


wr_cmd(0x83);   //显示月
wr_dat(0x30+mon/10);
wr_dat(0x30+mon%10);


wr_cmd(0x85);   //显示日
wr_dat(0x30+day/10);
wr_dat(0x30+day%10);


wr_cmd(0x91);   //显示时
wr_dat(0x30+hour/10);
wr_dat(0x30+hour%10);


wr_cmd(0x93);  //显示分     
wr_dat(0x30+min/10);   
wr_dat(0x30+min%10);


wr_cmd(0x95);   //显示秒
wr_dat(0x30+sec/10);     
wr_dat(0x30+sec%10);


wr_cmd(0x9d);  //显示温度
wr_dat(0x30+d2);
wr_dat(0x30+d1);
wr_dat(0x2e);  //写入“.”号
wr_dat(0x30+d0);
}


//-------------------------闹铃显示函数--------------------------------
void alarm_dis()
{
wr_cmd(0x01);  //lcd清屏
wr_cmd(0x91);  //设置第二行起始位
for(a=0;a<10;a++)  //写入第二行数据
{
  wr_dat(alarm2[a]);
}
wr_cmd(0x8a);  //设置第三行第三个汉字地址为起始位
for(a=0;a<8;a++)  //写入第三行数据
{
  wr_dat(alarm3[a]);
}
wr_cmd(0x8a);  //闹铃显示界面第三行时位置
wr_dat(0x30+hour_alarm/10);
wr_dat(0x30+hour_alarm%10);
wr_cmd(0x8c);  //闹铃显示界面第三行分位置
wr_dat(0x30+min_alarm/10);      
wr_dat(0x30+min_alarm%10);
}
  
//------------------------功能键盘扫描函数----------------------------------
void keyscan()
{      
do
{
  if(k0>6)   //key0按下超过6次的情况
  {
   k0=k0%6;
   if(k0==0)
   k0=6;   
  }  
  if(k0!=0)
  {
   switch(k0)
   {
    case 1:
    {
     TR0=0;  //关闭定时器0
     wr_cmd(0x0f);  //整体显示开,显示光标
     wr_cmd(0x95);  //光标地址指向秒位置
    }break;
    case 2:
    {
     wr_cmd(0x93);  //光标地址指向分位置
    }break;
    case 3:
    {
     wr_cmd(0x91);  //光标地址指向时位置
    }break;
    case 4:
    {
     wr_cmd(0x85);  //光标地址指向日位置
    }break;
    case 5:
    {
     wr_cmd(0x83);  //光标地址指向月位置
    }break;
    case 6:
    {
     wr_cmd(0x81);  //光标地址指向年位置
    }break;
   }
  }
  
  if(key0==0)  //key0的功能:校时模式
  {           
   delay_ms(10);
   if(key0==0)  //在校时模式时,按键key0不起作用
   {
    if(k1!=0)
     k0=0;
    else
    {
     while(key0==0);
     k0++;
    }
   }
  }
  if(key1==0)  //key1的功能:闹铃模式
  {
   delay_ms(10);
   if(key1==0)  //在闹铃模式时,按键key1不起作用
   {
    if(k0!=0)
     k1=0;
    else
    {
     while(key1==0);  //等待按键释放                     
     k1++;
     wr_cmd(0x01);  //lcd清屏
     alarm_dis();  //闹铃界面显示
    }
   }
  }
  if(k1>2)   //key1按下超过两次的情况
  {
   k1=k1%2;
   if(k1==0)
   k1=2;   
  }
  if(k1!=0)
  {
   switch(k1)
   {
    case 1:
    {
     wr_cmd(0x0f);  //整体显示开,显示光标
     wr_cmd(0x8c);  //光标地址指向分位置
    }break;
    case 2:
    {
     wr_cmd(0x8a);  //光标地址指向分位置
    }break;
   }
  }     
  if(key2==0)  //key2的功能:加计数
  {
   delay_ms(10);
   if(key2==0)
   {
    while(key2==0);
    if(TR0==0)  //校时模式加计数
    {
     switch(k0)
     {
      case 1:
      {
       sec++;
       if(sec==60)
        sec=0;
      }break;
      case 2:
      {
       min++;
       if(min==60)
        min=0;
      }break;
      case 3:
      {
       hour++;
       if(hour==24)
        hour=0;
      }break;
      case 4:
      {
       day++;
       if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)   
        temp_day=32;                       
       if(mon==4||mon==6||mon==9||mon==11)
        temp_day=31;
       if(mon==2)
       {
        if((year%4==0&&year%100!=0)||(year%4==0&&year%400==0))  //判断是否为闰年(四年一闰,百年不闰,四百年再闰)
         temp_day=30;  //是闰年的处理
        else  
         temp_day=29;  //不是闰年的处理
       }
       if(day==temp_day)
        day=1;
      }break;
      case 5:
      {
       mon++;
       if(mon==13)
        mon=1;
      }break;
      case 6:
      {
       year++;
       if(year==2100)
        year=2001;
      }break;
     }
     dat_dis();
    }
    if(k1!=0)   //闹铃模式加计数
    {
     switch(k1)
     {
      case 1:
      {
       min_alarm++;
       if(min_alarm==60)
        min_alarm=0;
      }break;
      case 2:
      {
       hour_alarm++;
       if(hour_alarm==24)
        hour_alarm=0;
      }break;
     }
     alarm_dis();  //显示闹铃模式界面
    }
   }
  }
   
  if(key3==0)  //key3的功能:确定返回
  {
   delay_ms(10);
   if(key3==0)
   {
    k0=0;  //将k0清零
    k1=0;  //将n0清零
    flag_alarm=1;  //闹铃标志位
    wr_cmd(0x0c);  //整体显示开,不显示光标
    TR0=1;  //开启定时器0
    wr_cmd(0x01);   //lcd清屏
    face_dis();  //显示主界面
   }
  }
}while(k0!=0||k1!=0);
}  


//-----------------------------初始化函数------------------------------------
void init()
{
P0=0xff;  //让数码管不显示
dula=0;   //关闭段选
wela=0;  //关闭位选


delay_ms(20);  //等待液晶输入电源稳定
lcdrd=1;  //选定lcd与单片机并行连接
lcdwr=0;   //因为我们不需要从lcd模块读数据,所以可直接将此端口清零,便于之后利用矩阵键盘
face_dis();   //显示用户界面


TMOD=0x11;  //选择定时器0方式1
TH0=(65536-46080)/256;  //赋初值,每隔50ms产生一次中断
TL0=(65536-46080)%256;
EA=1;  //开启总中断
ET0=1;  //开启定时器0中断
TR0=1;  //开启定时器0
}


//----------------进位判断函数------------------------
void carry()  //carry为“进位”的意思
{  
if(hour==hour_alarm&&min==min_alarm&&flag_alarm==0&&(hour_alarm!=0||min_alarm!=0))   //到时闹铃,当设定为00:00时闹定关闭
{
  flag_alarm=0;  //闹铃标志位清零
  wr_cmd(0x01);  //lcd清屏
  wr_cmd(0x0c);  //整体显示开,游标关,允许反白关
  while(flag_alarm==0)   //等待key3按下,将flag_alarm置位
  {
   beep_pro(0);     
   wr_cmd(0x91);  //设置第二行起始位
   for(a=0;a<10;a++)  //写入第二行数据
    wr_dat(alarm2[a]);
   wr_cmd(0x8a);  //设置第三行第三个汉字地址为起始位
   for(a=0;a<8;a++)  //写入第三行数据
    wr_dat(alarm3[a]);
   wr_cmd(0x8a);   //闹铃显示界面第三行时位置
   wr_dat(0x30+hour_alarm/10);
   wr_dat(0x30+hour_alarm%10);
   wr_cmd(0x8c);   //闹铃显示界面第三行分位置
   wr_dat(0x30+min_alarm/10);
   wr_dat(0x30+min_alarm%10);


   if(key3==0)   //key3的功能:确定返回,停止闹铃
   {
    delay_ms(10);
    if(key3==0)
    {
     wr_cmd(0x01);  //lcd清屏
     flag_alarm=1;  //闹铃标志位置位
     face_dis();
    }
   }
  }
}
if(flag_alarm==1&&(hour!=hour_alarm||min!=min_alarm))
{
  flag_alarm=0;
}
if(min==59&&(sec>=57&&sec<=59))  //整点前报时,2500Hz
{
  beep_pro(1);
  while(t0!=0);  //等待下一次秒自加
}
if(min==0&&sec==0)  //整点报时,5000Hz
{
  beep_pro(2);
  while(t0!=0);  //等待下一次秒自加   
}
if(sec==60)  //当sec=60为时一分
{
  sec=0;        
  min++;               
  if(min==60)   //当min=60为时一时
  {               
   min=0;
   hour++;
   if(hour==24)  //当hour=24为时一天                           
   {                    
    hour=0;
    day++;
    if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)  
    {                        
     if(day==32)
     {
      day=1;
      mon++;
      if(mon==13)               
      {
       mon=1;
       year++;
      }
     }
    }
    if(mon==4||mon==6||mon==9||mon==11)
    {
     if(day==31)
     {
      day=1;
      mon++;
      if(mon==13)
      {
       mon=1;
       year++;
      }
     }
    }
    if(mon==2)
    {
     if((year%4==0&&year%100!=0)||(year%4==0&&year%400==0))  //判断是否为闰年(四年一闰,百年不闰,四百年再闰)
     {
      if(day==30)
      {
       day=1;
       mon++;
       if(mon==13)
       {
        mon=1;
        year++;
       }
      }
     }
     else  //不是闰年的处理
     {
      if(day==29)
      {
       day=1;
       mon++;
       if(mon==13)
       {
        mon=1;
        year++;
       }
      }
     }
    }
   }
  }  
}
}


//-----------------------获温部分:初始化函数--------------------
void init_temp()
{
DQ=0;  //拉低总线,产生复位信号
i=80;while(i>0)i--;  //延时480~960us
DQ=1;  //拉高总线
i=4;while(i>0)i--;  //延时15~60us
while(DQ);  //等待产生应答脉冲
i=70;while(i>0)i--;  //延时至少480us
}


//------------------获温部分:写函数-------------------------------
void wr_temp(uchar dat)  //写1个字节
{
bit testb;
for(j=8;j>0;j--)
{
  testb=dat&0x01;
  dat=dat>>1;
  if(testb)  //写1
  {
   DQ=0;  //拉低总线,产生写时间隙
   i++;  //延时大于1us
   DQ=1;  //拉高总线
   i=8;while(i>0)i--;  //延时至少60us,供DS18B20采样
  }
  else    //写0
  {
   DQ=0;  //拉低总线,产生写时间隙
   i=8;while(i>0)i--;  //保持至少60us,供DS18B20采样
   DQ=1;  //拉高总线
   i++;i++;
  }
}
}


//------------------获温部分:读函数-------------------------------
uchar rd_temp()  //读1个字节
{
bit b;  //定义存放接收到的1个字节
uchar i_b;
uchar rdbyte;
for(j=8;j>0;j--)
{
  DQ=0;  //拉低总线,产生读时隙
  i++;  //延时大于1us
  DQ=1;  //释放总线
  i++;i++;  //给一定时间让总线释放
  b=DQ;  //读取数据
  i=8;while(i>0)i--;  //延时至少60us
  i_b=b;
  rdbyte=(i_b<<7)|(rdbyte>>1);  //将读取到得一位值左移7位,存放读取的数据变量rdbyte右移1位
}
return rdbyte;
}


//----------------------温度获取函数---------------------------
void get_temp()
{
init_temp();  //初始化,复位并获取应答信号
wr_temp(0xcc);  //跳过ROM
wr_temp(0x44);  //开始温度转换


init_temp();  //将DS18B20复位
wr_temp(0xcc);  //跳过ROM
wr_temp(0xbe);  //读暂存器
low=rd_temp();  //读取低8位
high=rd_temp();  //读取高8位


temp=high;
temp<<=8;
temp=temp|low;  //将读取的低8位和高8位合并
f_temp=temp*0.0625;  //温度在寄存器中为12位 分辨率位0.0625°
temp=f_temp*10+0.5;  //精确到十分位,四舍五入
d2=temp/100;  //显示数据:十位
d1=temp%100/10;  //显示数据:个位
d0=temp%10;  //显示数据:十分位
}


//-------------------定时器0中断函数--------------------
void timer0() interrupt 1
{
TH0=(65536-46080)/256;  //赋初值,每隔50ms产生一次中断
TL0=(65536-46080)%256;
t0++;  //用于产生基本秒信号
if(t0==20)
{
  t0=0;
  sec++;  //秒自加
}               
}


//-----------------主函数------------------------
void main()
{
init();   //初始化
while(1)
{
  carry();  //判断是否该年、月、日、时、分、秒是否要进位
  get_temp();  //获取温度
  keyscan();  //功能键盘扫描
  dat_dis();  //显示年、月、日、时、分、秒
  week_day(year,mon,day);  //星期计算,给出年月日,计算出星期几
}
}

出0入0汤圆

 楼主| 发表于 2012-1-29 20:02:05 | 显示全部楼层
回复【34楼】shwuliangchen
-----------------------------------------------------------------------

谢谢哦,数字钟方面的我可以参考你的程序了

出0入0汤圆

发表于 2012-2-20 16:15:01 | 显示全部楼层
我也要做了...你们写这种的话最好把状态机也给用上,,不然会纠结死了...

出0入0汤圆

发表于 2012-2-24 13:34:18 | 显示全部楼层
事实证明,如果有美女出现在论坛上,不管是图片,还是凤姐,都会引起一片的血雨腥风——————————————————————————————————

出0入0汤圆

发表于 2012-4-15 22:03:20 | 显示全部楼层
学习学习!

出0入0汤圆

发表于 2012-4-15 23:19:51 | 显示全部楼层
mark.学习了

出0入0汤圆

发表于 2012-4-17 01:34:11 | 显示全部楼层
我也在做这个···

出0入0汤圆

发表于 2012-4-17 07:57:02 | 显示全部楼层
学习学习!

出0入0汤圆

发表于 2012-4-17 10:48:02 | 显示全部楼层
只简单做过实验,没做到菜单这一级

出0入0汤圆

发表于 2012-4-18 21:28:55 | 显示全部楼层
lz 俺有预言:此贴必火!

出0入0汤圆

发表于 2012-4-19 00:39:05 | 显示全部楼层
坛子里菜单的例子挺多的啊!

出0入0汤圆

 楼主| 发表于 2012-4-22 10:56:23 | 显示全部楼层
wjjcyy 发表于 2012-2-20 16:15
我也要做了...你们写这种的话最好把状态机也给用上,,不然会纠结死了...

再过几天就交论文了,我投机取巧了,没把程序做出来,论文里不贴程序了,但是效果图都贴进去了,不知能不能混过去

出0入0汤圆

 楼主| 发表于 2012-4-22 10:57:22 | 显示全部楼层
小黑鱼1148 发表于 2012-4-18 21:28
lz 俺有预言:此贴必火!

又没啥东西做出来,怎么会火,。。。。

出0入0汤圆

发表于 2012-4-22 14:32:08 | 显示全部楼层
good      

出0入0汤圆

发表于 2012-4-26 17:02:26 | 显示全部楼层
有收获,要好好的研究一下了

出0入0汤圆

发表于 2012-5-25 13:25:09 | 显示全部楼层
sunsisijiang 发表于 2012-4-22 10:56
再过几天就交论文了,我投机取巧了,没把程序做出来,论文里不贴程序了,但是效果图都贴进去了,不知能不 ...

应该过去了吧..

出0入0汤圆

发表于 2012-5-25 13:27:35 | 显示全部楼层
sunsisijiang 发表于 2012-4-22 10:56
再过几天就交论文了,我投机取巧了,没把程序做出来,论文里不贴程序了,但是效果图都贴进去了,不知能不 ...

过去了....

出0入0汤圆

发表于 2012-5-25 13:57:09 | 显示全部楼层
我现在也在做点阵LCD,没这方面的经验,搞得很痛苦

出0入0汤圆

发表于 2012-10-10 10:41:24 | 显示全部楼层
呵呵,我也是刚学习,慢慢来

出0入0汤圆

发表于 2012-10-13 17:48:10 | 显示全部楼层
attach://58603.zip

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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