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

📄 clkdemo.c

📁 epson mcu 启动代码与动画实现
💻 C
字号:

/*** include header files ***/
#include 	<string.h>
#include	<stdlib.h>
#include	"ascifont.h"

/*** definition constant ***/
#define	VramStt			0xf800					//display start memory
#define	VramXmax		0x32					//X display memory max size
#define	VramYstep		0x100					//Y step memory size
#define	AscSizeX		6						//ASCII SIZE
#define	AscPosiMaxX		VramXmax-AscSizeX+1		//X Max Count
#define	AscPosiMaxY		3						//Y Max Count
#define	NULL			0

/*** function prototype ***/
unsigned char disp_stringY8(char x, char y, unsigned char *string);
unsigned char disp_charY8(char x, char y, unsigned char charac);
void set_reg(void);
void _interrupt(0x22) rtclock (void);
void _interrupt(0x0e) rtkeyscan(void);
/*** SFR definition ***/
_sfrbyte	sfr_lcd1	_at(0xff10);
_sfrbyte	sfr_lcd2	_at(0xff11);
_sfrbyte	sfr_intpri1	_at(0xff20);
_sfrbyte	sfr_intena1	_at(0xff22);
_sfrbyte	sfr_intena2	_at(0xff23);
_sfrbyte	sfr_intfnc1	_at(0xff24);
_sfrbyte	sfr_intfnc2	_at(0xff25);
_sfrbyte	sfr_wchtmr1	_at(0xff40);
_sfrbyte	sfr_sik1	_at(0xff50);
_sfrbyte	sfr_kcp1	_at(0xff52);
_sfrbyte	sfr_kd1		_at(0xff54);
_sfrbyte	sfr_r27		_at(0xff75);
_sfrbyte	sfr_r2xd	_at(0xff75);

/*** global variable ***/
char*	p_clkdata;
unsigned char g_intflg;					//BIT 2 	1 	 0		interrupt:1
										//	  reset stop start

//========================================================================
//====  main routine  ====================================================
//========================================================================
int main(void) {
	//*** variable definition ***
	unsigned char *vram;
	unsigned char x=0,y=0,err=0;

	vram = (unsigned char *) VramStt;

	//----------------------  set I/O register  ---------------------------
	// <display>
	sfr_lcd1 = 0x00;				/* 5 x 8 dot font
									   1/32 duty */
	sfr_lcd2 = 0x17;				/* area 0
									   normal display
									   initial contrast = 7 */
	/*<clock>*/
	sfr_intpri1 |= 0x03;			// set interrupt priority 3
	sfr_wchtmr1 |= 0x02;			// reset clock timer
	sfr_intena1 |= 0x01;			// 1Hz interrupt enable
	sfr_wchtmr1 |= 0x01;			// run clock timer
	/*<Key>*/
	sfr_r27=0x7f;					// R27 0 OUTPUT
	sfr_intpri1 |= 0xc0;			// set interrupt priority 3
	sfr_intena2	|=0x08;				// K00乣K03 interrupt enable
	sfr_sik1=0x07;					// K00乣K02 interrupt enable
	sfr_kcp1=0xff;					// interrupt select reg

	//-------------------  clear MCU Vram  --------------------------------
	do {
		do {
        	*(vram + x) = 0;
		} while ((x++) <= VramXmax);

		vram += VramYstep;
		x = 0;
		y++;
	} while (y < 4);

	p_clkdata=(char*)malloc(10);
	strcpy((char*)p_clkdata,"00:00:00");
	// <all interrupt enable>
	#pragma asm
		AND SC,#00111111b				; all interrupt enable
	#pragma endasm
	//flag clear
	g_intflg=0;
	//---------------------  Main Loop  ----------------------------------
	do {
		//<reset WDT>
		sfr_wchtmr1 |= 0x04;
		//<Halt>
		_halt();
		//<check K0x port input>
		set_reg();
		//<display clock data>
		err = disp_stringY8(0,0,(unsigned char *)p_clkdata);
	} while(1);
//    free((char*)p_clkdata);
}
//========================================================================
//====  display string (y8bit)  ==========================================
//========================================================================
unsigned char disp_stringY8(char x, char y, unsigned char *string) {
	unsigned char err = 0; 

	while ((*string != NULL) || err !=0) {
		err = disp_charY8(x,y,*string);
		string ++;
		x += AscSizeX;
	}

	return (err);

}
//========================================================================
//====  display character (y8bit)  =======================================
//========================================================================
unsigned char disp_charY8(char x, char y, unsigned char charac) {
	unsigned char *vram, *ascfont;
	unsigned char i = 0, err = 0; 

	charac -= AscCodeMin;

	if ((x <= AscPosiMaxX) && (y <= AscPosiMaxY) && (charac <= AscCodeMax)){
		vram = (unsigned char *)(VramStt + x + y * VramYstep);
		ascfont = (unsigned char *)(AsciiFontTbl + charac * AscFontStp);

		for (i=0 ; i < AscFontStp ; i++){
			*(vram++) = *(ascfont++);
		}
	}
	else {
		err = 1;
	}

	return (err);

}
//========================================================================
//====  <1Hz clock interrupt> clock  =====================================
//========================================================================
void _interrupt(0x22) rtclock (void) {
	char*	pdata;
	//------------------  reset interrupt flag  --------------------------
	sfr_intfnc1 = 1;

	//------------------  second increment  ------------------------------
    pdata=p_clkdata;
	if ((*(pdata+7)+=1) > 0x39) 
	{
		*(pdata+7) = 0x30;
		if ((*(pdata+6)+=1) > 0x35) 
		{
			*(pdata+6) = 0x30;
			if ((*(pdata+4)+=1) > 0x39) 
			{
				*(pdata+4)= 0x30;
				if ((*(pdata+3)+=1) > 0x35) 
				{
					*(pdata+3)= 0x30;
					if ((*(pdata+1)+=1) > 0x34) 
					{
						*(pdata+1) = 0x30;
						if ((*pdata+=1) > 0x32) 
						{
							*pdata = 0x30;
						}
					}
				}
			}
		}
	}
}
//========================================================================
//====  <Key input interrupt>        =====================================
//========================================================================
void _interrupt(0x0e) rtkeyscan(void)
{
	//------------------  reset interrupt flag  --------------------------
	sfr_intfnc2	=0x08;
	
	//------------------  K port read			--------------------------
	if((sfr_kd1 & 0x01)==0x00)				//k00 input
	{
		//--------------  timer start			--------------------------
		if((sfr_wchtmr1 & 0x01)==0x00)
			g_intflg|=0x01;					// flag set
	}
	if((sfr_kd1 & 0x02)==0x00)				// k01 input
	{
		//--------------  timer stop			--------------------------
		if((sfr_wchtmr1 & 0x01)==0x01)
			g_intflg|=0x02;					// flag set
	}
	if((sfr_kd1 & 0x04)==0x00)				// k02 input
	{
		//--------------  timer reset			--------------------------
		g_intflg|=0x04;						// flag set
	}
}
//========================================================================
//====  <regster set>		         =====================================
//========================================================================
void set_reg(void)
{
	unsigned char flag;
	flag=g_intflg;
	//--------------  timer start			--------------------------
	if((flag & 0x01)==0x01)
	{
		sfr_wchtmr1 |= 0x01;				// run clock timer
		sfr_intena1 |= 0x01;				// 1Hz interrupt enable
		g_intflg &= 0xfe;					// flag clear
	}
	//--------------  timer stop			--------------------------
	if((flag & 0x02)==0x02)
	{
		sfr_intena1 &= 0xfe;				// 1Hz interrupt enable
		sfr_wchtmr1 &= 0xfe;				// stop clock timer
		g_intflg &= 0xfd;					// flag clear
	}
	//--------------  timer reset			--------------------------
	if((flag & 0x04)==0x04)
	{
		strcpy( (char*)p_clkdata,"00:00:00");	// data clear
		sfr_wchtmr1 |= 0x02;				// reset clock timer
		g_intflg &= 0xfb;					// flag clear
	}
}

⌨️ 快捷键说明

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