📄 main.c
字号:
#include <p18f2520.h> //头文件引用
//大LED数码管显示代码表
const unsigned char LEDCODE[]=
{
0x3F,0x06,0x5B,0x4F,//0,1,2,3
0x66,0x6D,0x7D,0x07,//4,5,6,7
0x7F,0x6F, //8,9
};
//宏定义
#define TRUE 1
#define FALsE 0
//-------------------------------------------------------------
//---定义软件定时器定时1s和0.5秒结构体变量
struct TIMER_sTRUCT
{
unsigned int Interval;
unsigned char Enable;
};
struct TIMER_sTRUCT second_1s,second_Halfs;
//-------------------------------------------------------------
//-------------------------------------------------------------
//---定义实时带温度与闹铃功能的日历/时钟结构体变量
struct REALCLOCK_sTRUCT
{
unsigned char Year; //年份
unsigned char Month; //月份
unsigned char Day; //日
unsigned char Week; //星期
unsigned char Hour; //时
unsigned char Minute; //分
unsigned char second; //秒
unsigned char Temp; //温度
};
struct REALCLOCK_sTRUCT RealClock;
//-------------------------------------------------------------
//-------------------------------------------------------------
//---定义定时闹钟结构体变量
struct ALARMCLOCK_sTRUCT
{
unsigned char Day; //日
unsigned char Week; //星期
unsigned char Hour; //时
unsigned char Minute; //分
unsigned char second; //秒
unsigned char status; //状态
};
struct ALARMCLOCK_sTRUCT AlarmClock;
//-------------------------------------------------------------
//-------------------------------------------------------------
//---定义PIC单片机与74HC595芯片接口连接关系
#define HC595_sER LATCbits.LATC0
#define HC595_RCLK LATCbits.LATC1
#define HC595_sRCLK LATCbits.LATC2
#define HC595_sRCLR LATCbits.LATC3
#define HC595_OE LATCbits.LATC4
//---定义LED数码管显示缓冲区
unsigned char LEDBuffer[16];
//---定义大LED数码管初始化函数
void InitizeLED(void)
{
HC595_OE=1;//并行输出为高阻状态
HC595_sRCLR=0;//清空移位寄存器
HC595_sER=0;//清零
HC595_RCLK=0;//移位时钟初始为低
HC595_sRCLK=0;//存储器时钟初始为低
HC595_OE=0;//允许并行输出
HC595_sRCLR=1;//结束复位状态
}
//---定义大LED显示驱动函数
//*LedData指针,DataLength数据长度
void sendDataToLED(unsigned char *LedData,unsigned char DataLength)
{
unsigned char i,j,temp;
for(j=0;j<DataLength;j++)
{
temp=LEDCODE[*LedData];//取出LED显示的代码表送入变量中
for(i=0;i<8;i++)
{
if(0x80==(temp & 0x80))HC595_sER=1;//将字节按位移出
else HC595_sER=0;
HC595_RCLK=1;//将数据送入移位寄存器中
HC595_RCLK=0;
temp<<=1;//当前指针的内容左移一位
}
LedData++;//指针指向下一个数据
}
HC595_sRCLK=1;//将移位寄存器中的内容送到并行输出口
HC595_sRCLK=0;
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//---定义PIC单片机与Ds1302引脚之间的连接关系
#define Ds1302CE_1 LATCbits.LATC5=1
#define Ds1302CE_0 LATCbits.LATC5=0
#define Ds1302CE_O TRISC &=0xDF
#define Ds1302IO_O TRISC &=0xBF
#define Ds1302IO_I TRISC |=0x20
#define Ds1302IO_1 LATCbits.LATC6=1
#define Ds1302IO_0 LATCbits.LATC6=0
#define Ds1302IO_D PORTC & 0x40
#define Ds1302CK_1 LATCbits.LATC7=1
#define Ds1302CK_0 LATCbits.LATC7=0
#define Ds1302CK_O TRISC &=0x7F
//---Ds1302初始化函数
void Init_Ds1302_RTC(void)
{
Ds1302CK_O;//置CK为输出
Ds1302CE_O;//置CE为输出
Ds1302CE_0;//输出为0
Ds1302CK_0;//输出为0
Ds1302IO_1;//置IO为输入
Ds1302IO_I;
}
//---读取Ds1302日历函数
unsigned char Read_Ds1302_RTC(unsigned char RTC_Address)
{
unsigned char i;
unsigned int temp;
Ds1302CE_0;//CE=0
Ds1302CK_0;//CK=0
Ds1302IO_O;//Ds1302为IO为输出
_asm//简短延时
NOP
NOP
_endasm
Ds1302CE_1;//CE=1
_asm//简短延时
NOP
NOP
_endasm
for(i=8;i>0;i--)//CPU送出访问Ds1302的地址
{ //以串行方式从PIC单片机的RC6引脚输出
if(RTC_Address & 0x01)Ds1302IO_1;
else Ds1302IO_0;
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_1;//CK=1
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_0;//CK=0
_asm//简短延时
NOP
NOP
_endasm
RTC_Address>>=1;//右移一位
}
Ds1302IO_1;//PIC单片机的RC7为输入状态
_asm//简短延时
NOP
NOP
_endasm
Ds1302IO_I;
_asm//简短延时
NOP
NOP
_endasm
temp=0;
if(Ds1302IO_D)temp|=0x8000;
temp>>=1;//右移一位
for(i=7;i>0;i--)
{
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_1;//CK=1
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_0;//CK=0
_asm//简短延时
NOP
NOP
_endasm
if(Ds1302IO_D)temp|=0x8000;//RC7引脚上的电平并保存到变量中
temp>>=1;//右移一位
}
Ds1302CE_0;//CE=0
temp<<=1;//左移一位
return(temp/256);//返回读取到的内容
}
//---写入Ds1302日历函数
void Write_Ds1302_RTC(unsigned char RTC_Address,unsigned char RTC_Data)
{
unsigned char i;
Ds1302CE_0;//CE为输出
Ds1302CK_0;//CK为输出
Ds1302IO_O;//IO为输出
_asm//简短延时
NOP
NOP
_endasm
Ds1302CE_1;//CE=1
_asm//简短延时
NOP
NOP
_endasm
for(i=8;i>0;i--)
{ //送地址给Ds1302
if(RTC_Address & 0x01)Ds1302IO_1;
else Ds1302IO_0;
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_1;//CK=1
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_0;//CK=0
_asm//简短延时
NOP
NOP
_endasm
RTC_Address>>=1;//右移一位
}
for(i=8;i>0;i--)
{ //送数据给Ds1302
if(RTC_Data & 0x01)Ds1302IO_1;
else Ds1302IO_0;
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_1;//CK=1
_asm//简短延时
NOP
NOP
_endasm
Ds1302CK_0;//CK=0
_asm//简短延时
NOP
NOP
_endasm
RTC_Data>>=1;//右移一位
}
Ds1302CE_0;//CE=0
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//---定义ADC缓冲区,和指针变量
unsigned char ADCBuffer[5]; //ADC采集缓冲区
unsigned char ADCBufferPointer; //ADC采集缓冲区指针
unsigned char TemperatureDisplayFlag; //当缓冲区满时,处理完后标志
//---ADC初始化函数定义
void ADC_Initize(void)
{
unsigned char i;
ADCON1=0x07;//初始化ADC的参考电压取VCC,GND
ADCON2=0x00;//左对齐,0TAD,FOsC/2
ADCON0=0x03;//选择通道0,启动A/D转换开始
//初始化ADCBuffer变量指针和缓冲区
ADCBufferPointer=0;
for(i=0;i<sizeof(ADCBuffer);i++)ADCBuffer[i]=0;
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//---初始化PIC18F单片机工作于内部时钟8MHz状态下
void INTOsC_Initize(void)
{
OSCCON=0x70;//选择内部8MHz的主振荡器
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//---TMR0定时器初始化函数
void TMR0_Initize(void)
{
T0CONbits.TMR0ON=FALsE;//TMR0停止运行
T0CON=0x12;//TMR0初始化为8位定时,预分频比为1:8
TMR0L=256-25;//定时100ms初值
T0CONbits.TMR0ON=TRUE;
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//---延时函数的定义
void Delay(unsigned int t)
{
while(t--);
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//---按键引脚的定义
#define DATEKEY PORTBbits.RB0
#define TIMEKEY PORTBbits.RB1
#define ALARMKEY PORTBbits.RB2
#define NUMBERADDKEY PORTBbits.RB3
#define NUMBERsUBKEY PORTBbits.RB4
//---功能按键状态变量定义
unsigned char DateKeyID;
unsigned char TimeKeyID;
unsigned char AlarmKeyID;
//-------------------------------------------------------------
//-------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -