m12232a.c

来自「DS1302显示时钟」· C语言 代码 · 共 1,809 行 · 第 1/4 页

C
1,809
字号
}

/************************************************************************
函数名:
参数:
功能:写数据
返回值:
************************************************************************/
void lcdwd(uchar dispdata){
	if(Lcd_CurrentX<61){
		lcdwd1(dispdata);
	}
	else{
		lcdwd2(dispdata);
	}
}

/************************************************************************
函数名:
参数:
功能:内部数据地址指针定位
返回值:
************************************************************************/
void lcdpos(void){
	if(Lcd_CurrentX<61){
		lcdwc(LCD_CMD_COL|(Lcd_CurrentX&0x3f));      //设置地址列指针(芯片1)
	}
	else{
		lcdwc(LCD_CMD_COL|((Lcd_CurrentX-61)&0x7f)); //设置地址列指针(芯片2)
	}
	lcdwc(LCD_CMD_PAGE|((Lcd_CurrentY/8)&0x3));      //设置地址页指针
}

/************************************************************************
函数名:
参数:
功能:读数据
返回值:
************************************************************************/
uchar lcdrd(void){
	uchar i;
	if(Lcd_CurrentX<61){
		i=lcdrd1();      //读两次
		i=lcdrd1();
	}
	else{
		i=lcdrd2();
		i=lcdrd2();
	}
	lcdpos();
	return i;
}

/************************************************************************
函数名:
参数:
功能:当前坐标移动到下一个点
返回值:
************************************************************************/
void lcdcursornext(void){
	Lcd_CurrentX++;
	if(Lcd_CurrentX>LCD_RIGHT){
		Lcd_CurrentX=LCD_LEFT;
		Lcd_CurrentY+=8;
		if(Lcd_CurrentY>LCD_BOTTOM){
			Lcd_CurrentY=LCD_TOP;
		}
	}
}

/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void displaybyte(uchar dispdata){
	lcdpos();         //内部数据地址指针定位
	lcdwd(dispdata);  //写数据
	lcdcursornext();  //当前坐标移动到下一个点
}

/************************************************************************
函数名:
参数:
功能:整屏显示
返回值:
************************************************************************/
void lcdfill(uchar FillData){
	for(Lcd_CurrentX=LCD_LEFT,Lcd_CurrentY=LCD_TOP;1;){
		DogReset();
		displaybyte(FillData);
		if((Lcd_CurrentX==LCD_LEFT)&&(Lcd_CurrentY==LCD_TOP)){
			break;
		}
	}
}

/************************************************************************
函数名:
参数:
功能:初始化
返回值:
************************************************************************/
void lcdreset(){
	lcdwc1(0xe2); lcdwc2(0xe2);   //复位
	lcdwc1(0xc0); lcdwc2(0xc0);   //设置显示初始行
	lcdwc1(0xa0); lcdwc2(0xa0);   //设置列序方向为正向
	lcdwc1(0xa4); lcdwc2(0xa4);   //设置显示模式为正常显示
	lcdwc1(0xa9); lcdwc2(0xa9);   //设置占空比为1/32
	lcdwc1(0xaf); lcdwc2(0xaf);   //开显示
}

/**************************************************************************
*    函数原型: void ComOutChar(unsigned char OutData);
*    功    能: 向串口输出一个字符(非中断方式)
**************************************************************************/
/*
void ComOutChar(unsigned char OutData){
	SBUF = OutData; //输出字符
	while(!TI); //空语句判断字符是否发完
	TI = 0; //清TI
}

/**************************************************************************
*    函数原型: unsigned char KeyScan(void);2*6键盘
*    功    能: 对按键进行扫描,返回键值
**************************************************************************/
uint KeyScan(void){

	uint iColumnScan;
	uint iKey;

	KS1=0;
	KS2=0;
	if((P2&0x0F)==0x0F){
		KS1=1;
		KS2=1;
		return(vKeyVal_Null);				// 若无键按下,则返回0,并清除键值
	}
	iKey=0;
	
	// 扫描第一行
	KS1=0;
	KS2=1;
	if((P2&0x0F)!=0x0F){
		iColumnScan=~(P2&0x0F)&0x0F;		// 被按下键对应位为1
		iColumnScan&=0x000F;
		iKey|=iColumnScan;
	}
	
	// 扫描第二行
	KS1=1;
	KS2=0;
	if((P2&0x0F)!=0x0F){
		iColumnScan=~(P2&0x0F)&0x0F;			// 被按下键对应位为1
		iColumnScan<<=4;
		iColumnScan&=0x000F;
		iKey|=iColumnScan;
	}
	
	KS1=1;
	KS2=1;
	return(iKey);

}

