⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 农历.c

📁 本程序是一个液晶时钟程序
💻 C
字号:
									//***********************************************************
//***********12864LCD多功能液晶时钟********************  	
//*本系统采用4个按键,人性化的菜单显示.
//主界面显示的参数:阳历,阴历干支年,星期,时分秒,闹钟,温度,公共节日,节气;
//功能参数:密码,232通信输出,红外控制,阳历,阴历,读U盘;
//作者:陈志伟
//设计日期:2007年11月~2007年12月;
//交流QQ:871993824

/***************************************************************/
#include	<sfr.h>
#include    <Calendar.h>
//typedef unsigned char uchar;		//自定义关键字
//typedef unsigned int  uint;
//LCD接口定义
sbit BUSY_FLAG=P2^7;		 //液晶模块忙标志
sbit RS =P0^0;               //模式位,为0输入指令,为1输入数据
sbit RW =P0^1;               //读写位,为0读,为1写
sbit E =P0^2;                //使能位
sbit PSB=P0^3;
#define	LCD_DATA P2		     //液晶数据口
//LCD指令集定义
#define	ClearDisplay	0x01					//清显示指令
#define	EntryModeSet	0x06					//设置输入模式
#define	DisplayOnCtrl	0x0c					//设置开显控制
#define	FunctionSetB	0x30					//功能设定(基本指令)
#define	FunctionSetE	0x34					//功能设定(扩充指令)
#define	FuncDrawOn		0x36					//设置绘图功能
//内存定义
uchar lcdPosX, lcdPosY;							//X,Y坐标
uchar halfScr, halfLineCnt, basicBlock;			//半屏,半屏行数,N*8块
uchar yy,mo,dd,xq,hh,mm,ss;         //定义时间映射全局变量
uchar keys,state,cishu;					//键值keys,状态state,次数time
bit setting;
//定义累加器A中的各位
sbit a7   = ACC ^ 7;
//键盘引脚定义
sbit key_1 =P1^0;	          //功能:设置兼返回
sbit key_2 =P1^1;	          //功能:调整位加1
sbit key_3 =P1^2;	          //功能:指向下一项
sbit key_4 =P1^3;	          //功能:确定当前操作
//定义DS1302时钟接口
sbit clock_clk = P3^1;        //ds1302_clk(时钟线)
sbit clock_dat = P3^0;        //ds1302_dat(数据线)
sbit clock_Rst = P1^4;        //ds1302_Rst(复位线
//温度传感器定义
sbit DQ = P1^5;             //ds18B20)
//灯与扬声器定义
sbit	led_secd =P3^3;      //秒闪烁灯
sbit	BEEP     =P1^6;      //扬声器
//表格2的格式:键码+次态+执行模块
uchar fun_zero[4]={1,1,0,0};
uchar fun_one[7]={1,1,0,0};
/***************************************************************/
//功能:延时ms毫秒
void delayMs (uchar ms) 
{  uchar i;
   while (--ms)
	{ for(i=0; i<125; i++);}
}
/***************************************************************/
//功能:蜂鸣器响一声
void beepBl (void)
{
	uchar i;
	for(i=0; i<100; i++)
	{ delayMs(2);BEEP = !BEEP; }
	BEEP = 1;
}
/***************************************************************/
//功能:延时sec秒
void delaySec (uchar sec) 
{
	uchar i;
	while(--sec)
	{ for(i=0; i<200; i++)
		{delayMs(6);}
	}
}
/***************************************************************/
//功能:LCD检测忙信号
void checkLcdBusy (void) 
{ 	LCD_DATA = 0xff;
	RS = 0;
	RW= 1;
	E = 1;
	while (BUSY_FLAG);
	E= 0;
}
/***************************************************************/
//功能:LCD写命令
//输入参数:控制命令Command
void lcdWriteCommand (uchar Command) 
{	checkLcdBusy();
	RS = 0;
	RW = 0;
	LCD_DATA = Command;
	E = 1;
	delayMs(1);
	E = 0;
}
/***************************************************************/
//功能:清除液晶屏幕
void lcdClear (void) 
{	lcdWriteCommand(ClearDisplay); }
/***************************************************************/
//功能:液晶初始化
void lcdInit (void)
{	lcdWriteCommand(FunctionSetE);
	lcdWriteCommand(FunctionSetB);
	lcdClear();
	lcdWriteCommand(EntryModeSet);
	lcdWriteCommand(DisplayOnCtrl);
}
/***************************************************************/
//功能:LCD写数据
//输入参数:显示的单个字节Data
void lcdWriteData (uchar Data) 
{ 	checkLcdBusy();
	RS = 1;
	RW= 0;
	LCD_DATA = Data;
	E= 1;
	delayMs(1);
	E= 0;
}
/***************************************************************/
//功能:向LCD写入坐标
void wrPosition (void) 
{  	lcdWriteCommand(FunctionSetE);
	lcdWriteCommand(lcdPosY);
	lcdWriteCommand(lcdPosX);
	lcdWriteCommand(FunctionSetB);
}
/***************************************************************/
//功能:显示自定义的图形
//输入参数:图形数据bmp,Cls=清除图形屏幕选项(OFF为不清屏,即显示图形,ON为清屏)
void displayPhoto (uchar *bmp, uchar bmpCls) 
{
	lcdPosX = 0x80;
	halfScr = 2;
	
	for (;halfScr != 0; halfScr--)
	{  	lcdPosY = 0x80;	halfLineCnt = 32;
		for (;halfLineCnt != 0; halfLineCnt--)
		{  basicBlock = 16;	wrPosition ();			
			for (; basicBlock != 0; basicBlock--)
			{	if (bmpCls == 0) { lcdWriteData (*bmp++);}
				else if(bmpCls==1){ lcdWriteData (0x00);}
			}
			lcdPosY++;
		}
		lcdPosX = 0x88;
	}
	lcdWriteCommand(FuncDrawOn);
	lcdWriteCommand(FunctionSetB);
}
/***************************************************************/
//功能:字符反白显示
//输入参数:反白字符的行cx,列cy,长度width
void convertChar (uchar CX, CY, width) 
{
	displayPhoto(0,1);
	lcdPosY = 0x80;

	if (CX == 0)
	{ 	CX = 0x80;halfLineCnt = 16;	}
	else if (CX == 1){CX = 0x80;halfLineCnt = 32;}
	else if (CX == 2){CX = 0x88;halfLineCnt = 16;}
	else if (CX == 3){CX = 0x88;halfLineCnt = 32;}
	lcdPosX = CX + CY;
	
    for (; halfLineCnt != 0; halfLineCnt--)
	{ 	basicBlock = width;
		wrPosition();	
		for (;basicBlock != 0; basicBlock--)
		{  if (halfLineCnt > 16) {lcdWriteData(0x00); }
		   else {lcdWriteData (0xff);}
		}
		lcdPosY++;
	}
	lcdWriteCommand(FuncDrawOn);
	lcdWriteCommand(FunctionSetB);
}
/***************************************************************/
//功能:向LCD写一个字符串
//输入参数:行x,列y,每一位显示时间speed,显示字符串首地址msg
void lcdword (uchar X, Y, speed, uchar *msg) 
{
	if (X==0){ X=0x80;}
	else if (X==1){ X=0x90;}
	else if (X==2){ X=0x88;}
	else if (X==3){ X=0x98;}
	Y = X + Y;
	lcdWriteCommand(Y);
	while (*msg)
	{ lcdWriteData(*msg++);delayMs(speed);}
}
//功能:实时更新LCD界面的各个数据
void lcd_Interface(void)
{	uchar *p;
	uint i=0;
	uchar a=0,b=0,c=0;
	if(read_clock(0x81) != ss)
	{	//判断是否需要更新
		ss = read_clock(0x81);	    //更新数据
		lcdWriteCommand(0x9f);		    //秒值在LCD上的写入位置
		lcdWriteData((ss/16)+0x30);	//写十位		
		lcdWriteData(ss%16+0x30);	    //写个位
		led_secd=~led_secd;		    //LED闪烁
		Refresh();	                //刷新日期的其他数据

		/**lcdWriteCommand(0x85);		    //温度在LCM上的写入位置
		lcdWriteData(0x20);				//显示符号'|'
		i=ReadTemperature();        //读温度并送显
		a=i/100;
		lcdWriteData(a+0x30);	        //显示温度十位
		b=i/10-a*10;
		lcdWriteData(b+0x30);	        //显示个位
		lcdWriteData(0x2e);	            //显示"."
		c=i-a*100-b*10;
		lcdWriteData(c+0x30);            //显示小数位	
		lcdWriteData(0x43);	            //显示度C
		****/
	GetChinaCalendarStr(yy,mo,dd,p);
	lcdword(2,0,1,p);          //界面上更新农历
		//if(JieQiStr_2word(yy,mo,dd,q)==1)
		//lcdword(2,6,1,q);			//界面上更新节气
     }
 }
