//Таймер реального времени
#include<p18cxxx.h>
#pragma config OSC=RC
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config BOR=OFF
#pragma config MCLRE=OFF
void MyHighInt(void);
#pragma interrupt MyHighInt //Это высокоприоритетное прерывание
#pragma code high_vector=0x08 //Это вектор по адресу 0х08
void high_vector(void){
_asm GOTO MyHighInt _endasm
}
//----------------------Память данных------------------------------
#pragma udata access IntMyData
near char seconds;
near char minutes;
near char hours;
//---------------------Функции-------------------------------------
#pragma code
void DoTime(void) //формирование сигнала счета каждую секунду
{
TMR1H=0x80; //предзагрузка таймера 1 значением 0х8000
PIR1bits.TMR1IF=0; //сброс прерывания от таймера 1
seconds++; //прибавляем 1 к seconds
if(seconds==60) //если seconds равно 60
{
seconds=0; //обнуляем секунды
minutes++; //и прибавляем 1 к минутам
if(minutes==60) //если минуты равны 60
{
minutes=0; //обнуляем минуты
hours++; //прибавляем 1 к часам
if(hours==24) //если часы равны 24
hours=0; //обнуляем часы
}
}
}
void MyHighInt(void){
if(PIR1bits.TMR1IF)
{
DoTime();
}
}
void main(void){
ADCON1=0x7f; //выключаем АЦП
RCONbits.IPEN=1; //включение приоритетов прерываний
TMR1L=0x00; //инициализация счетчика
TMR1H=0x80;
T1CON=0x0F; //Таймер1 вкл.,внешний синхроимпульс на RB6,синхронизации нет,генератор включен
seconds=minutes=hours=0; //сбросим переменные
IPR1bits.TMR1IP=1; //высокий приоритет прерывания переполнения Таймера1
PIE1bits.TMR1IE=1; //включить прерывание по переполнению Таймера1
INTCONbits.GIEH=1; //глобальное разрешение прерываний
while(1){
}
}
#pragma udata
char timeString[12];
#pragma code
void getTimeString(char mode)
{
char ptr=0;
char tempHours=hours;
char amPM='A';
if(mode)
{
if(hours==12)
{
tempHours-=12;
amPM='P';
}
if(tempHours==0)
tempHours=12;
}
if((tempHours/10)==0){
timeString[ptr++]=' ';
}
else{
timeString[ptr++]=tempHours/10+0x30;
}
timeString[ptr++]=tempHours%10+0x30;
timeString[ptr++]=':';
timeString[ptr++]=minutes/10+0x30;
timeString[ptr++]=minutes%10+0x30;
timeString[ptr++]=':';
timeString[ptr++]=seconds/10+0x30;
timeString[ptr++]=seconds%10+0x30;
if(mode)
{
timeString[ptr++]=' ';
timeString[ptr++]=amPM;
timeString[ptr++]='M';
}
timeString[ptr]=0;
}
//Пример 6.21 страница 236
#include<p18cxxx.h>
#pragma config OSC=RC
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config BOR=OFF
#pragma config MCLRE=OFF
void MyHighInt(void);
#pragma interrupt MyHighInt //Это высокоприоритетное прерывание
#pragma code high_vector=0x08 //Это вектор по адресу 0х08
void high_vector(void){
_asm GOTO MyHighInt _endasm
}
//----------------------Память данных------------------------------
#pragma udata access IntMyData
near short long time;
#pragma udata
char timeString[12];
//---------------------Функции-------------------------------------
#pragma code
void getTimeString(char mode)
{
char ptr=0;
char hours=time/3600;
char amPM='A';
char minutes=(time%3600)/60;
char seconds=(time%3600)%60;
if(mode)
{
if(hours==12)
{
hours-=12;
amPM='P';
}
if(hours==0)
hours=12;
}
if((hours/10)==0){
timeString[ptr++]=' ';
}
else{
timeString[ptr++]=hours/10|0x30;
}
timeString[ptr++]=hours%10|0x30;
timeString[ptr++]=':';
timeString[ptr++]=minutes/10|0x30;
timeString[ptr++]=minutes%10|0x30;
timeString[ptr++]=':';
timeString[ptr++]=seconds/10|0x30;
timeString[ptr++]=seconds%10|0x30;
if(mode)
{
timeString[ptr++]=' ';
timeString[ptr++]=amPM;
timeString[ptr++]='M';
}
timeString[ptr]=0;
}
void DoTime(void) //формирование сигнала счета каждую секунду
{
TMR1H=0x80; //предзагрузка таймера 1 значением 0х8000
PIR1bits.TMR1IF=0; //сброс прерывания от таймера 1
time++;
if(time==86400){
time=0;
}
}
void MyHighInt(void){
if(PIR1bits.TMR1IF)
{
DoTime();
}
}
void main(void){
ADCON1=0x7f; //выключаем АЦП
RCONbits.IPEN=1; //включение приоритетов прерываний
TMR1L=0x00; //инициализация счетчика
TMR1H=0x80;
T1CON=0x0F; //Таймер1 вкл.,внешний синхроимпульс на RB6,синхронизации нет,генератор включен
IPR1bits.TMR1IP=1; //высокий приоритет прерывания переполнения Таймера1
PIE1bits.TMR1IE=1; //включить прерывание по переполнению Таймера1
INTCONbits.GIEH=1; //глобальное разрешение прерываний
while(1){
}
}
НАЗАД ДАЛЕЕ