main.c
来自「8051试验程序 基础教材」· C语言 代码 · 共 258 行
C
258 行
#include <ioXC866.h>
#include "simpleEventHandler.h"
#include "vssrc/BlinkSEMLibB.h"
#include "vssrc/Blink.h"
#include "vssrc/BlinkAction.h"
#include "vssrc/BlinkData.h"
#define IO_vWritePort(PortName, Data) PortName##_DATA = Data // Macro to set LED
#define SFR_PAGE(pg,op) pg+op // Macro to set SFR Page
#define _pp0 PORT_PAGE=0 // PORT_PAGE postfix
#define _pp1 PORT_PAGE=1 // PORT_PAGE postfix
#define _pp2 PORT_PAGE=2 // PORT_PAGE postfix
#define _pp3 PORT_PAGE=3 // PORT_PAGE postfix
#define noSST 0x00 // Switch page without saving
/** IO Init */
void IO_Init(void) {
SFR_PAGE(_pp1, noSST); // Switch to page 1
P1_PUDSEL = 0xBF; // Load pullup/pulldown select register
P1_PUDEN = 0x00; // Load pullup/pulldown enable register
SFR_PAGE(_pp0, noSST); // Switch to page 0
P1_DIR = 0xFF; // Load direction register
}
/** Main Init */
void MAIN_vInit(void)
{
IO_Init(); // Initialization of module 'GPIO'
/* Interrupt Priority */
IP = 0x00; // Load Interrupt Priority Register
IPH = 0x00; // Load Interrupt Priority High Register
IP1 = 0x00; // Load Interrupt Priority 1 Register
IPH1 = 0x00; // Load Interrupt Priority 1 High Register
IEN0_bit.EA = 1; // Globally enable interrupts
}
/**
Timer 2 Init
Enable timer 2 interrupts.
*/
void T2_vInit(void) {
IEN0_bit.ET2 = 1; // Enable Timer 0 Interrupt
T2_T2CON_bit.TR2 = 1; // Run Timer 2
T2_T2CON_bit.TF2 = 0; // Reset Interrupt Flag
T2_T2MOD_bit.T2PRE0 = 1; // Enable Prescaler
T2_T2MOD_bit.T2PRE0 = 1; // Enable Prescaler
T2_T2MOD_bit.T2PRE0 = 1; // Enable Prescaler
T2_T2MOD_bit.PREN = 0; // Enable Prescaler
T2_T2MOD_bit.DCEN = 1; // Set counter mode
T2_T2CON_bit.EXEN2 = 1; // Set counter mode
}
/**
Enable External 2 Interrupt
*/
void EXT2_vInit(void) {
IEN1_bit.EX2 = 1; // Enable External 2 Interrupt
IRCON0_bit.EXINT2 = 0; // Reset Interrupt Flag
EXICON0_bit.EXINT20 = 1; // External Interrupt 2 Trigger Select
EXICON0_bit.EXINT21 = 0; // External Interrupt 2 Trigger Select
}
/**
Enable External 4 Interrupt
*/
void EXT4_vInit(void) {
IEN1_bit.EXM = 1; // Enable External 4 Interrupt
IRCON0_bit.EXINT4 = 0; // Reset Interrupt Flag
EXICON1_bit.EXINT40 = 1; // External Interrupt 2 Trigger Select
EXICON1_bit.EXINT41 = 0; // External Interrupt 2 Trigger Select
}
/**
Handle Error
*/
void HandleError(unsigned char cc)
{
}
/**
Init the interrupts used in this example.
Init event queue.
The for loop polls the event queue for Events.
*/
int main(void)
{
MAIN_vInit(); // Main Init
T2_vInit(); // Timer 2 Interrupt Init
EXT2_vInit(); // External 2 Interrupt Init
EXT4_vInit(); // External 4 Interrupt Init
IO_vWritePort(P1, 0xFF); // LED off.
T2_T2L = 0xFF; // Reset timer low
T2_T2H = 0xFF; // Reset timer high
/* Define completion code variable. */
unsigned char cc;
/* Define action expression variable. */
SEM_ACTION_EXPRESSION_TYPE actionExpressNo;
/* Define even type variable*/
SEM_EVENT_TYPE eventNo;
/* Initialize the VS System. */
BlinkSEM_InitAll();
/* Initialize the VS Event queue. */
SEQ_Initialize();
/* Add SE_RESET to initialize system. */
SEQ_AddEvent(SE_RESET);
/* Do forever: */
for(;;)
{
if(SEQ_RetrieveEvent(&eventNo) != UCC_QUEUE_EMPTY)
{
/* Deduct the event. */
if ((cc = BlinkSEM_Deduct(eventNo)) != SES_OKAY)
HandleError(eventNo);
/* Get resulting action expressions and execute them. */
while ((cc = BlinkSEM_GetOutput(&actionExpressNo)) == SES_FOUND)
BlinkSEM_Action(actionExpressNo);
/* Check for error. */
if (cc != SES_OKAY)
HandleError(cc);
/* Change the next state vector. */
if ((cc = BlinkSEM_NextState()) != SES_OKAY)
HandleError(cc);
}
}
}
/**
Timer 2 Interrupt.
Every 10th timer interrupt an event is added to the event queue.
*/
#pragma vector = timer2_ext
__interrupt void interrupt_1 ()
{
static char count = 10;
if(count-- == 0){
count = 10;
SEQ_AddEvent (Timer_Interrupt);
}
T2_T2L = 0x00; // Reset Timer 2 Low
T2_T2H = 0x00; // Reset Timer 2 High
T2_T2CON_bit.TF2 = 0; // Reset Interrupt
}
/**
External 2 Interrupt
In this case when PIN 13 is changed (port 2 bit 1).
Adds an event to the event queue at interrupt.
*/
#pragma vector = EXINT2_int
__interrupt void interrupt_2 ()
{
IEN0_bit.EA = 0;
static char firstTime = 1;
/*
The Interrupt is always thrown twice,
hence the if-statement.
*/
if(firstTime == 1) {
firstTime--;
SEQ_AddEvent (Pin13_Interrupt); // Add Pin_Interrupt Event to the event queue.
IRCON0_bit.EXINT2 = 0; // Reset Interrupt Flag
} else {
firstTime = 1;
}
IEN0_bit.EA = 1;
}
/**
External 4 Interrupt
In this case when PIN 15 is changed (port 3 bit 7).
Adds an event to the event queue at interrupt.
*/
#pragma vector = EXINT4_int
__interrupt void interrupt_4 ()
{
IEN0_bit.EA = 0;
static char firstTime1 = 1;
/*
The interrupt is always thrown twice,
hence the if-statement.
*/
if(firstTime1 == 1) {
firstTime1 = 0;
SEQ_AddEvent (Pin15_Interrupt); // Add Pin_Interrupt Event to the event queue.
IRCON0_bit.EXINT4 = 0; // Reset Interrupt Flag
} else {
firstTime1 = 1;
}
IEN0_bit.EA = 1;
}
/**
Turn LED On.
*/
VS_VOID TurnOnLED(void) {
IO_vWritePort(P1, 0x00); // LED on.
}
/**
Turn LED Off.
*/
VS_VOID TurnOffLED(void) {
IO_vWritePort(P1, 0xFF); // LED off.
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?