/***************************************************************/
void mode_one(void)
{   setting=1;
    lcdClear();
	lcdword(0, 0, 1, "    重设密码");
	lcdword(1, 0, 1, "    设置时间");
	lcdword(2, 0, 1, "    设置闹钟");
	lcdword(3, 0, 1, "    查看农历");
	switch(cishu)
	{ 	case 0:	convertChar(0, 2, 8);break;
	    case 1: convertChar(1, 2, 8);break;
		case 2:	convertChar(2, 2, 8);break;
		case 3: convertChar(3, 2, 8);break;
		case 4:	lcdword(0, 0, 1, "    设置时间");
	            lcdword(1, 0, 1, "    设置闹钟");
	            lcdword(2, 0, 1, "    查看农历");
				lcdword(3, 0, 1, "    查看阳历");
				convertChar(3, 2, 8);break;	
	}
	cishu++;
	if(cishu==5)cishu=0;
}
/***************************************************************/
//功能:根据获得的键值和当前的状态来确定下一步执行模块的次态
void view_state(void)
{ 
  uchar i,x,*p;
   switch(state)
   {case 0: p=&fun_zero[0];break;
	default: break;
	}
  for(i=1;i<+4;i++)
  { if(keys==*p)             //表中的是不是和读取的键码一致
   {++p;state=*p;		     //存放读取的状态
    ++p;x=*p;			     //附读取的执行模块的代码
    switch(x)
    {case 0: mode_one();i=4;break;
     //ase 2: in_min();i=4;break;
    // case 3: mode23_ret1();i=4;break;
    // case 4: add_one();i=4;break;
     //case 5: set_done_ret23();i=4;break;
    default: break;
    }
   }
   	else if(0==*p)i=4;
	p=p+3;
  }
}
/***************************************************************/
//读取键盘
void read_key(void)
{ 
  P1|=0x0f;keys=P1; //先保护P3口 
  keys|=0xf0;	  //屏蔽其他位
  if((~keys)!=0)		 //有效按键
   {delayMs(50);         //消抖动
    keys=P1; keys|=0xf0;
	if((~keys)==0) keys=0;
    switch(keys)
	{ case 0xfe:keys=1;break;
	  case 0xfd:keys=2;break;
	  case 0xfb:keys=3;break;
	  case 0xf7:keys=4;break;
	  default: break;		
	}
   }
   else keys=0;  
}
/***************************************************************/
//主程序开始
void main (void)
{ uchar InitLine,i;
  state=0;
  cishu=0;
 Init_1302();
 lcdInit ();
 lcdClear();
 lcdword(0, 0, 20, "  多功能液晶时钟");
 lcdword(1, 0, 20, "设计者: 电容器");
 lcdword(2, 0, 20, "仪表技术科陈志伟");
 lcdword(3, 0, 20, "交流QQ:287458808");
 delaySec(8);
 lcdClear();
 lcdword(0, 1, 20, "请稍等::::::::::");
 convertChar(0, 1, 8);
 lcdword(2, 0, 20, "系统初始化::::::");
 for (InitLine=0; InitLine<17; InitLine++)
  { convertChar(2, 0, InitLine);
	delaySec(2);
  }
 lcdClear();
 while(1)
 {if(setting==0) //正在设置则不刷新
  lcd_Interface(); //刷新主界面
   read_key();	  //读取键盘
   if(keys!=0) view_state(); //根据键值执行相应的操作
   for(i=1;i<=25;i++)
   delayMs(30);
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -