📄 1602.c
字号:
/*==============================================================*/
/*※※※※※※※※※※※※※系统主文※※※※※※※※※※※※※※*/
/*==============================================================*/
#include <at89x51.h>
#include "ds1302.c"
#include "frequence.c"
#include "song.c"
/////////////////////////////////
#define LCM_RS P0_6
#define LCM_RW P0_5 //定义LCD引脚
#define LCM_E P0_4
#define LCM_Data P2
#define key1 P1_0
#define key2 P1_1
#define key3 P1_2
#define key4 P1_3
#define key5 P1_4
/////////////////////////////////
#define Busy 0x80 //用检测LCM状态
#define uchar unsigned char
void WriteDataLCM(unsigned char WDLCM);//
void WriteCommandLCM(unsigned char WCLCM,BuysC);//
unsigned char ReadDataLCM(void);//
unsigned char ReadStatusLCM(void);//
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//
void display(uchar sec,uchar min,uchar hrs,uchar dte,uchar mon,uchar day,uchar yr);//(sec,min,hour,date日期,mon,day星期,year)
void LCMInit(void);//
void Delay5Ms(void);//
void Delay400Ms(void);//
void disp_clk_regs(void);
void Locatexy(char x,char y);//
uchar time_add(uchar i);
//////////////////////////////////////////////////
void function_choose(void);
void time_set(void);
void clock_set(void);
void clock_close(void);
void frequence();
void ele_source ();
void function_choose2();
void Timer();
void Swatch();
/*void Song();
void Ding_fre();
void Ding_ring();
void Ding_fre0();
void Ding_Stopw();*/
//////////////////////////显示字符几及asc码//////////////////////////////////////////////
//unsigned char data shuzi[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70}; //asc(0~9)
unsigned char code date[] = {"Date:"};
unsigned char code time[] = {"Time:"};
unsigned char code aa[]={":"};
unsigned char code bb[]={"."};
unsigned char code c[]={"C"};
//unsigned char code gn1 [] = {"Time:1.SHOW2.SET"};
//unsigned char code gn2 [] = {"Clok:1.SHOW2.SET"};
unsigned char code zf[7][8] = {"Second:","Minite:","Hour--:","Date--:","Mone--:","Year--:","Day---",};
unsigned char clock=0;
unsigned char clk[2]; //存储时间设置信息
//uchar D1_choose ;
//uchar D0_choose ;
uchar mh0,mh1,mm0,mm1,ms0,ms1;
//******************************
//延时子程序 //**
void delay(unsigned int win)//**
{ //**
unsigned int n; //**
n=0;
while(n < win)
{n++;}
}
void feng_ring()
{
P0_0=!(P0_0);
Delay400Ms();
P0_0=!(P0_0);
}
//////////////////////////////键盘程序/////////////////////////////////////////////////
void dely(void)
{uchar i=50;
while(i--);
}
uchar kscan (void)
{ uchar i=0;
if(P1!=0xff)
{ dely();
if (key1==0) i=1;
else if (key2==0) i=2;
else if (key3==0) i=3;
else if (key4==0) i=4;
else if (key5==0) i=5;
while(P1!=0xff); //消抖
}
return i; //返回键值
}
///////////////////////////////主程序///////////////////////////////////////////////////
void main(void)
{uchar G=0,S=0,key=0;
Inital:Delay400Ms(); //启动等待,等LCM讲入工作状态
initialize_DS1302a();//(0x32,0x24,0x23,0x14,0x02,0x03,0x07);
LCMInit(); //LCM初始化
Delay5Ms();
while(1)
{
DisplayListChar(0,0,"N0.1");
DisplayListChar(6,0,"N0.2");
DisplayListChar(12,0,"N0.3");
DisplayListChar(0,1,"Time");
DisplayListChar(6,1,"Fre");
DisplayListChar(12,1,"V/A");
G=3;S=0;
Locatexy(G,S);
while(1)
{key=kscan();
if(key==4)
{ if(G==3)
{ G=9;Locatexy(G,S); }
else if(G==9)
{ G=15 ;Locatexy(G,S); }
else if(G==15)
{ G=3 ;Locatexy(G,S); }
}
else if(key==1)
{ if(G==15)
{ G=9;Locatexy(G,S); }
else if(G==9)
{ G=3;Locatexy(G,S); }
else if(G==3)
{ G=15;Locatexy(G,S); }
}
else if(key==5)
break;
}
if(G==3) { G=S=0;function_choose();if(key==5)goto Inital;}
else if(G==9) { G=S=0; frequence();goto Inital; }
else if(G==15) { G=S=0; ele_source ();goto Inital;}
}
}
////////////////////////////////主函数/////////////////////////////////////
/*===================闹钟功能选择======================*/
void function_choose(void)
{ uchar G=0,S=0,key=0;
T_inital: LCMInit();
Delay5Ms();
while(1) //功能选择
{ DisplayListChar(0, 0,"Time:1.Show2.SET"); //时间显示以及时间设置
DisplayListChar(0, 1,"Clok:1.Clos2.SET"); //时间显示以及闹钟设置
G=0;S=0;
Locatexy(G,S);
while(1) //设置并移动光标
{key=kscan();
if(key==4)
{ if(G==0)
{ G=5;Locatexy(G,S); }
else if(G==5)
{ G=11;Locatexy(G,S); }
else if(G==11)
{function_choose2();goto T_inital; }
}
else if(key==1)
{ if(G==11)
{ G=5;Locatexy(G,S); }
else if(G==5)
{ G=0;Locatexy(G,S); }
}
else if(key==2||key==3)
{ if(S==0)
{ S=1;Locatexy(G,S); }
else if(S==1)
{ S=0;Locatexy(G,S); }
}
else if(key==5)
break;
}
if (G==0) break;
if(G==5&&S==0) { G=S=0;disp_clk_regs();goto T_inital;} //时间显示
else if(G==11&&S==0) { G=S=0;time_set();goto T_inital; } //时间设置
else if(G==5&&S==1) { G=S=0;clock_close();goto T_inital;} //时间显示
else if(G==11&&S==1) { G=S=0;clock_set(); goto T_inital; } //闹钟设置
}
}
void function_choose2()
{
uchar G=0,S=0,key=0;
T2_inital: LCMInit();
Delay5Ms();
while(1)
{ DisplayListChar(0, 0,"NO.1");
DisplayListChar(6, 0,"NO.2");
DisplayListChar(12, 0,"NO.3");
DisplayListChar(0, 1,"Timer");
DisplayListChar(6, 1,"StopW");
DisplayListChar(12, 1,"Song");
G=0;S=0;
Locatexy(G,S);
while(1)
{key=kscan();
if(key==4)
{ if(G==0)
{ G=3;Locatexy(G,S); }
else if(G==3)
{ G=9;Locatexy(G,S); }
else if(G==9)
{G=15;Locatexy(G,S); }
}
else if(key==1)
{ if(G==15)
{ G=9;Locatexy(G,S); }
else if(G==9)
{ G=3;Locatexy(G,S); }
else if(G==3)
{G=0;Locatexy(G,S); }
else if (G==0) break;
}
else if(key==5)break;
}
if (G==0) break;
if(G==3) { G=S=0;Timer();if(key==5)goto T2_inital;}
else if(G==9) { G=S=0; Swatch();goto T2_inital; }
else if(G==15) { G=S=0;Song();goto T2_inital;}
}
}
void Swatch()
{uchar G=3,S=0,key=0;
EA=1;TMOD=0X10;ET1=1;TR1=0;
TL1=(0xffff-10000)&0xff;
TH1=(0xffff-10000)>>8;
Locatexy(G,S);
mh1=0;mh0=0;mm1=0;mm0=0;ms1=0;ms0=0;
D1_choose=1;
LCMInit();
Delay5Ms();
DisplayListChar(3, 0,"StopWatch");
while(1)
{ key=kscan();
DisplayOneChar (4,1,shuzi[mh1]);
DisplayOneChar (5,1,shuzi[mh0]);
DisplayOneChar (6,1,aa[0]);
DisplayOneChar (7,1,shuzi[mm1]);
DisplayOneChar (8,1,shuzi[mm0]);
DisplayOneChar (9,1,aa[0]);
DisplayOneChar (10,1,shuzi[ms1]);
DisplayOneChar (11,1,shuzi[ms0]);
if(TR1==0&&(key==1||key==2))
{TR1=1;}
else if(TR1==1&&(key==1||key==2))
{TR1=0;}
else if(TR1==0&&(key==4||key==3))
{mh1=0;mh0=0;mm1=0;mm0=0;ms1=0;ms0=0;}
if (key==5)break;
}
}
void Ding_Stopw()
{
TL1=(0xffff-10000)&0xff;
TH1=(0xffff-10000)>>8;
ms0++;
if(ms0==10)
{ms0=0;ms1++;
if (ms1==10)
{ms1=0;mm0++;
if (mm0==10)
{mm0=0;mm1++;
if (mm1==6)
{mm1=0;mh0++;
if(mh0==10)
{ mh0=0;mh1++;}
if (mh0==0&&mh1==10)
{mh0=0;mh1=0;}
}
}
}
}
}
/************************* LCD 时钟显示函数 *****************************/
void disp_clk_regs()
{ uchar sec, min, hrs, dte, mon, day, yr;
uchar key=0;
P3_0=1;
LCMInit(); //LCD清屏
DisplayListChar(0, 0, date);//显示"Date:"
DisplayListChar(0, 1, time);//显示"Time:"
while(1) // 读取并显示时钟寄存器的内容
{
reset_3w();
wbyte_3w(0xBF); // 以多字节突发方式读取时钟数据
sec = rbyte_3w(); // 秒
min = rbyte_3w(); // 分
hrs = rbyte_3w(); // 小时
dte = rbyte_3w(); // 日期
mon = rbyte_3w(); // 月份
day = rbyte_3w(); // 星期
yr = rbyte_3w(); // 年
reset_3w();
display(sec, min, hrs, dte, mon, day, yr);
if(clock==1)
{DisplayOneChar(15, 1, c[0]); //显示闹钟标志"C"
if(hrs==clk[0]&&min==clk[1])
{
feng_ring();
}
else if(min=!clk[1])
P0_0=0;
}
key=kscan();
if(key==5) break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -