📄 main__.c
字号:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project :
Version :
Date : 2008-6-28
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
#include "ds1302ram.h"
#include "key.h"
#include "lcd.h"
#include "music.h"
#include "time.h"
#include "timing.h"
#include "usart.h"
#include "ds1302ram.c"
#include "ds1302ram.h"
#include "bcd.h"
/*****************************************************
函数void DS1302WriteOneWord(unsigned char addr, unsigned char data)
用于向DS1302的addr地址写入data的数据
*****************************************************/
void DS1302WriteOneWord(unsigned char addr, unsigned char data)
{
unsigned char i;
AVRInitDS1302ControlPort;
AVRSetDS1302DataPortWriteMode;
DS1302ClrRst;
#asm("nop")
#asm("nop")
DS1302ClrSclk;
#asm("nop")
#asm("nop")
DS1302SetRst;
#asm("nop")
#asm("nop")
for(i = 8; i > 0; i--)
{
if (addr & 0x01)
{
DS1302SetData;
}
else
{
DS1302ClrData;
}
#asm("nop")
#asm("nop")
DS1302SetSclk;
#asm("nop")
#asm("nop")
DS1302ClrSclk;
#asm("nop")
#asm("nop")
addr = addr >> 1;
}
for(i = 8; i > 0; i--)
{
if (data & 0x01)
{
DS1302SetData;
}
else
{
DS1302ClrData;
}
#asm("nop")
#asm("nop")
DS1302SetSclk;
#asm("nop")
#asm("nop")
DS1302ClrSclk;
#asm("nop")
#asm("nop")
data = data >> 1;
}
DS1302ClrRst;
#asm("nop")
#asm("nop")
}
/*****************************************************
函数unsigned char DS1302ReadOneWord(unsigned char addr)
用于从DS1302中的addr地址读取数据
*****************************************************/
unsigned char DS1302ReadOneWord(unsigned char addr)
{
unsigned char i;
unsigned char data;
AVRInitDS1302ControlPort;
AVRSetDS1302DataPortWriteMode;
DS1302ClrRst;
#asm("nop")
#asm("nop")
DS1302ClrSclk;
#asm("nop")
#asm("nop")
DS1302SetRst;
#asm("nop")
#asm("nop")
for(i = 8; i > 0; i--)
{
if (addr & 0x01)
{
DS1302SetData;
}
else
{
DS1302ClrData;
}
#asm("nop")
#asm("nop")
DS1302SetSclk;
#asm("nop")
#asm("nop")
DS1302ClrSclk;
#asm("nop")
#asm("nop")
addr = addr >> 1;
}
AVRSetDS1302DataPortReadMode;
data = 0;
for (i = 8; i > 0; i--)
{
data = data >> 1;
if (DS1302DataSet)
{
data |= 0x80;
}
DS1302SetSclk;
#asm("nop")
#asm("nop")
DS1302ClrSclk;
#asm("nop")
#asm("nop")
}
DS1302ClrRst;
#asm("nop")
#asm("nop")
return (data);
}
/*****************************************************
函数void DS1302WriteTimeData(void)用于向DS1302
写入时钟日期数据
*****************************************************/
void DS1302WriteTimeData(void)
{
DS1302WriteOneWord(0x8E, 0x00); //关闭写保护
DS1302WriteOneWord(0x80, 0x80); //关闭时钟
DS1302WriteOneWord(0x8C, bin2bcd(DS1302Data[6])); //写入年份
DS1302WriteOneWord(0x88, bin2bcd(DS1302Data[5])); //写入月份
DS1302WriteOneWord(0x86, bin2bcd(DS1302Data[4])); //写入日
DS1302WriteOneWord(0x8A, bin2bcd(DS1302Data[3])); //写入星期
DS1302WriteOneWord(0x84, bin2bcd(DS1302Data[2])); //写入小时
DS1302WriteOneWord(0x82, bin2bcd(DS1302Data[1])); //写入分钟
DS1302WriteOneWord(0x80, bin2bcd(DS1302Data[0])); //写入秒,开启时钟
DS1302WriteOneWord(0x8E, 0x80); //开启写保护
}
/*****************************************************
函数void DS1302ReadTimeData(void)用于从DS1302中
读取时钟日期数据
*****************************************************/
void DS1302ReadTimeData(void)
{
DS1302WriteOneWord(0x8E, 0x00); //关闭写保护
DS1302Data[6] = bcd2bin(DS1302ReadOneWord(0x8D)); //读取年份
DS1302Data[5] = bcd2bin(DS1302ReadOneWord(0x89)); //读取月份
DS1302Data[4] = bcd2bin(DS1302ReadOneWord(0x87)); //读取日
DS1302Data[3] = bcd2bin(DS1302ReadOneWord(0x8B)); //读取星期
DS1302Data[2] = bcd2bin(DS1302ReadOneWord(0x85)); //读取小时
DS1302Data[1] = bcd2bin(DS1302ReadOneWord(0x83)); //读取分钟
DS1302Data[0] = bcd2bin(DS1302ReadOneWord(0x81)); //读取秒
DS1302WriteOneWord(0x8E, 0x80); //开启写保护
}
/*****************************************************
函数void DS1302WriteRamData(void)用于向DS1302
写入闹钟数据
*****************************************************/
void DS1302WriteRamData(void)
{
DS1302WriteOneWord(0x8E, 0x00); //关闭写保护
DS1302WriteOneWord(0xCE, bin2bcd(noiseData[8]));
DS1302WriteOneWord(0xCC, bin2bcd(noiseData[6])); //写入年份
DS1302WriteOneWord(0xC8, bin2bcd(noiseData[5])); //写入月份
DS1302WriteOneWord(0xC6, bin2bcd(noiseData[4])); //写入日
DS1302WriteOneWord(0xCA, bin2bcd(noiseData[3])); //写入星期
DS1302WriteOneWord(0xC4, bin2bcd(noiseData[2])); //写入小时
DS1302WriteOneWord(0xC2, bin2bcd(noiseData[1])); //写入分钟
DS1302WriteOneWord(0xC0, bin2bcd(noiseData[0])); //写入秒
DS1302WriteOneWord(0x8E, 0x80); //开启写保护
}
/*****************************************************
函数void DS1302ReadRamData(void)用于从DS1302中
读取闹钟数据
*****************************************************/
void DS1302ReadRamData(void)
{
DS1302WriteOneWord(0x8E, 0x00); //关闭写保护
noiseData[8] = bcd2bin(DS1302ReadOneWord(0xCF));
noiseData[6] = bcd2bin(DS1302ReadOneWord(0xCD)); //读取年份
noiseData[5] = bcd2bin(DS1302ReadOneWord(0xC9)); //读取月份
noiseData[4] = bcd2bin(DS1302ReadOneWord(0xC7)); //读取日
noiseData[3] = bcd2bin(DS1302ReadOneWord(0xCB)); //读取星期
noiseData[2] = bcd2bin(DS1302ReadOneWord(0xC5)); //读取小时
noiseData[1] = bcd2bin(DS1302ReadOneWord(0xC3)); //读取分钟
noiseData[0] = bcd2bin(DS1302ReadOneWord(0xC1)); //读取秒
DS1302WriteOneWord(0x8E, 0x80); //开启写保护
}
/*****************************************************
函数void DS1302CheckDataOve(void)用于纠正校时数据的错误
*****************************************************/
void DS1302CheckDataOve(void)
{
unsigned char checkDayOve;
DS1302Data[7] = 20;
if (DS1302Data[0] > 59)
{
DS1302Data[0] = 59;
}
if (DS1302Data[1] > 59)
{
DS1302Data[1] = 59;
}
if (DS1302Data[2] > 23)
{
DS1302Data[2] = 23;
}
if (DS1302Data[6] > 50)
{
DS1302Data[6] = 50;
}
else if (DS1302Data[6] == 0)
{
DS1302Data[6] = 1;
}
if (DS1302Data[5] > 12)
{
DS1302Data[5] = 12;
}
else if (DS1302Data[5] == 0)
{
DS1302Data[5] = 1;
}
switch (DS1302Data[5])
{
case 2:
if (DS1302Data[6] % 4)
{
checkDayOve = 28;
}
else
{
checkDayOve = 29;
}
break;
case 4:
checkDayOve = 30;
break;
case 6:
checkDayOve = 30;
break;
case 9:
checkDayOve = 30;
break;
case 11:
checkDayOve = 30;
break;
default :
checkDayOve = 31;
break;
};
if (DS1302Data[4] > checkDayOve)
{
DS1302Data[4] = checkDayOve;
}
else if (DS1302Data[4] == 0)
{
DS1302Data[4] = 1;
}
}
#include "key.c"
#include "key.h"
void KeyInit(void)
{
//设置引脚的输入模式和输出模式
keyInputPortInputMode;
keyInputPortPullUp;
keyOutputPortOutputMode;
keyOutputPortInit;
keyMask = 0xF0; //屏蔽码,没有按键时为0xF0
keyValue = 0x00; //初始化键值为0
keyState = 0x00; //初始化按键状态为第0歌状态
}
/************************************************
函数unsigned char FindKeyValue (void)用于查找键值
************************************************/
unsigned char FindKeyValue (void)
{
unsigned keyReturn; //返回的键值,并初始化为无键值
keyReturn = 0;
switch (keyState)
{
case keyState0:
keyOutput2 = 1; //第二行置高电平
keyOutput1 = 0; //第一行置低电平,扫描第一行
keyValue = keyInput & keyMask; //读取键值
if(keyValue != keyMask) //如果有键按下,则进入状态1
{
keyState = keyState1;
}
else //否则第一行置高电平,第二行置低电平,扫描第二行
{
keyOutput1 = 1;
keyOutput2 = 0;
keyValue = keyInput & keyMask; //读取键值
if(keyValue != keyMask) //如果有键按下,则进入状态1
{
keyState = keyState1;
}
else //否则第二行也置高电平
{
keyOutput2 = 1;
}
}
break;
case keyState1:
if (keyValue == (keyInput & keyMask)) //如果读取的按键值和上次一样,则进入状态2,并判断按键,否则进入状态0
{
keyState = keyState2;
if (keyOutput1)
{
switch(keyValue)
{
case 0b11100000:
keyReturn = key1;
break;
case 0b11010000:
keyReturn = key2;
break;
case 0b10110000:
keyReturn = key3;
break;
case 0b01110000:
keyReturn = key4;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -