采用PMC/PMS153芯片,选用哪一种芯片只需在文件中选定对应芯片即可。
定时器中断,1ms进一次中断,用示波器看过频率是正常的,误差小于1us。
//主控:PMC153 (根据具体IC以及封装修改)
// ________________________
// -|PB5 PB2 |-
// LED4-|PB6 PB1 |-
// LED3-|PB7 PB0/INT1|-
// -|VDD GND |-
// LED2-|PA7 PA0/INT0|-
// LED1-|PA6 PA4 |- LED6
// -|PA5/PRSTB PA3 |- LED5
// ------------------------
#include "extern.h"
// .outfile %S_%TyymmddHHMMSS_%x.PDK //输出的烧录文件带校验码、芯片型号、时间日期
typedef byte u8;
typedef word u16;
typedef EWORD u24;
typedef DWORD u32;
#define SetPortA() PAPH = 0XD9; PAC = 0XD8; PA = 0XD9
#define SetPortB() PBPH = 0XC0; PBC = 0XC0; PB = 0XC0
//==================单个io口的初始化==================//
// paph.0 = 1; //上拉 0/1->无/有
// pac.0 = 1; //pac 0:IN 1:OUT 模式:0/1->输入/输出
// pa.0 = 0; //输出0/1
//=================一个io端口的初始化=================//
// paph = 0x01;
// pac = 0X01; //pac 0:IN 1:OUT
// pa = 0x00;
//上面两个都是对PA.0进行初始化为0,不建议对单个IO口操作,推荐使用下面那种,对整组io进行设置
/************************************************************************************/
/* LED灯接口配置 */
/************************************************************************************/
#define LED1_ON() PA.6 = 0
#define LED1_OFF() PA.6 = 1
#define LED2_ON() PA.7 = 0
#define LED2_OFF() PA.7 = 1
#define LED3_ON() PB.7 = 0
#define LED3_OFF() PB.7 = 1
#define LED4_ON() PB.6 = 0
#define LED4_OFF() PB.6 = 1
#define LED5_ON() PA.3 = 0
#define LED5_OFF() PA.3 = 1
#define LED6_ON() PA.4 = 0
#define LED6_OFF() PA.4 = 1
u16 T16val;
u8 gCnt;
u16 Tcount;
void sys_init(void)
{
T16val = 0;
gCnt = 0;
Tcount = 0;
}
/************************************************************************************/
/* 16位计数定时器T16 */
/************************************************************************************/
#define USER_TIMER_CONFIG() $ T16M IHRC, /16, BIT10 //对t16寄存器进行配置 时钟:IHRC 分频:/16 中断源:BIT10
#define ENABLE_TIMER() SET1 INTEN.2 //$ INTEN T16 //开定时器中断
#define DISENABLE_TIMER() SET0 INTEN.2 //关定时器中断
#define INIT_TIMER_VALUE(n) STT16 n//装载定时器计数值
#define EA_INT() ENGINT//开总中断
#define DIS_INT() DISGINT//关总中断
#define CONST_TIME_VALUE 24//0x10E//224// (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us
/************************************************************************************/
//一次中断的时间计算公式 (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us
// (2^10 - 24) / (16 / 16) = 1000us
void Set_User_T16(void)
{
USER_TIMER_CONFIG();
T16val = CONST_TIME_VALUE;
INIT_TIMER_VALUE(T16val);
ENABLE_TIMER();
INTRQ = 0;//清除INTRQ
EA_INT();
}
/************************************************************************************/
/* 主函数 */
/************************************************************************************/
void FPPA0 (void)
{
// .ADJUST_IC SYSCLK=IHRC/4 // SYSCLK=IHRC/4
.ADJUST_IC SYSCLK=IHRC/4, IHRC=16MHz,VDD=3.3V // SYSCLK=IHRC/2 //系统时钟4M
// clkmd.En_WatchDog = 1; // WatchDog Enable
// clkmd.En_Reset = 1; // PA.5 as Reset pin
// Insert Initial Code
SetPortA();
SetPortB();
sys_init();
Set_User_T16();
while (1)
{
// ...
// wdreset;
if (gCnt) { // 利用IO口翻转看中断时间
LED1_ON();
} else {
LED1_OFF();
}
}
}
/************************************************************************************/
/* 中断 */
/************************************************************************************/
void Interrupt (void)
{
pushaf;
if (Intrq.T16)
{ // T16 Trig
// User can add code
Intrq.T16 = 0;
T16val = CONST_TIME_VALUE;
INIT_TIMER_VALUE(T16val);
//中断执行区
Tcount++;
if(Tcount >= 2000)
{
if (gCnt) { // 利用IO口翻转看中断时间
gCnt = 0;
} else {
gCnt = 1;
}
Tcount = 0;
}
}
popaf;
}