
DE1-S
O
C C
OMPUTER
S
YSTEM WITH
N
IOS
II
For Quartus II 15.0
#
include
"key_codes.h"
// defines values for KEY0, KEY1,
. . .
extern volatile int
key_pressed, pattern, shift_dir;
/********************************************************************************
* Interval timer interrupt service routine
* Shifts a pattern being displayed on the HEX displays. The shift direction is determined
* by the external variable key_pressed.
********************************************************************************/
void
interval_timer_isr( )
{
volatile int
* interval_timer_ptr = (
int
*) 0xFF202000;
// interval timer base address
volatile int
* slider_switch_ptr = (
int
*) 0xFF200040;
// SW base address
volatile int
* HEX3_HEX0_ptr = (
int
*) 0xFF200020;
// HEX3_HEX0 address
*(interval_timer_ptr) = 0;
// clear the interrupt
*(HEX3_HEX0_ptr) = pattern;
// display pattern on HEX3 ... HEX0
/* rotate the pattern shown on the HEX displays */
if
(key_pressed == KEY0)
// for KEY0 load a new pattern
pattern = *(slider_switch_ptr);
else if
(key_pressed == KEY1)
shift_dir = RIGHT;
else if
(key_pressed == KEY2)
shift_dir = LEFT;
else if
(key_pressed == KEY3)
shift_dir = NONE;
key_pressed = NONE;
// key press handled, so clear
if
(shift_dir == LEFT)
if
(pattern & 0x80000000)
pattern = (pattern
<<
1) | 1;
else
pattern = pattern
<<
1;
else if
(shift_dir == RIGHT)
if
(pattern & 0x00000001)
pattern = (pattern
>>
1)
|
0x80000000;
else
pattern = (pattern
>>
1) & 0x7FFFFFFF;
// else don’t shift
return
;
}
Figure 23. Interrupt service routine for the interval timer.
Altera Corporation - University Program
2015
29