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

📄 g19264.c

📁 这是一个用STC单片机作的,带液晶显示屏的万年历程序,并有串行接收部份,大家一定要珍惜用.
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "g19264-ly.h"
#include <stdio.h>
//#include<INTRINS.H>
//#include <absacc.h>

#define  Uchar unsigned char
#define  uchar unsigned char
#define  uint unsigned int
#define  ulong unsigned long int
#define  byte unsigned char
#define  word unsigned int
#define  ulong unsigned long int

extern uchar  data second, minute, hour, week, day, month, year;
extern word   data date, time;//从控制器下载的时间暂存储变量
uchar  ahour1=6,ahour2=11,ahour3=13,ahour4=20,ahour5=20,aminute1=40,aminute2=40,aminute3=30,aminute4=40,aminute5=40;
#pragma NOAREGS;
extern void wr_time(void);			//写时间到8563
extern void byt_to_time(void);		//计算时间	
extern void time_to_byt(void);		//计算时间	
extern void rd_time(void);	//从时间芯片中读时间到second,minute,hour,week等变量中			
void Putcdot(Uchar Order);
void Putedot(Uchar Order);
void Putedotbig(Uchar Order);
void readkey();//读键盘
uchar keyscan(void);// 键扫描函数
void Delay100ms(unsigned char x);
void init_serial();


void dpcard()//显示卡号
{	uchar data  i,a,b,c,d,e,g;
	uchar temp;
    dword data temp1;
	uchar *p;
	read_count=0;
 	i=0;
	BEEP=0;
    BL=0;
	Lcmcls();
	p=card_id;

	temp=card_id[0];  
	a=temp%10;temp=temp/10;
	b=temp%10;temp=temp/10;
	c=temp;
	col=50;row=3;
    Putedot(c);    Putedot(b);Putedot(a);
   	Putedot(10);//显示空格


	temp1=card_id[1]*256+card_id[2];//合并卡号
	a=temp1%10;temp1=temp1/10;//卡号用十进制显示
	b=temp1%10;temp1=temp1/10;
	c=temp1%10;temp1=temp1/10;
	d=temp1%10;temp1=temp1/10;
	e=temp1%10;temp1=temp1/10;
	g=temp1;
    Putedot(g);    Putedot(e);Putedot(d);
    Putedot(c);    Putedot(b);Putedot(a);
  	Putedot(10);//显示空格

	WDT_CONTR=WDT;//启动看门狗
	BEEP=1; 
	Delay100ms(15);
   	for(i=0;i<3;i++)card_id[i]=0;//清空卡数据缓冲区
    i=0;	   BL=1;
	Lcmcls();
}

void serial(void) interrupt 4		//通讯中断
{
	while(RI)
	  {RI=0;
	  if(read_count==0)card_id[0]=SBUF;
	  if(read_count==1)card_id[1]=SBUF;
	  if(read_count==2)card_id[2]=SBUF;
	  read_count++;
	  }

}

void alarm_pd(void)
{
	if((hour==ahour1)&(minute==aminute1))alarm=1;
	if((hour==ahour2)&(minute==aminute2))alarm=1;
	if((hour==ahour3)&(minute==aminute3))alarm=1;
	if((hour==ahour4)&(minute==aminute4))alarm=1;
	if((hour==ahour5)&(minute==aminute5))alarm=1;
}

void startbell(void)
{	uchar i;
	alarm_pd();
	if(alarm==1)
		{
		  for(i=0;i<3;i++)
		     {
			   BEEP=0;
			   Delay100ms(1);
			   BEEP=1;
			   Delay100ms(2);
			   BEEP=0;
			   Delay100ms(1);
			   BEEP=1;
			   Delay100ms(2);
			   BEEP=0;
			   Delay100ms(1);
			   BEEP=1;
			   BEEP=0;
			   Delay100ms(3);
			   BEEP=1;
			   Delay100ms(10);
	           WDT_CONTR=WDT;//启动看门狗

			 }
		 }
	 alarm=0;
}

void Delay100ms(unsigned char x)
{   
  unsigned char i,j;
  while(x != 0)
  {
 	for (j = 1 ;j <= 100 ; j++)
	{   	
//		WDT_CONTR=WDT;//启动看门狗
		for (i = 1 ;i <= 140 ; i++){_nop_() ; _nop_() ; _nop_() ; _nop_() ;};
	}
	x--;
  }
}


uchar keyscan(void)// 键扫描函数

{
	uchar scancode,tmpcode;
	P2 = 0xf0;			 					// 发全0行扫描码
	if ((P2&0xf0)!=0xf0)					// 若有键按下
	{
		  Delay100ms(1);    					// 延时10ms去抖动
		if ((P2&0xf0)!=0xf0)				// 延时后再判断一次,去除抖动影响
		{
			scancode = 0xfe;
			while((scancode&0x10)!=0)		// 逐行扫描
			{
				P2 = scancode;				// 输出行扫描码
				if ((P2&0xf0)!=0xf0)		// 本行有键按下
				{   
					tmpcode = (P2&0xf0)|0x0f;/* 返回特征字节码,为1的位即对应于行和列 */
					return((~scancode)+(~tmpcode));
			
				}
				else scancode = (scancode<<1)|0x01;		// 行扫描码左移一位
			}
		}
	}
	return('a');								// 无键按下,返回值为a 	
}

void readkey()//读键盘
{   
    uchar key;
	key = keyscan();					// 调用键盘扫描函数
//	WDT_CONTR=WDT;//启动看门狗
	switch(key)
   		{
      		case 0x11:						// 1行1列,数字*
			{BEEP=0;Delay100ms(1);BEEP=1;
			 keybuf='*';
             keydn=1; 
            }
			break;

			case 0x21:						// 1行2列,数字0
			{
				BEEP=0;	Delay100ms(1);BEEP=1;
				keybuf = 0;keydn=1;
			}
			break;	
		
  			case 0x12:					 	// 2行1列,数字7
				{
					BEEP=0;	Delay100ms(1);BEEP=1;
					keybuf =7;keydn=1;
				}
			break;	
		
     		case 0x22:						// 2行2列,数字8
				{
					keybuf = 8;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;

			case 0x42:						// 2行3列,数字9
				{
					keybuf = 9;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;
			case 0x14:						// 3行1列,数字4
				{
					keybuf = 4;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;
			case 0x24:						// 3行2列,数字5
				{
					keybuf = 5;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;
			case 0x44:						// 3行3列,数字6
				{
					keybuf = 6;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;

			case 0x18:						// 4行1列,数字3
				{
					keybuf = 1;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;
			case 0x28:						// 4行2列,数字2
				{
					keybuf = 2;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;
			case 0x48:						// 4行3列,数字1
				{
					keybuf = 3;keydn=1;
					BEEP=0;	Delay100ms(1);BEEP=1;
				}
				break;

			case 0x41:						       // 1行3列,确认键 #
				{enterflg = 1;	keydn=1;			// 确认键按下
			 	 BEEP=0;	Delay100ms(1);BEEP=1;
				}
			break;
			default:break;
		}
}
void disptime()
{
  	Uchar a,b;

	col=32;	row=2;
	Locatexy();
	a=hour/10;b=hour%10;
	Putedotbig(a);	Putedotbig(b);//显示时+

	Putedotbig(10);

	WDT_CONTR=WDT;//启动看门狗

	a=minute/10;
	b=minute%10;
	Putedotbig(a);	Putedotbig(b);//显示分

	col+=5;row=5;
	Locatexy();
	a=second/10;
	b=second%10;
	Putedot(a);	Putedot(b);//显示秒

}

void dispdata()
{	
	Uchar a,b;
	col=8;	row=0;
	Locatexy();
	a=2,b=0;
    Putedot(a);    Putedot(b);
	a=year/10;b=year%10;
    Putedot(a);    Putedot(b);
	Putcdot(0);	//显示年

	a=month/10;b=month%10;
    Putedot(a);    Putedot(b);
	Putcdot(1);	//显示月

	WDT_CONTR=WDT;//启动看门狗

	a=day/10;b=day%10;
    Putedot(a);    Putedot(b);
	Putcdot(2);	//显示日
	col+=20;
	Putcdot(6);	//显示星期
	Putcdot(7);	
    Putedot(week); 

}
void adj_time()//时间调整
{ 	uchar a,b;
//	Lcmcls();
	BL=0;//开背光
//	rd_time();	//从时间芯片中读时间到second,minute,hour,week等变量中			
//	WDT_CONTR=WDT;//启动看门狗
//	time_to_byt();		//计算时间	
    enterflg=0;//清确认键标志
	keydn=1;//键盘按下标志有效
	a=year/10;
	b=year%10;
	keybuf=a;
	keydn=0;
    while(enterflg==0)
		{ 
		  col=24,row=0;
		  Putedot(a);//显示年的高位
		  readkey();
		  if(keydn==1)WDT_CONTR=WDT;//启动看门狗
		  a=keybuf;
		  Delay100ms(3);
		  col=24,row=0;
   		  Putedot(10);//显示空格
		  Delay100ms(3);
		  keydn=0;
		  }
	WDT_CONTR=WDT;//启动看门狗
	enterflg=0;
	col=24,row=0;
    Putedot(a);//显示年的高位

	keybuf=b;
    while(enterflg==0)
		{ 		  
		  col=32,row=0;
		  Putedot(b);//显示年的低位
		  readkey();
		  if(keydn==1)WDT_CONTR=WDT;//启动看门狗
		  b=keybuf;
		  Delay100ms(3);
		  col=32,row=0;
   		  Putedot(10);//显示空格
		  Delay100ms(3);
		  keydn=0;
		  }
	WDT_CONTR=WDT;//启动看门狗
	year=a*10+b;  
	col=32,row=0;
    Putedot(b);//显示分的低位
	enterflg=0;

    a=month/10;b=month%10;
	keybuf=a;
    while(enterflg==0)
		{ 		  
		  col=56,row=0;
		  Putedot(a);//显示年的低位
		  readkey();
		  if(keydn==1)WDT_CONTR=WDT;//启动看门狗
		  a=keybuf;
		  Delay100ms(3);
		  col=56,row=0;
   		  Putedot(10);//显示空格
		  Delay100ms(3);
		  keydn=0;
		  }
	WDT_CONTR=WDT;//启动看门狗
	enterflg=0;
	col=56,row=0;
    Putedot(a);//显示年的高位

	keybuf=b;
    while(enterflg==0)
		{ 		  
		  col=64,row=0;
		  Putedot(b);//显示年的低位
		  readkey();
		  if(keydn==1)WDT_CONTR=WDT;//启动看门狗
		  b=keybuf;
		  Delay100ms(3);
		  col=64,row=0;
   		  Putedot(10);//显示空格
		  Delay100ms(3);
		  keydn=0;
		  }
	WDT_CONTR=WDT;//启动看门狗
	month=a*10+b;  
	col=64,row=0;
    Putedot(b);//显示分的低位
	enterflg=0;//


    a=day/10;b=day%10;
	keybuf=a;
    while(enterflg==0)
		{ 		  
		  col=88,row=0;
		  Putedot(a);//显示年的低位
		  readkey();
		  if(keydn==1)WDT_CONTR=WDT;//启动看门狗
		  a=keybuf;
		  Delay100ms(3);
		  col=88,row=0;
   		  Putedot(10);//显示空格
		  Delay100ms(3);
		  keydn=0;
		  }
	WDT_CONTR=WDT;//启动看门狗
	enterflg=0;
	col=88,row=0;
    Putedot(a);//显示年的高位

	keybuf=b;
    while(enterflg==0)
		{ 		  
		  col=96,row=0;
		  Putedot(b);//显示年的低位
		  readkey();
		  if(keydn==1)WDT_CONTR=WDT;//启动看门狗
		  b=keybuf;
		  Delay100ms(3);
		  col=96,row=0;
   		  Putedot(10);//显示空格
		  Delay100ms(3);
		  keydn=0;
		  }
	WDT_CONTR=WDT;//启动看门狗
	day=a*10+b;  
	col=96;row=0;
    Putedot(b);//显示分的低位
	enterflg=0;

	b=week;
	keybuf=b;

⌨️ 快捷键说明

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