/**************************************************************************
*    函数原型: unsigned char KeyScan(void);3*3键盘
*    功    能: 对按键进行扫描,返回键值
**************************************************************************/
/*
uint KeyScan(void){

	uint iColumnScan;
	uint iKey;

	KS1=0;
	KS2=0;
	KS3=0;
	if((P1&0x07)==0x07){
		KS1=1;
		KS2=1;
		KS3=1;
		return(vKeyVal_Null);				// 若无键按下,则返回0,并清除键值
		}

	iKey=0;
	// 扫描第一行
	KS1=0;
	KS2=1;
	KS3=1;
	if((P1&0x07)!=0x07){
		iColumnScan=~(P1&0x07)&0x07;		// 被按下键对应位为1
		iColumnScan&=0x0007;
		iKey|=iColumnScan;
		}
	// 扫描第二行
	KS1=1;
	KS2=0;
	KS3=1;
	if((P1&0x07)!=0x07){
		iColumnScan=~(P1&0x07)&0x07;			// 被按下键对应位为1
		iColumnScan<<=4;
		iColumnScan&=0x0070;
		iKey|=iColumnScan;
		}
	// 扫描第三行
	KS1=1;
	KS2=1;
	KS3=0;
	if((P1&0x07)!=0x07){
		iColumnScan=~(P1&0x07)&0x07;			// 被按下键对应位为1
		iColumnScan<<=8;
		iColumnScan&=0x0700;
		iKey|=iColumnScan;
		}
	KS1=1;
	KS2=1;
	KS3=1;
	return(iKey);

}

/**************************************************************************
*    函数原型: unsigned char KeyScan(void);3*4键盘
*    功    能: 对按键进行扫描,返回键值
**************************************************************************/
/*
uint KeyScan(void){

	uint iColumnScan;
	uint iKey;

	P1&=0x8f;
	if((P1&0x0f)==0x0f){
		P1|=0x70;
		return(vKeyVal_Null);				// 若无键按下,则返回0,并清除键值
		}

	iKey=0;

	// 扫描第一行
	P1&=0x8f;
	P1|=0x60;
	if((P1&0x0f)!=0x0f){
		iColumnScan=~(P1&0x0f)&0x0f;		// 被按下键对应位为1
		iColumnScan&=0x000f;
		iKey|=iColumnScan;
		}

	// 扫描第二行
	P1&=0x8f;
	P1|=0x50;
	if((P1&0x0f)!=0x0f){
		iColumnScan=~(P1&0x0f)&0x0f;			// 被按下键对应位为1
		iColumnScan<<=4;
		iColumnScan&=0x00f0;
		iKey|=iColumnScan;
		}

	// 扫描第三行
	P1&=0x8f;
	P1|=0x30;
	if((P1&0x0f)!=0x0f){
		iColumnScan=~(P1&0x0f)&0x0f;			// 被按下键对应位为1
		iColumnScan<<=8;
		iColumnScan&=0x0f00;
		iKey|=iColumnScan;
		}

	P1|=0x70;
	return(iKey);

}

/**************************************************************************
*    函数原型: unsigned char KeyScan(void);4*4键盘
*    功    能: 对按键进行扫描,返回键值
**************************************************************************/
/*
uint KeyScan(void){

	uint iColumnScan;
	uint iKey;

	P1&=0x0f;
	if((P1&0x0f)==0x0f){
		P1|=0xf0;
		return(vKeyVal_Null);				// 若无键按下,则返回0,并清除键值
		}

	iKey=0;

	// 扫描第一行
	P1&=0x0f;
	P1|=0x70;
	if((P1&0x0f)!=0x0f){
		iColumnScan=~(P1&0x0f)&0x0f;		// 被按下键对应位为1
		iColumnScan&=0x000f;
		iKey|=iColumnScan;
		}

	// 扫描第二行
	P1&=0x0f;
	P1|=0xb0;
	if((P1&0x0f)!=0x0f){
		iColumnScan=~(P1&0x0f)&0x0f;			// 被按下键对应位为1
		iColumnScan<<=4;
		iColumnScan&=0x00f0;
		iKey|=iColumnScan;
		}

	// 扫描第三行
	P1&=0x0f;
	P1|=0xd0;
	if((P1&0x0f)!=0x0f){
		iColumnScan=~(P1&0x0f)&0x0f;			// 被按下键对应位为1
		iColumnScan<<=8;
		iColumnScan&=0x0f00;
		iKey|=iColumnScan;
		}

	// 扫描第四行
	P1&=0x0f;
	P1|=0xe0;
	if((P1&0x0f)!=0x0f){
		iColumnScan=~(P1&0x0f)&0x0f;			// 被按下键对应位为1
		iColumnScan<<=8;
		iColumnScan&=0xf000;
		iKey|=iColumnScan;
		}

	P1|=0xf0;
	return(iKey);

}

/**************************************************************************
*    函数原型: uchar KeyAction(void);
*    功    能: 按键动作类型
	 返 回 值: 当按键为空,  返回值为vKeyType_Null=0
	 		   当按键按下时,返回值为vKeyType_Push=1
	           当按键弹起时,按回值为vKeyType_Pop =2
	           当按键长按时,返回值为vKeyType_Keep=3
*************************************************************************/
uchar KeyAction(void){

	uint iVal;

	iVal=KeyScan();
	if(iVal==iKeyVal){
		// 无按键
		if(iVal==vKeyVal_Null){
			return(vKeyAct_Null);
			}
		// 按键保持
		else{
			return(vKeyAct_Keep);
			}
		}
	else{
		delay_ms(10);
		if(KeyScan()==iVal){
			// 按键弹起
			if(iVal==vKeyVal_Null){
				iKeyValPre=iKeyVal;
				iKeyVal=iVal;
				return(vKeyAct_Pop);
				}
			// 按键按下
			else{
				iKeyValPre=iKeyVal;
				iKeyVal=iVal;
				return(vKeyAct_Push);
				}
			}
		}
}

