?? blinky.#1
字號:
//-----------------------------------------------------------------------------
// Blinky.c
//-----------------------------------------------------------------------------
// Copyright (C) 2004 Silicon Laboratories, Inc.
//
// AUTH: JS
// DATE: 03 JUL 02
//
// This program flashes the green LED on the C8051F31x target board about
// five times a second using the interrupt handler for Timer2.
//
// Target: C8051F31x
//
// Tool chain: KEIL Eval 'c'
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f310.h> // SFR declarations
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F30x
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz
sbit LED = P3^3; // LED='1' means ON
sbit SW2 = P0^7; // SW2='0' means switch pressed
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (int counts);
void Timer2_ISR (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
PCA0MD &= ~0x40; // CIDL WDTE WDCLK 0 CPS2 CPS1 CPS0 ECF (sfr PCA0MD=0xD9;PCA0 MODE)
// CIDL=0/1 當系統控制器處于空閑方式時,PCA 繼續正常工作/當系統控制器處于空閑方式時,PCA 停止工作.
// WDTE=0/1 看門狗定時器被禁止/PCA 模塊4 被用作看門狗定時器.
// WDCLK=0/1 對看門狗定時器使能位解鎖/鎖定看門狗定時器使能位(當WDCLK 被置‘1’時,在發生下一次系統復位之前將不能禁止WDT).
// CPS2-CPS0=000 系統時鐘的12分頻 001 系統時鐘的4 分頻 010 定時器0 溢出 011 ECI 負跳變(最大速率= 系統時鐘頻率/4)100 系統時鐘 101 外部時鐘的8 分頻.
// ECF=0/1 禁止CF中斷/當CF(PCA0CN.7)被置位時,允許PCA 計數器/定時器溢出的中斷請求.
// disable watchdog timer
// WDTE = 0 (clear watchdog timer enable)
SYSCLK_Init (); // Initialize system clock to 24.5MHz
PORT_Init (); // Initialize crossbar and GPIO
Timer2_Init (SYSCLK / 12 / 10); // Init Timer2 to generate
// interrupts at a 10Hz rate.
EA = 1; // enable global interrupts
while (1) { // spin forever
}
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use the internal 24.5MHz / 8
// oscillator as its clock source. Also enables missing clock detector reset.
//
void SYSCLK_Init (void)
{
OSCICN = 0x80; // IOSCEN IFRDY 0 0 0 0 IFCN1 IFCN0 (sfr OSCICN=0xB2;內部振蕩器控制寄存器)
// IOSCEN=1 內部振蕩器使能;IFRDY=0/1 內部振蕩器未運行在編程頻率/內部振蕩器按編程頻率運行.
// IFCN1 IFCN0=00~11 8分頻 4 2 1分頻.
RSTSRC = 0x04; // 0 FERROR C0RSEF SWRSF WDTRSF MCDRSF PORSF PINRSF (sfr RSTSRC=0xEF;復位源寄存器)
// MCDRSF=0/1 禁止時鐘丟失檢測器/使能時鐘丟失檢測器;檢測到時鐘丟失條件時觸發復位.
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
// P3.3 - LED (push-pull)
//
void PORT_Init (void)
{
XBR0 = 0x00; // CP1AE CP1E CP0AE CP0E SYSCKE SMB0E SPI0E URT0E (sfr XBR0=0xE1;端口I/O 交叉開關寄存器0)
// no digital peripherals selected
XBR1 = 0x40; // WEAKPUD XBARE T1E T0E ECIE PCA0ME(3位) (sfr XBR1=0xE2;端口I/O 交叉開關寄存器1)
// WEAKPUD=0 弱上拉使能;XBARE=1 交叉開關使能;T1E=0 T1不連到端口引腳;T0E=0 T0不連到端口引腳.
// ECIE(PCA0 外部計數輸入使能位)=0 ECI不連到端口引腳;PCA0ME=000 所有的PCA I/O 都不連到端口引腳.
// Enable crossbar and weak pull-ups
P3MDOUT |= 0x08; // 000 P3MDOUT[4:0](P3.4–P3.0 輸出方式配置位) (sfr P3MDOUT=0xA7;端口3輸出方式寄存器)
// P3MDOUT[4:0]=0/1 對應的P3.n 輸出為漏極開路/對應的P3.n 輸出為推挽方式.
// enable LED as a push-pull output
}
//-----------------------------------------------------------------------------
// Timer2_Init
//-----------------------------------------------------------------------------
//
// Configure Timer2 to 16-bit auto-reload and generate an interrupt at
// interval specified by <counts> using SYSCLK/48 as its time base.
//
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // TF2H TF2L TF2LEN 0 T2SPLIT TR2 0 T2XCLK (sfr TMR2CN=0xC8;定時器2控制寄存器)
// TF2H:定時器2 高字節溢出標志,必須用軟件清0;TF2L:定時器2 低字節溢出標志,必須用軟件清0;TF2LEN=1 允許定時器2低字節中斷.
// T2SPLIT=0/1 定時器2工作在16位自動重裝載方式/定時器2工作在雙8位自動重裝載定時器方式.
// TR2=0定時器2禁止;T2XCLK=0/1 選擇定時器2外部時鐘為系統時鐘/12 /選擇定時器2 外部時鐘為外部時鐘/8.
// Stop Timer2; Clear TF2;
// use SYSCLK/12 as timebase
CKCON &= ~0x60; // T3MH T3ML T2MH T2ML T1M T0M SCA1 SCA0 (sfr CKCON=0x8E;時鐘控制寄存器)
// T3MH=0/1 定時器3 高字節使用TMR3CN 中的T3XCLK 位定義的時鐘/定時器3 高字節使用系統時鐘.
// T3ML=0/1 定時器3 低字節使用TMR3CN 中的T3XCLK 位定義的時鐘/定時器3 低字節使用系統時鐘.
// T2MH=0/1 定時器2 高字節使用TMR2CN 中的T2XCLK 位定義的時鐘/定時器2 高字節使用系統時鐘.
// T2ML=0/1 定時器2 低字節使用TMR2CN 中的T2XCLK 位定義的時鐘/定時器2 低字節使用系統時鐘.
// T1M=0/1 定時器1 使用由分頻位(SCA1-SAC0)定義的時鐘/定時器1 使用系統時鐘.
// T0M=0/1 定時器0 使用由分頻位(SCA1-SAC0)定義的時鐘/定時器0 使用系統時鐘.
// SCA1 SCA0=00 系統時鐘/12 01 系統時鐘/4 10 系統時鐘/48 11 外部時鐘/8.
// Timer2 clocked based on T2XCLK;
TMR2RL = -counts; // (sfr TMR2RLL=0xCA;定時器2 重載寄存器低字節)
// (sfr TMR2RLH=0xCB;定時器2 重載寄存器高字節)
// Init reload values
TMR2 = 0xffff; // (sfr TMR2L= 0xCC;定時器2 低字節)
// 在16 位方式,TMR2L 寄存器保持16 位定時器2 的低字節。在8 位方式,TMR2L中保持8 位低字節定時器的計數值.
// (sfr TMR2H= 0xCD;定時器2 高字節)
// 在16 位方式,TMR2H寄存器保持16 位定時器2 的高字節。在8 位方式,TMR2H中保持8 位高字節定時器的計數值.
// set to reload immediately
ET2 = 1; // sbit ET2= IE^5;TIMER 2 INTERRUPT ENABLE
// enable Timer2 interrupts
TR2 = 1; // sbit TR2=TMR2CN^2;TIMER 2 ON/OFF CONTROL
// start Timer2
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Timer2_ISR
//-----------------------------------------------------------------------------
// This routine changes the state of the LED whenever Timer2 overflows.
//
void Timer2_ISR (void) interrupt 5
{
TF2H = 0; // sbit TF2H=TMR2CN^7;TIMER 2 HIGH BYTE OVERFLOW FLAG
// clear Timer2 interrupt flag
LED = ~LED; // change state of LED
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -