📄 main.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 + -