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

📄 main.bak

📁 NEC单片机0537demo开发板的程序
💻 BAK
字号:
/*********************** (C) COPYRIGHT 2008 GETSOON************************
* File Name					: main.c
* Author						: Tsinming
* Date First Issued	: 08/08/2008
* Description				: Main program body
***************************************************************************
* History:
* 09/18/2008: V1.0
* 08/08/2008: V0.1
**************************************************************************/
#include "ke2demo.h"

/* Variable defintion----------------------------------------------------*/
bit	ack_signal, configflg, beepflg, keybflg;
u8	IICData[8], MenuNum, Key1count;
sreg	u16	TempData;

/* Functions defintion---------------------------------------------------*/
void init_cpu(void);
void init_para(void);
void task(void);
void task1(void);
void delaynop(void);
void iic_start(void);
void iic_stop(void);
void iic_sendbyte(u8 data_byte);
u8 iic_receivebyte(void);
u8 iic_sendpage(u8 device_addr, u8 word_addr, u8 *word_data, u8 word_acount);
u8 iic_receivepage(u8 device_addr, u8 word_addr, u8 *word_data, u8 word_acount);
void iic_giveack(u8 wgive_bit);
u8 gettemp(void);
void adsigndis(void);
void startmusic(void);
void keymusic(void);
void buzzerdrv(u16 time1, u16 time2, u8 hfreq, u8 lfreq);
void buzzerdrv2(u16 time);
void keydisplay(void);

/*-----------------------------------------------------------------------*/

void main(void)
{
	IMS = 0xCC;
	IXS = 0x00;

	DI();
	init_cpu();
	EI();
	init_para();
	lcdinit();
	ledinit();
	iic_receivepage(0xA0, 0x0, IICData, 8);
	eepread();
	leddriver();
	lcddriver();
	startmusic();
	
	while(1)
	{
		WDTE = 0xAC;
		keymusic();
		if(Flg2048hz != 0)							//2048Hz  488.88125us
		{
			Flg2048hz = 0;
			task();
		}
	}
}

void task1(void)
{
	lcd_time = 0;
	lcd_data = 0;
	lcd_temp = 0;
	switch(MenuNum)
	{
	case 0:
		timedrive();
		break;
	case 1:
		datadrive();
		break;
	case 2:
		tempdrive();
		break;
	case 3:
		config();
		break;
	default:
		break;
	}
}

void task(void)
{
	if((TimeBase & 0x07FF) == 0)			//1Hz
	{
		if(Key1flg)
		{
			if(P7.0 == 0)
			{
				Key1count++;
				if(Key1count >= 5)
				{
					MenuNum = 3;
					Key1count = 0x0;
					Key1flg = 0;
					configflg = 1;
					ConfPara = CalYear;
				}
			}
		}
		if((TimeMin & 0x03) == 0)				//write eeprom each four minutes
		{
			eepwrite();
			iic_sendpage(0xA0, 0x0, IICData, 8);
		}
	}
	
	if((TimeBase & 0x01FF) == 0)			//4Hz
	{
		keydisplay();
		task1();
		gettemp();
		ledlight();
		adsigndis();
		leddisplay();
		leddriver();
		lcddisplay();
		lcddriver();
	}
}

/*-----------------------------------------------------------------------*/
void startmusic(void)
{
	timecount = 0x0;
	beepflg = 1;
	SetBit(TMHMD0, 0x80);
	while(beepflg)
	{
		WDTE = 0xAC;
		buzzerdrv(0, 100, 84, 1);
		buzzerdrv(100, 235, 84, 0);
		buzzerdrv(235, 335, 74, 1);
		buzzerdrv(335, 470, 74, 0);
		buzzerdrv(470, 570, 65, 1);
		buzzerdrv(570, 705, 65, 0);
		buzzerdrv(705, 805, 54, 1);
		buzzerdrv(805, 1818, 54, 0);
		buzzerdrv2(1818);
	}
}

void keymusic(void)
{
	if(Keyflg != 0)
	{
		timecount = 0x0;
		keybflg = 1;
		Keyflg = 0;
		SetBit(TMHMD0, 0x80);
	}
	if(keybflg != 0)
	{
		buzzerdrv(0, 74, 103, 1);
		buzzerdrv(74, 1059, 103, 0);
		buzzerdrv2(1059);
	}
}

/* BEEPDRIVER------------------------------------------------------------*/
void buzzerdrv(u16 time1, u16 time2, u8 hfreq, u8 lfreq)
{
	if((timecount > time1) && (timecount <= time2))
	{
		BUZZER = lfreq;
		CMP00 = hfreq;
	}
}

void buzzerdrv2(u16 time)
{
	if(timecount > time)
	{
		ClrBit(TMHMD0, 0x80);
		beepflg = 0;
		keybflg = 0;
	}
}

/*-----------------------------------------------------------------------*/
void keydisplay(void)
{
	if(P7.0 & P7.1 & P7.2 & P7.3)
	{lcd_key = 0;}
	else
	{lcd_key = 1;}
}

/*-----------------------------------------------------------------------*/
void iic_start(void)
{
	SCL_MODE = 0;
	SDA_MODE = 0;
	SDA_PIN = 1;
	SCL_PIN = 1;
	delaynop();
	SDA_PIN = 0;
	SCL_PIN = 0;
}

void iic_stop(void)
{
	SDA_PIN = 0;
	SCL_PIN = 1;
	SDA_PIN = 1;
}

void iic_sendbyte(u8 data_byte)
{
	register u8 i;
	for(i = 0; i < 8; i++)
	{
		if((data_byte << i) & 0x80)
			{SDA_PIN = 1;}
		else
			{SDA_PIN = 0;}
		SCL_PIN = 1;
		delaynop();
		SCL_PIN = 0;
	}
	SDA_MODE = 1;
	SCL_PIN = 1;
	delaynop();
	ack_signal = SDA_PIN;
	SDA_MODE = 0;
	SCL_PIN = 0;
}

u8 iic_receivebyte(void)
{
	u8 data_byte = 0x0;
	register u8 i;
	SDA_MODE = 1;
	for(i = 0; i < 8; i++)
	{
		SCL_PIN = 0;
		delaynop();
		SCL_PIN = 1;
		data_byte <<= 1;
		data_byte |= SDA_PIN;
	}
	SCL_PIN = 0;
	SDA_MODE = 0;
	return(data_byte);
}

u8 iic_sendpage(u8 device_addr, u8 word_addr, u8 *word_data, u8 word_acount)
{
	u8 i;
	iic_start();
	iic_sendbyte(device_addr);
	if(ack_signal)return FAILED;
	iic_sendbyte(word_addr);
	if(ack_signal)return FAILED;
	for(i = 0; i < word_acount; i++)
	{
		iic_sendbyte(*word_data);
		if(ack_signal)return FAILED;
		word_data++;
	}
	iic_stop();
	return PASSED;
}

u8 iic_receivepage(u8 device_addr, u8 word_addr, u8 *word_data, u8 word_acount)
{
	u8 i;
	iic_start();
	iic_sendbyte(device_addr);
	if(ack_signal)return FAILED;
	iic_sendbyte(word_addr);
	if(ack_signal)return FAILED;
	iic_start();
	iic_sendbyte(device_addr + 1);
	if(ack_signal)return FAILED;
	for(i = 0; i < (word_acount - 1); i++)
		{
			*word_data = iic_receivebyte();
			iic_giveack(0);
			word_data++;
		}
	*word_data = iic_receivebyte();
	iic_giveack(1);
	iic_stop();
	return PASSED;
}

void iic_giveack(u8 wgive_bit)
{
	SDA_MODE = 0;
	SDA_PIN = wgive_bit;
	SCL_PIN = 1;
	delaynop();
	SCL_PIN = 0;
}

/*-----------------------------------------------------------------------*/
void delaynop(void)
{
	NOP();
	NOP();
	NOP();
}

/*-----------------------------------------------------------------------*/
u8 gettemp(void)
{
	TempData = 0x0;
	iic_start();
	iic_sendbyte(0x90);			//slave address
	if(ack_signal)return FAILED;
	iic_sendbyte(0x0);			//slave address
	if(ack_signal)return FAILED;
	iic_start();
	iic_sendbyte(0x91);			//slave address
	if(ack_signal)return FAILED;
	TempData |= iic_receivebyte();
	TempData <<= 8;
	iic_giveack(0);
	TempData |= iic_receivebyte();
	iic_giveack(1);
	iic_stop();
	return PASSED;
}

/*-----------------------------------------------------------------------*/
void adsigndis(void)
{
	u8 i;
	i = (ADValue >> 4);
	ADSign = 0x0;
	for(; i > 0; i--)
	{ADSign |= (0x0001 << (i - 1));}
}