/**************************************************************************
*    函数原型: void KeyHandle(void);
*    功    能: 处理键盘输入
**************************************************************************/
void KeyHandle(void){

	uchar cKeyType;
	uchar i;

	DogReset();

	cKeyType=KeyAction();
	if(cKeyType==vKeyAct_Push){
		switch(iKeyVal){

			case vKeyVal_1:
SBUF=0x01;
//				lcdfill(0);    //清屏
				if(KeyCount++>Count){
					KeyCount=0;
				}
//				DisplayRecord(KeyCount);

				break;

			case vKeyVal_2:
SBUF=0x02;
//				lcdfill(0);    //清屏
//				DisplayTime();
				break;

			case vKeyVal_3:
SBUF=0x03;
//				lcdfill(0);    //清屏
				timeRead();
				vSecond=0;
				vSecondST=0;
				Byte_Write(vSecondAddr, 0);//秒清零
				break;

			case vKeyVal_4://开机次数
SBUF=0x04;
//				lcdfill(0);    //清屏
				break;

			case vKeyVal_5://开始时长
SBUF=0x05;
//				lcdfill(0);    //清屏
				timeRead();
				vMinute=0;
				vMinuteST=0;
				Byte_Write(vMinuteAddr, 0);//分清零
				break;

			case vKeyVal_6:
SBUF=0x06;
				lcdfill(0);    //清屏
				Count=0;
				Byte_Write(CountAddr, Count);
				for(i=0;i<Count;i++){
					Sector_Erase(RecordBaseAddr+i*0x1ff);//记录相应也要清除
				}
				WriteString(0, 16, "次数:00");//次数清零
				WriteString(0, 0, "时间:");
				break;

			case vKeyVal_7:
SBUF=0x07;
//				lcdfill(0);    //清屏
				timeRead();
				vHour=0;
				vHourST=0;
				Byte_Write(vHourAddr, 0);//时清零

⌨️ 快捷键说明

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