253
//////////////////////// T0_ISR //////////////////////////////
// Обработчик прерывания от таймера 0.
//////////////////////////////////////////////////////////////
void T0_ISR( void ) __interrupt ( 1 )
{
// Время в милисекундах
__systime++;
TH0 = 0xFC;
// Инициализация таймера 0:
TL0 = 0x67;
// настройка на частоту работы 1000 Гц (чуть больше)
}
//////////////////////// SetVector //////////////////////////
// Функция, устанавливающая вектор прерывания в пользовательской таблице
// прерываний.
// Вход: Vector
- адрес обработчика прерывания,
// Address - вектор пользовательской таблицы прерываний.
// Выход: нет.
// Результат: нет.
//////////////////////////////////////////////////////////////
void SetVector(unsigned char xdata * Address, void * Vector)
{
unsigned char xdata * TmpVector; // Временная переменная
// Первым байтом по указанному адресу записывается
// код команды передачи управления ljmp, равный 02h
*Address = 0x02;
// Далее записывается адрес перехода
Vector
TmpVector = (unsigned char xdata *) (Address + 1);
*TmpVector = (unsigned char) ((unsigned short)Vector >> 8);
++TmpVector;
*TmpVector = (unsigned char) Vector;
// Таким образом, по адресу Address теперь
// располагается инструкция ljmp Vector
}
void main( void )
{
unsigned char light = 1;
InitSystimer0();
// Установка вектора в пользовательской таблице
SetVector( 0x200B, (void *)T0_ISR );
// Разрешение прерываний от таймера 0
ET0 = 1; EA = 1;
while( 1 )
{
leds( light );
if( light == 0xFF ) light = 1;
else light |= light << 1;
DelayMs( 300 );
}
}