/**************************************************************************
* Function Name	: init_cpu
* Description		: initialization
**************************************************************************/
void init_cpu(void)
{
	//clock generator, after reset: OSCCTL = 0x00; MCM = 0x00; MOC = 0x80; OSTS = 0x05; PCC = 0x01;
	SetBit(OSCCTL, 0x41);		// X1
	ClrBit(PCC, 0xFF);			// CPU Clock = Fxp
	SetBit(PCC, 0x40);
	ClrBit(MOC, 0xFF);			// X1 operating
	SetBit(MCM, 0x05);			// Main system clock & Peripheral hardware : high-speed system clock
	while(MCS == 0)
	{}
	SetBit(RCM, 0x01);			// Stop internal oscillator
	
	//Port Initialization, PMX(X=1~7,12,14) after reset: 0xFF
	ClrBit(PM2, 0x0F);			// P20~P23 is output for LED
	ClrBit(P2, 0x0F); 
	ClrBit(PM4, 0x0F);			// P40~P43 is output for LED
	ClrBit(P4, 0x0F); 
	ClrBit(PM0, 0x1C);			// P02~P04 is output for LEDdigit
	ClrBit(PM14, 0x02);			// P14.1 is out for Buzzer
	ClrBit(PM1, 0x80);			// P1.7 is out for TM50 square-wave
  ClrBit(PM1, 0x20);			// P1.5 is out for TM80 square-wave
  SetBit(PM7, 0x0F);			// P7.0~3 is key int
  SetBit(PU7, 0x0F);
	
	//TIMER00, after reset: TMC00 = 0x00; CRC00 = 0x00; PRM00 = 0x00; 
	TMIF000 = 0;
	TMMK000 = 0;
	CR000 = 9765;						// 10000;  3906.25(8M_2048Hz);  9765.625(20M_2048Hz)
	SetBit(TMC00, 0x0C);		// Clear & start mode entered upon a match between TM00 and CR000 
	
	//TIMER01, after reset: TMC01 = 0x00; CRC01 = 0x00; PRM01 = 0x00; 
	TMIF010 = 0;
	TMMK010 = 0;
	CR010 = 1249;						// 1ms
	PRM01 = 0x01;						// 1.25MHz(20MHz)
	SetBit(TMC01, 0x0C);		// Clear & start mode entered upon a match between TM01 and CR010 
	
	//TMH0_beep output
  SetBit(TMHMD0, 0x31);		// 312.5KHz(20MHz)

	//TM50 setting
	SetBit(CR50, 0xA0);
	SetBit(TCL50, 0x02);
	SetBit(TMC50, 0x07);
	SetBit(TMC50, 0x80);
  
  //watch timer initialization;                 
	SetBit(WTM, 0x80);			// Fw = Fsub = 32.768K
	WTIF = 0;                                     
	WTMK = 0;                                     
	SetBit(WTM, 0x03);			// Start watch timer. 

	
	//AD converter
	SetBit(ADM, 0x11);
	SetBit(ADPC, 0x06);			//0x07 in KE2 v1.0
	SetBit(ADS, 0x06);			//0x07 in KE2 v1.0
	SetBit(ADM, 0x90);
	ADIF = 0;
	ADMK = 0;
	
	SetBit(KRM, 0x0F);
	KRIF = 0;
	KRMK = 0;
}

/**************************************************************************
* Function Name	: init_para
* Description		: initialization the Variable
**************************************************************************/
void init_para(void)
{
	u8 i;
	for(i = 0; i < 13; i++)
	{LcdDisData[i] = 0xFF;}
	for(i = 0; i < 8; i++)
	{ADValueArray[i] = 0x0;}
	for(i = 0; i < 8; i++)
	{LedDisData[i] = 0xFF;}
	ADCount = 0x0;
	ADValue = 0x0;
	LedNum = 0x00BC614E;
	Flg2048hz = 0;
	Keyflg = 0;
	keybflg = 0;
	Key1flg = 0;
	configflg = 0;
	TimeBase = 0x0;
	Key1count = 0x0;
	LedLData = 0xFE;
	MenuNum = 0x0;
	timecount = 0x0;
}

/********************** (C) COPYRIGHT 2008 GETSOON************************/

⌨️ 快捷键说明

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