芯片:ft60e12x ft60f12x
芯片规格书以及参考demo
硬件准备
一块带ft60e12x的板子 以及对应的原理图
环境搭建ide
跑通一个简单demo
示例代码
ir_send
// project: ft60e12x_ir_send.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 演示程序中,ir红外是采用6122协议,起始信号是9ms低电平,到4.5ms高电平,再到低8位用户识别码,到高8位的用户识别码,8位数据码,8位数据码的反码。sendio(pa4)定时(5秒钟)发送一次,接收端收到遥控器发过来的数据后,校验数据互为补码,led会开关。
// release history
// version date description
// 1.1 24-2-21 修改文件头
//********************************************************
#include "syscfg.h"
//**********************宏定义****************************
#define uchar unsigned char
#define uint unsigned int
#define irsendio pa4 // 串口的发送脚
#define irsend_high_1 1 // 560us
#define irsend_low_1 3 // 1680us
#define irsend_high_0 1 // 560us
#define irsend_low_0 1 // 560us
#define irsend_pin_1 t0ie = 1 // 发送数据 开启定时器0
#define irsend_pin_0 t0ie = 0 // 关闭定时器0
#define status_nosend 0 // 不发送的状态
#define status_head 1 // 发送引导码的状态
#define status_data 2 // 发送数据的状态
uchar irsendstatus; // 发送状态,是发送引导码还是数据
uchar irsenddata; // 发送的数据中转变量
uchar txbit=0,txtime=0;
uchar sendbit = 0;
uchar level0,level1; // 一位数据里发送与关闭的时间值
bit sendlastbit = 0;
uchar savelastbit = 0;
uint systime5s = 0; // 系统时间,5s发送一次
uchar irdata[4] = {0x00,0xff,0x40,0xbf}; // 需要发送的4个数据
/*----------------------------------------------------
* 函数名:power_initial
* 说明:初始化单片机
* 输入:无
* 输出:无
----------------------------------------------------*/
void power_initial(void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
//bit0=1,系统时钟为内部振荡器
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b11101111; //pa输入输出 0-输出 1-输入
//pa4->输出
portc = 0b00000000;
trisc = 0b11111111; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
wpuc = 0b00000000; //pc端口上拉控制 1-开上拉 0-关上拉
//60系列pc口无上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*----------------------------------------------------
* 函数名:timer0_initial
* 功能: 初始化设置定时器v
* 说明: 38khz发生器,1000000/38000=26.3us .由于定时太短,频繁进定时器,时间有一定的
* 误差,239并不是直接算出来的, 是示波器看的。
* 设置tmr0定时时长=(1/系统时钟频率)*指令周期*预分频值*26
* =(1/16000000)*4*2*26=13us
----------------------------------------------------*/
void timer0_initial (void)
{
option = 0b00000000;
//bit5 t0cs timer0时钟源选择
//1-外部引脚电平变化t0cki 0-内部时钟(fosc/2)
//bit4 t0cki引脚触发方式 1-下降沿 0-上升沿
//bit3 psa 预分频器分配位 0-timer0 1-wdt
//bit2:0 ps 8个预分频比 000 - 1:2
tmr0 = 239;
t0if = 0; //清空t0软件中断
}
/*----------------------------------------------------
* 函数名:timer2_initial
* 功能: 初始化设置定时器2 配置成pwm
* 设置: tmr2输出比较值定时=(1/系统时钟频率)*4*预分频值*后分频值*pr2
* =(1/16000000)*4*4*4*141
* =564us
----------------------------------------------------*/
void timer2inital(void)
{
t2con0 = 0b00011001; //t2预分频1:4,后分频1:4
//bit[7:0]: 无意义; 1:把pr2/p1xdty缓冲值分别更新到pr2寄存器和p1xdty_act
//bit[6:3]: 定时器2输出后分频比选择 0000: 1:1;0001: 1:2;……1:16
//bit[2:0]: 关闭定时器2;1:打开定时器2
//bit[1:0]: 定时器2预分频选择 00:1;01:4;1x:16
t2con1 = 0b00000000; //t2时钟来自系统时钟,pwm1连续模式
//bit4: pwm模式选择
// 0:连续模式;1:单脉冲模式
//bit3: 0:pwm模式;1:蜂鸣器模式
//bit[2:0] timer2时钟源选择
// 000:指令时钟;
// 001:系统时钟;
// 010:hirc的2倍频;
// 100:hirc;
// 101:lirc
tmr2h = 0; //定时器2计数寄存器
tmr2l = 141;
pr2h = 0; //周期=(pr+1)*tt2ck*tmr2预分频(蜂鸣器模式周期*2)
pr2l = 141;
p1adth = 0; //脉宽=p1xdt*tt2ck*tmr2预分频(蜂鸣器模式没用到)
p1adtl = 50;
p1oe = 0b00000000; //充许p1a0输出pwm(配置成timer定时器时这位清零)
//bit7: 0:禁止p1c输出到管脚;1:充许p1c输出到管脚
//bit6: 0:禁止p1b输出到管脚;1:充许p1b输出到管脚
//bit[5:0]: 0:禁止p1ax输出到管脚;1:充许p1ax输出到管脚
p1pol = 0b00000000; //高电平有效
//bit7: 0:p1c高电平有效;1:p1c低电平有效
//bit6: 0:p1b高电平有效;1:p1b低电平有效
//bit[5:0]: 0:p1ax高电平有效;1:p1ax低电平有效
p1con = 0b00000000;
//bit7: pwm1 重启使能位
// 1 = 故障刹车时,p1bevt位在退出关闭事件时自动清零,pwm1自动重启
// 0 = 故障刹车时,必须用软件将p1bevt清零以重启pwm1
//bit[6:0]: pwm1死区时间设置
// p1dcn = 预定mpwm信号应转变为有效与pwm信号实际转为有效之间的t2ck周期数
mscon = 0b00110000; //bit0: 0:t2睡眠时停止工作
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
tmr2if = 0; //清tmer2中断标志
tmr2ie = 1; //使能tmer2的中断(配置成timer定时器时不注释)
tmr2on = 1; //使能tmer2启动
peie = 1; //使能外设中断
gie = 1; //使能全局中断
}
/*-------------------------------------------------
* 函数名:sendctrl
* 功能: 发送数据函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void sendctrl(void)
{
if (irsendstatus == status_nosend) // 不发送的状态
{
irsend_pin_0;
sendbit = 0;
txtime = 0;
}
else if (irsendstatus == status_head) // 发送引导码
{
txtime++;
if (txtime < 17) // 发送9ms信号
{
irsend_pin_1;
}
else if (txtime < 24) // 4.5ms不发送
{
irsend_pin_0;
}
else
{
txtime = 0;
irsendstatus = status_data;
}
irsenddata = irdata[0];
txbit = 0x01;
}
else if(irsendstatus == status_data) // 发送数据
{
if (irsenddata & txbit) // 1,是1:3的时间
{
level1 = irsend_high_1;
level0 = irsend_low_1;
}
else // 0,是1:1的时间
{
level1 = irsend_high_0;
level0 = irsend_low_0;
}
txtime++;
if (txtime <= level1) // 发送信号
{
irsend_pin_1;
}
else if (txtime <= (level0+level1)) // 不发送信号
{
irsend_pin_0;
}
else if (sendbit < 4) // 发送4位数据未完成
{
txtime = 1;
irsend_pin_1;
savelastbit = irsenddata & txbit;
txbit <<= 1;
if (txbit == 0x00) // 发送完一个字节
{
txbit = 0x01;
sendbit++;
irsenddata = irdata[sendbit];
if (sendbit > 3) // 最后一位要注意,因为发送完了还要有一个脉冲
{
sendlastbit = 1;
}
}
}
else // 数据完成了,要补脉冲
{
if(sendlastbit)
{
txtime++;
if(savelastbit)
{
if(txtime < 3)
{
irsend_pin_0;
}
else if(txtime < 4)
{
irsend_pin_1;
}
else
{
irsend_pin_0;
irsendstatus = status_nosend;
irsend_pin_0;
sendlastbit = 0;
txbit = 0;
txtime = 0;
}
}
else
{
if(txtime < 5)
{
irsend_pin_0;
}
else if(txtime < 6)
{
irsend_pin_1;
}
else
{
irsend_pin_0;
irsendstatus = status_nosend;
irsend_pin_0;
sendlastbit = 0;
txbit = 0;
txtime = 0;
}
}
}
}
}
}
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理,包括定时器0中断和外部中断
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器0的中断处理
if(t0ie && t0if) //13us
{
tmr0 = 239; //注意:对tmr0重新赋值tmr0在两个周期内不变化
t0if = 0;
irsendio = ~irsendio; //翻转电平 产生38khz信号
}
//定时器2的中断处理
if(tmr2ie && tmr2if) //560us中断一次 红外每一位都是560us的倍数
{
tmr2if = 0;
sendctrl();
systime5s++;
//irsendio = ~irsendio;
}
}
/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial();
timer0_initial();
timer2inital();
gie = 1; //开中断
while(1)
{
if(systime5s >10000) //每隔5s发射一次
{
systime5s = 0;
irsendstatus = status_head;
}
}
}
ir_receive
// project: ft60e12x_ir_send.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 演示程序中,ir红外是采用6122协议,起始信号是9ms低电平,到4.5ms高电平,再到低8位用户识别码,到高8位的用户识别码,8位数据码,8位数据码的反码。sendio(pa4)定时(5秒钟)发送一次,接收端收到遥控器发过来的数据后,校验数据互为补码,led会开关。
// release history
// version date description
// 1.1 24-2-21 修改文件头
//********************************************************
#include "syscfg.h"
//**********************宏定义****************************
#define uchar unsigned char
#define uint unsigned int
#define irsendio pa4 // 串口的发送脚
#define irsend_high_1 1 // 560us
#define irsend_low_1 3 // 1680us
#define irsend_high_0 1 // 560us
#define irsend_low_0 1 // 560us
#define irsend_pin_1 t0ie = 1 // 发送数据 开启定时器0
#define irsend_pin_0 t0ie = 0 // 关闭定时器0
#define status_nosend 0 // 不发送的状态
#define status_head 1 // 发送引导码的状态
#define status_data 2 // 发送数据的状态
uchar irsendstatus; // 发送状态,是发送引导码还是数据
uchar irsenddata; // 发送的数据中转变量
uchar txbit=0,txtime=0;
uchar sendbit = 0;
uchar level0,level1; // 一位数据里发送与关闭的时间值
bit sendlastbit = 0;
uchar savelastbit = 0;
uint systime5s = 0; // 系统时间,5s发送一次
uchar irdata[4] = {0x00,0xff,0x40,0xbf}; // 需要发送的4个数据
/*----------------------------------------------------
* 函数名:power_initial
* 说明:初始化单片机
* 输入:无
* 输出:无
----------------------------------------------------*/
void power_initial(void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
//bit0=1,系统时钟为内部振荡器
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b11101111; //pa输入输出 0-输出 1-输入
//pa4->输出
portc = 0b00000000;
trisc = 0b11111111; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
wpuc = 0b00000000; //pc端口上拉控制 1-开上拉 0-关上拉
//60系列pc口无上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*----------------------------------------------------
* 函数名:timer0_initial
* 功能: 初始化设置定时器v
* 说明: 38khz发生器,1000000/38000=26.3us .由于定时太短,频繁进定时器,时间有一定的
* 误差,239并不是直接算出来的, 是示波器看的。
* 设置tmr0定时时长=(1/系统时钟频率)*指令周期*预分频值*26
* =(1/16000000)*4*2*26=13us
----------------------------------------------------*/
void timer0_initial (void)
{
option = 0b00000000;
//bit5 t0cs timer0时钟源选择
//1-外部引脚电平变化t0cki 0-内部时钟(fosc/2)
//bit4 t0cki引脚触发方式 1-下降沿 0-上升沿
//bit3 psa 预分频器分配位 0-timer0 1-wdt
//bit2:0 ps 8个预分频比 000 - 1:2
tmr0 = 239;
t0if = 0; //清空t0软件中断
}
/*----------------------------------------------------
* 函数名:timer2_initial
* 功能: 初始化设置定时器2 配置成pwm
* 设置: tmr2输出比较值定时=(1/系统时钟频率)*4*预分频值*后分频值*pr2
* =(1/16000000)*4*4*4*141
* =564us
----------------------------------------------------*/
void timer2inital(void)
{
t2con0 = 0b00011001; //t2预分频1:4,后分频1:4
//bit[7:0]: 无意义; 1:把pr2/p1xdty缓冲值分别更新到pr2寄存器和p1xdty_act
//bit[6:3]: 定时器2输出后分频比选择 0000: 1:1;0001: 1:2;……1:16
//bit[2:0]: 关闭定时器2;1:打开定时器2
//bit[1:0]: 定时器2预分频选择 00:1;01:4;1x:16
t2con1 = 0b00000000; //t2时钟来自系统时钟,pwm1连续模式
//bit4: pwm模式选择
// 0:连续模式;1:单脉冲模式
//bit3: 0:pwm模式;1:蜂鸣器模式
//bit[2:0] timer2时钟源选择
// 000:指令时钟;
// 001:系统时钟;
// 010:hirc的2倍频;
// 100:hirc;
// 101:lirc
tmr2h = 0; //定时器2计数寄存器
tmr2l = 141;
pr2h = 0; //周期=(pr+1)*tt2ck*tmr2预分频(蜂鸣器模式周期*2)
pr2l = 141;
p1adth = 0; //脉宽=p1xdt*tt2ck*tmr2预分频(蜂鸣器模式没用到)
p1adtl = 50;
p1oe = 0b00000000; //充许p1a0输出pwm(配置成timer定时器时这位清零)
//bit7: 0:禁止p1c输出到管脚;1:充许p1c输出到管脚
//bit6: 0:禁止p1b输出到管脚;1:充许p1b输出到管脚
//bit[5:0]: 0:禁止p1ax输出到管脚;1:充许p1ax输出到管脚
p1pol = 0b00000000; //高电平有效
//bit7: 0:p1c高电平有效;1:p1c低电平有效
//bit6: 0:p1b高电平有效;1:p1b低电平有效
//bit[5:0]: 0:p1ax高电平有效;1:p1ax低电平有效
p1con = 0b00000000;
//bit7: pwm1 重启使能位
// 1 = 故障刹车时,p1bevt位在退出关闭事件时自动清零,pwm1自动重启
// 0 = 故障刹车时,必须用软件将p1bevt清零以重启pwm1
//bit[6:0]: pwm1死区时间设置
// p1dcn = 预定mpwm信号应转变为有效与pwm信号实际转为有效之间的t2ck周期数
mscon = 0b00110000; //bit0: 0:t2睡眠时停止工作
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
tmr2if = 0; //清tmer2中断标志
tmr2ie = 1; //使能tmer2的中断(配置成timer定时器时不注释)
tmr2on = 1; //使能tmer2启动
peie = 1; //使能外设中断
gie = 1; //使能全局中断
}
/*-------------------------------------------------
* 函数名:sendctrl
* 功能: 发送数据函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void sendctrl(void)
{
if (irsendstatus == status_nosend) // 不发送的状态
{
irsend_pin_0;
sendbit = 0;
txtime = 0;
}
else if (irsendstatus == status_head) // 发送引导码
{
txtime++;
if (txtime < 17) // 发送9ms信号
{
irsend_pin_1;
}
else if (txtime < 24) // 4.5ms不发送
{
irsend_pin_0;
}
else
{
txtime = 0;
irsendstatus = status_data;
}
irsenddata = irdata[0];
txbit = 0x01;
}
else if(irsendstatus == status_data) // 发送数据
{
if (irsenddata & txbit) // 1,是1:3的时间
{
level1 = irsend_high_1;
level0 = irsend_low_1;
}
else // 0,是1:1的时间
{
level1 = irsend_high_0;
level0 = irsend_low_0;
}
txtime++;
if (txtime <= level1) // 发送信号
{
irsend_pin_1;
}
else if (txtime <= (level0+level1)) // 不发送信号
{
irsend_pin_0;
}
else if (sendbit < 4) // 发送4位数据未完成
{
txtime = 1;
irsend_pin_1;
savelastbit = irsenddata & txbit;
txbit <<= 1;
if (txbit == 0x00) // 发送完一个字节
{
txbit = 0x01;
sendbit++;
irsenddata = irdata[sendbit];
if (sendbit > 3) // 最后一位要注意,因为发送完了还要有一个脉冲
{
sendlastbit = 1;
}
}
}
else // 数据完成了,要补脉冲
{
if(sendlastbit)
{
txtime++;
if(savelastbit)
{
if(txtime < 3)
{
irsend_pin_0;
}
else if(txtime < 4)
{
irsend_pin_1;
}
else
{
irsend_pin_0;
irsendstatus = status_nosend;
irsend_pin_0;
sendlastbit = 0;
txbit = 0;
txtime = 0;
}
}
else
{
if(txtime < 5)
{
irsend_pin_0;
}
else if(txtime < 6)
{
irsend_pin_1;
}
else
{
irsend_pin_0;
irsendstatus = status_nosend;
irsend_pin_0;
sendlastbit = 0;
txbit = 0;
txtime = 0;
}
}
}
}
}
}
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理,包括定时器0中断和外部中断
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器0的中断处理
if(t0ie && t0if) //13us
{
tmr0 = 239; //注意:对tmr0重新赋值tmr0在两个周期内不变化
t0if = 0;
irsendio = ~irsendio; //翻转电平 产生38khz信号
}
//定时器2的中断处理
if(tmr2ie && tmr2if) //560us中断一次 红外每一位都是560us的倍数
{
tmr2if = 0;
sendctrl();
systime5s++;
//irsendio = ~irsendio;
}
}
/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial();
timer0_initial();
timer2inital();
gie = 1; //开中断
while(1)
{
if(systime5s >10000) //每隔5s发射一次
{
systime5s = 0;
irsendstatus = status_head;
}
}
}
io
// project: ft60e12x_ir_send.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 演示程序中,ir红外是采用6122协议,起始信号是9ms低电平,到4.5ms高电平,再到低8位用户识别码,到高8位的用户识别码,8位数据码,8位数据码的反码。sendio(pa4)定时(5秒钟)发送一次,接收端收到遥控器发过来的数据后,校验数据互为补码,led会开关。
// release history
// version date description
// 1.1 24-2-21 修改文件头
//********************************************************
#include "syscfg.h"
//**********************宏定义****************************
#define uchar unsigned char
#define uint unsigned int
#define irsendio pa4 // 串口的发送脚
#define irsend_high_1 1 // 560us
#define irsend_low_1 3 // 1680us
#define irsend_high_0 1 // 560us
#define irsend_low_0 1 // 560us
#define irsend_pin_1 t0ie = 1 // 发送数据 开启定时器0
#define irsend_pin_0 t0ie = 0 // 关闭定时器0
#define status_nosend 0 // 不发送的状态
#define status_head 1 // 发送引导码的状态
#define status_data 2 // 发送数据的状态
uchar irsendstatus; // 发送状态,是发送引导码还是数据
uchar irsenddata; // 发送的数据中转变量
uchar txbit=0,txtime=0;
uchar sendbit = 0;
uchar level0,level1; // 一位数据里发送与关闭的时间值
bit sendlastbit = 0;
uchar savelastbit = 0;
uint systime5s = 0; // 系统时间,5s发送一次
uchar irdata[4] = {0x00,0xff,0x40,0xbf}; // 需要发送的4个数据
/*----------------------------------------------------
* 函数名:power_initial
* 说明:初始化单片机
* 输入:无
* 输出:无
----------------------------------------------------*/
void power_initial(void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
//bit0=1,系统时钟为内部振荡器
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b11101111; //pa输入输出 0-输出 1-输入
//pa4->输出
portc = 0b00000000;
trisc = 0b11111111; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
wpuc = 0b00000000; //pc端口上拉控制 1-开上拉 0-关上拉
//60系列pc口无上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*----------------------------------------------------
* 函数名:timer0_initial
* 功能: 初始化设置定时器v
* 说明: 38khz发生器,1000000/38000=26.3us .由于定时太短,频繁进定时器,时间有一定的
* 误差,239并不是直接算出来的, 是示波器看的。
* 设置tmr0定时时长=(1/系统时钟频率)*指令周期*预分频值*26
* =(1/16000000)*4*2*26=13us
----------------------------------------------------*/
void timer0_initial (void)
{
option = 0b00000000;
//bit5 t0cs timer0时钟源选择
//1-外部引脚电平变化t0cki 0-内部时钟(fosc/2)
//bit4 t0cki引脚触发方式 1-下降沿 0-上升沿
//bit3 psa 预分频器分配位 0-timer0 1-wdt
//bit2:0 ps 8个预分频比 000 - 1:2
tmr0 = 239;
t0if = 0; //清空t0软件中断
}
/*----------------------------------------------------
* 函数名:timer2_initial
* 功能: 初始化设置定时器2 配置成pwm
* 设置: tmr2输出比较值定时=(1/系统时钟频率)*4*预分频值*后分频值*pr2
* =(1/16000000)*4*4*4*141
* =564us
----------------------------------------------------*/
void timer2inital(void)
{
t2con0 = 0b00011001; //t2预分频1:4,后分频1:4
//bit[7:0]: 无意义; 1:把pr2/p1xdty缓冲值分别更新到pr2寄存器和p1xdty_act
//bit[6:3]: 定时器2输出后分频比选择 0000: 1:1;0001: 1:2;……1:16
//bit[2:0]: 关闭定时器2;1:打开定时器2
//bit[1:0]: 定时器2预分频选择 00:1;01:4;1x:16
t2con1 = 0b00000000; //t2时钟来自系统时钟,pwm1连续模式
//bit4: pwm模式选择
// 0:连续模式;1:单脉冲模式
//bit3: 0:pwm模式;1:蜂鸣器模式
//bit[2:0] timer2时钟源选择
// 000:指令时钟;
// 001:系统时钟;
// 010:hirc的2倍频;
// 100:hirc;
// 101:lirc
tmr2h = 0; //定时器2计数寄存器
tmr2l = 141;
pr2h = 0; //周期=(pr+1)*tt2ck*tmr2预分频(蜂鸣器模式周期*2)
pr2l = 141;
p1adth = 0; //脉宽=p1xdt*tt2ck*tmr2预分频(蜂鸣器模式没用到)
p1adtl = 50;
p1oe = 0b00000000; //充许p1a0输出pwm(配置成timer定时器时这位清零)
//bit7: 0:禁止p1c输出到管脚;1:充许p1c输出到管脚
//bit6: 0:禁止p1b输出到管脚;1:充许p1b输出到管脚
//bit[5:0]: 0:禁止p1ax输出到管脚;1:充许p1ax输出到管脚
p1pol = 0b00000000; //高电平有效
//bit7: 0:p1c高电平有效;1:p1c低电平有效
//bit6: 0:p1b高电平有效;1:p1b低电平有效
//bit[5:0]: 0:p1ax高电平有效;1:p1ax低电平有效
p1con = 0b00000000;
//bit7: pwm1 重启使能位
// 1 = 故障刹车时,p1bevt位在退出关闭事件时自动清零,pwm1自动重启
// 0 = 故障刹车时,必须用软件将p1bevt清零以重启pwm1
//bit[6:0]: pwm1死区时间设置
// p1dcn = 预定mpwm信号应转变为有效与pwm信号实际转为有效之间的t2ck周期数
mscon = 0b00110000; //bit0: 0:t2睡眠时停止工作
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
tmr2if = 0; //清tmer2中断标志
tmr2ie = 1; //使能tmer2的中断(配置成timer定时器时不注释)
tmr2on = 1; //使能tmer2启动
peie = 1; //使能外设中断
gie = 1; //使能全局中断
}
/*-------------------------------------------------
* 函数名:sendctrl
* 功能: 发送数据函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void sendctrl(void)
{
if (irsendstatus == status_nosend) // 不发送的状态
{
irsend_pin_0;
sendbit = 0;
txtime = 0;
}
else if (irsendstatus == status_head) // 发送引导码
{
txtime++;
if (txtime < 17) // 发送9ms信号
{
irsend_pin_1;
}
else if (txtime < 24) // 4.5ms不发送
{
irsend_pin_0;
}
else
{
txtime = 0;
irsendstatus = status_data;
}
irsenddata = irdata[0];
txbit = 0x01;
}
else if(irsendstatus == status_data) // 发送数据
{
if (irsenddata & txbit) // 1,是1:3的时间
{
level1 = irsend_high_1;
level0 = irsend_low_1;
}
else // 0,是1:1的时间
{
level1 = irsend_high_0;
level0 = irsend_low_0;
}
txtime++;
if (txtime <= level1) // 发送信号
{
irsend_pin_1;
}
else if (txtime <= (level0+level1)) // 不发送信号
{
irsend_pin_0;
}
else if (sendbit < 4) // 发送4位数据未完成
{
txtime = 1;
irsend_pin_1;
savelastbit = irsenddata & txbit;
txbit <<= 1;
if (txbit == 0x00) // 发送完一个字节
{
txbit = 0x01;
sendbit++;
irsenddata = irdata[sendbit];
if (sendbit > 3) // 最后一位要注意,因为发送完了还要有一个脉冲
{
sendlastbit = 1;
}
}
}
else // 数据完成了,要补脉冲
{
if(sendlastbit)
{
txtime++;
if(savelastbit)
{
if(txtime < 3)
{
irsend_pin_0;
}
else if(txtime < 4)
{
irsend_pin_1;
}
else
{
irsend_pin_0;
irsendstatus = status_nosend;
irsend_pin_0;
sendlastbit = 0;
txbit = 0;
txtime = 0;
}
}
else
{
if(txtime < 5)
{
irsend_pin_0;
}
else if(txtime < 6)
{
irsend_pin_1;
}
else
{
irsend_pin_0;
irsendstatus = status_nosend;
irsend_pin_0;
sendlastbit = 0;
txbit = 0;
txtime = 0;
}
}
}
}
}
}
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理,包括定时器0中断和外部中断
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器0的中断处理
if(t0ie && t0if) //13us
{
tmr0 = 239; //注意:对tmr0重新赋值tmr0在两个周期内不变化
t0if = 0;
irsendio = ~irsendio; //翻转电平 产生38khz信号
}
//定时器2的中断处理
if(tmr2ie && tmr2if) //560us中断一次 红外每一位都是560us的倍数
{
tmr2if = 0;
sendctrl();
systime5s++;
//irsendio = ~irsendio;
}
}
/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial();
timer0_initial();
timer2inital();
gie = 1; //开中断
while(1)
{
if(systime5s >10000) //每隔5s发射一次
{
systime5s = 0;
irsendstatus = status_head;
}
}
}
int
// project: ft60e12x_int.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 程序中demoportout(pa4)输出100帧50hz的占空比为50%的方波后, mcu进入睡眠, 等待外部中断的发生;当外部中断触发后,重复以上流程;
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//***********************宏定义*****************************
#define unchar unsigned char
#define demoportout pa4
unchar fcount;
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//pa2外部中断处理
if(inte && intf)
{
intf = 0; //清pa2 int 标志位
inte = 0; //暂先禁止pa2中断
}
}
/*----------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
----------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000100;
trisa = 0b00000100; //pa输入输出 0-输出 1-输入
//pa4->输出
portc = 0b00000000;
trisc = 0b00000100; //pc输入输出 0-输出 1-输入
wpua = 0b00000100; //pa端口上拉控制 1-开上拉 0-关上拉
//开pa2上拉
wpuc = 0b00000000; //pc端口上拉控制 1-开上拉 0-关上拉
//60系列pc口无上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr; 1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 当t2时钟不是选择指令时钟的时候
// 0: 睡眠时停止工作; 1: 睡眠时保持工作。
}
/*----------------------------------------------------
* 函数名称:delayus
* 功能: 短延时函数 --16m-2t--大概快1%左右.
* 输入参数:time 延时时间长度 延时时长time us
* 返回参数:无
----------------------------------------------------*/
void delayus(unsigned char time)
{
unsigned char a;
for(a=0;a<time;a++)
{
nop();
}
}
/*----------------------------------------------------
* 函数名称:delayms
* 功能: 短延时函数
* 输入参数:time 延时时间长度 延时时长time ms
* 返回参数:无
----------------------------------------------------*/
void delayms(unsigned char time)
{
unsigned char a,b;
for(a=0;a<time;a++)
{
for(b=0;b<5;b++)
{
delayus(197); //快1%
}
}
}
/*-------------------------------------------------
* 函数名: int_initial
* 功能: 中断初始化函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void int_initial(void)
{
trisa2 =1; //set pa2 input
ioca2 =0; //禁止pa2电平变化中断
intedg =1; //option,intedg=1;pa2 int 为上升沿触发
intf =0; //清pa2 int中断标志位
inte =1; //使能pa2 int中断
}
/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
power_initial(); //系统初始化
while(1)
{
for(fcount=0;fcount<100;fcount++) //输出100次波形
{
demoportout = 1;
delayms(10); //10ms
demoportout = 0;
delayms(10);
}
int_initial(); //初始化外部中断
gie = 1; //开总中断
sleep(); //睡眠
}
}
iic
// project: ft60e12x_iic.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 此演示程序位60e12x_iic的演示程序.该程序把0x55写入(24c02)0x12地址,后读0x12地址的值,判断是否写入成功
// release history
// version date description
// 1.1 24-2-21 修改文件头
#include "syscfg.h"
//***********************宏定义*****************************
#define unchar unsigned char
#define iic_scl pa4
#define iic_sda pa2
#define sda_out trisa2 =0
#define sda_in trisa2 =1
volatile unchar iicreaddata;
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
//pa4->输出
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
wpuc = 0b00000000; //pc端口上拉控制 1-开上拉 0-关上拉
//60系列pc口无上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5:psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4:psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3:ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0:0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*-------------------------------------------------
* 函数名称:delayus
* 功能: 短延时函数 --16m-4t--大概快1%左右.
* 输入参数:time 延时时间长度 延时时长time*2us
* 返回参数:无
-------------------------------------------------*/
void delayus(unsigned char time)
{
unsigned char a;
for(a=0;a<time;a++)
{
nop();
}
}
/*-------------------------------------------------
* 函数名:iic_start
* 功能: 产生iic起始信号
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void iic_start(void)
{
sda_out; //sda线输出
iic_sda=1;
iic_scl=1;
delayus(2);
iic_sda=0; //开始:当scl为高时,sda由高变低
delayus(2);
iic_scl=0; //钳住i2c总线,准备发送或接收数据
delayus(2);
}
/*-------------------------------------------------
* 函数名:iic_stop
* 功能: 产生iic停止信号
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void iic_stop(void)
{
sda_out; //sda线输出
iic_scl=0;
iic_sda=0; //停止:当scl为高时,sda由低变高
delayus(2);
iic_scl=1;
delayus(2);
iic_sda=1; //发送i2c总线结束信号
delayus(2);
}
/*-------------------------------------------------
* 函数名:iic_wait_ack
* 功能: 等待应答信号到来
* 输入: 无
* 输出: 返回值:1,接收应答失败
* 0,接收应答成功
--------------------------------------------------*/
unsigned char iic_wait_ack(void)
{
unsigned char ucerrtime=0;
sda_in; //sda设置为输入
iic_sda=1;
delayus(1);
iic_scl=1;
delayus(1);
while(iic_sda)
{
ucerrtime++;
if(ucerrtime>250) //等待超时
{
iic_stop();
return 1;
}
}
iic_scl=0; //时钟输出0
return 0;
}
/*-------------------------------------------------
* 函数名:iic_ack
* 功能: 产生ack应答
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void iic_ack(void)
{
iic_scl=0;
sda_out; //sda线输出
iic_sda=0;
delayus(1);
iic_scl=1;
delayus(1);
iic_scl=0;
}
/*-------------------------------------------------
* 函数名:iic_nack
* 功能: 不产生ack应答
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void iic_nack(void)
{
iic_scl=0;
sda_out; //sda线输出
iic_sda=1;
delayus(1);
iic_scl=1;
delayus(1);
iic_scl=0;
}
/*-------------------------------------------------
* 函数名:iic_send_byte
* 功能: iic发送一个字节
* 输入: 写入要发送的一个人字节数据txd
* 输出: 无
--------------------------------------------------*/
void iic_send_byte(unsigned char txd)
{
unsigned char t;
sda_out; //sda线输出
iic_scl=0; //拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if(txd&0x80)
iic_sda=1;
else
iic_sda=0;
txd<<=1;
delayus(1);
iic_scl=1;
delayus(1);
iic_scl=0;
delayus(1);
}
}
/*-------------------------------------------------
* 函数名:iic_read_byte
* 功能: iic读一个字节
* 输入: 无
* 输出: 读出存储器里面的数据并返回receive
--------------------------------------------------*/
unsigned char iic_read_byte(void)
{
unsigned char i,receive=0;
sda_in; //sda设置为输入
for(i=0;i<8;i++ )
{
iic_scl=0;
delayus(1);
iic_scl=1;
receive<<=1;
if(iic_sda)receive++;
delayus(1);
}
iic_nack(); //发送nack
return receive;
}
/*-------------------------------------------------
* 函数名:iic_read
* 功能: iic读出制定位置的数据
* 输入: address
* 输出: 读出address存储器里面的数据iicdata
--------------------------------------------------*/
unsigned char iic_read(unsigned char address)
{
unsigned char iicdata = 0;
iic_read_begin:
iic_start();
iic_send_byte(0xa0);
if(iic_wait_ack())goto iic_read_begin;
iic_send_byte(address); //填要读的数据地址
if(iic_wait_ack())goto iic_read_begin;
iic_start();
iic_send_byte(0xa1);
if(iic_wait_ack())goto iic_read_begin;
iicdata=iic_read_byte();
iic_stop();
return iicdata;
}
/*-------------------------------------------------
* 函数名:iic_write
* 功能: iic把数据data写入制定的位置address
* 输入: address,data
* 输出: 无
--------------------------------------------------*/
void iic_write(unsigned char address,unsigned char data)
{
iic_write_begin:
iic_start();
iic_send_byte(0xa0);
if(iic_wait_ack())goto iic_write_begin;
iic_send_byte(address);
if(iic_wait_ack())goto iic_write_begin;
iic_send_byte(data);
if(iic_wait_ack())goto iic_write_begin;
iic_stop();
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial(); //系统初始化
iic_write(0x12,0x55); //0x55写入地址0x12
iicreaddata = iic_read(0x12); //读取0x12地址eeprom值
while(1)
{
nop();
}
}
eeprom
// project: ft60e12x_eeprom.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 此演示程序为60e12x eeprom的演示程序.把0x55写入地址0x13,再读出该值
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//*********************宏定义******************************
#define unchar unsigned char
volatile unchar eereaddata;
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
option = 0b00001000; //bit3=1,wdt mode,ps=000=wdt rate 1:1
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5:psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4:psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3:ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0:0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*----------------------------------------------------
* 函数名称:eepromread
* 功能: 读eeprom数据
* 输入参数:eeaddr 需读取数据的地址
* 返回参数;reeepromread 对应地址读出的数据
----------------------------------------------------*/
unchar eepromread(unchar eeaddr)
{
unchar reeepromread;
eeadr = eeaddr;
rd = 1;
reeepromread = eedat; //eeprom的读数据 reeepromread = eedata;
return reeepromread;
}
/*----------------------------------------------------
* 函数名称:eepromwrite
* 功能: 写数据到eeprom
* 输入参数:eeaddr 需要写入数据的地址
* data 需要写入的数据
* 返回参数:无
----------------------------------------------------*/
void eepromwrite(unchar eeaddr,unchar data)
{
gie = 0; //写数据必须关闭中断
while(gie); //等待gie为0
eeadr = eeaddr; //eeprom的地址
eedat = data; //eeprom的写数据 eedata = data;
eeif = 0;
eecon1 |= 0x34; //置位wren1,wren2,wren3三个变量.
wr = 1; //置位wr启动编程
while(wr); //等待ee写入完成
gie = 1;
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
power_initial(); //系统初始化
eepromwrite(0x13,0x55); //0x55写入地址0x13
eereaddata = eepromread(0x13); //读取0x13地址eeprom值
while(1)
{
nop();
}
}
lvd
// project: ft60e12x_lvd.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 设置pa5为lvd检测脚,当pa5为高时,vdd正常,demoportout输出low,当pa5为低时,vdd掉到了所设置的低电压以下,demoportout输出high.
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//***********************宏定义****************************
#define demoportout pa4
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
//pa4-out
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。
// 当t2时钟不是选择指令时钟的时候比较器,cxin为数字io口
pcon = 0b11010011;
//bit7 lvd模块检测电压源选择 1:检测外部管脚pa5,0:检测内部电压
//bit[6:4] 低电压侦测选择位。 101 3.0v
//bit3 低电压侦测使能。 1:开启lvd侦测功能,0:关闭
//bit2 低电压标志位,只读。 1:vdd掉了设置电压以下,0:vdd正常
//bit1 上电复位标志,低有效。0:发生了上电复位,1:没有发生
//bit0 低电压复位标志,低有效。0:发生了低电压复位,1:没有发生
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial(); //系统初始化
pcon |= 0b00001000; //开启lvd侦测功能
while(1)
{
if(pcon&0x04) //判断低电压标志位
{
demoportout = 1; //侦测到低电压标志为1
}
else
{
demoportout = 0; //vdd正常
}
}
}
lvd_pwm
// project: ft60e12x_lvd_pwm.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 低电压检测与pwm联动,检测输出可作为pwm的刹车源。当检测到lvd事件时,pwm刹车,当lvd事件消除时,pwm1~pwm6继续输出10khz占空比50%的波形。
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*************************************************
#include "syscfg.h"
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器2的中断处
if(tmr2ie && tmr2if) //100us中断一次
{
tmr2if = 0;
}
}
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000; //bit0: 0:t2睡眠时停止工作
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1:睡眠时保持工作。
// 当t2时钟不是选择指令时钟的时候
}
/*-------------------------------------------------
* 函数名: timer2_initial
* 功能: 初始化设置定时器2
* 设置: 周期=(pr+1)*tt2ck*tmr2预分频(蜂鸣器模式周期*2)
* =(199+1)*1/8000000*4=100us
* 脉宽=p1xdt*tt2ck*tmr2预分频
* =100*1/8000000*4=50us
-------------------------------------------------*/
void pwm1_initial (void)
{
t2con0 = 0b00000001; //t2预分频1:4,后分频1:1
//bit7: 0:无意义; 1:把pr2/p1xdty缓冲值分别更新到pr2寄存器和p1xdty_act
//bit[6:3]: 定时器2输出后分频比选择 0000:1:1;0001:1:2;……1:16
//bit2: 0:关闭定时器2;1:打开定时器2
//bit[1:0]: 定时器2预分频选择 00:1;01:4;1x:16
t2con1 = 0b00000000; //t2时钟来自系统时钟,pwm1连续模式
//bit4: pwm模式选择 0:连续模式;1:单脉冲模式
//bit3: 0:pwm模式;1:蜂鸣器模式
//timer2时钟源选择:000:指令时钟;001:系统时钟;010:hirc的2倍频;100:hirc;101:lirc
tmr2h = 0; //定时器2计数寄存器
tmr2l = 0;
pr2h = 0; //周期=(pr+1)*tt2ck*tmr2预分频(蜂鸣器模式周期*2)
pr2l = 199;
p1adth = 0; //脉宽=p1xdt*tt2ck*tmr2预分频(蜂鸣器模式没用到)
p1adtl = 100;
p1oe = 0b00111111; //允许p1a0输出pwm(配置成timer定时器时这位清零)
//bit7: 0:禁止p1c输出到管脚;1:充许p1c输出到管脚
//bit6: 0:禁止p1b输出到管脚;1:充许p1b输出到管脚
//bit[5:0]: 0:禁止p1ax输出到管脚;1:充许p1ax输出到管脚
p1pol = 0b00000000; //高电平有效
//bit7: 0:p1c高电平有效 1:p1c低电平有效
//bit6: 0:p1b高电平有效 1:p1b低电平有效
//bit[5:0]: 0:p1ax高电平有效 1:p1ax低电平有效
p1con = 0b10000000;
//bit7: pwm 重启使能位
// 1 = 故障刹车时,p1bevt位在退出关闭事件时自动清零,pwm自动重启
// 0 = 故障刹车时,必须用软件将p1bevt清零以重启pwm
//bit[6:0]:pwm死区时间设置
// p1dcn = 预定mpwm信号应转变为有效与pwm信号实际转为有效之间的t2ck周期数
pcon = 0b11010011;
//bit7 lvd模块检测电压源选择 1:检测外部管脚pa5,0:检测内部电压
//bit[6:4] 低电压侦测选择位。 101 3.0v
//bit3 低电压侦测使能。 1:开启lvd侦测功能,0:关闭
//bit2 低电压标志位,只读。 1:vdd掉了设置电压以下,0:vdd正常
//bit1 上电复位标志,低有效。0:发生了上电复位,1:没有发生
//bit0 低电压复位标志,低有效。0:发生了低电压复位,1:没有发生
p1br0 = 0b00110000;
//bit7 pwm故障事件状态位 1:发生了故障事件 0:未发生故障事件,pwm输出正常工作
//bit[6:4] pwm故障源选择位 000=禁止故障刹车功能 001=bk0为低电平 010=bk0为高电平
// 011=lvdw=1 100=bk0为低电平或lvdw=1 101=bk0位高电平或lvdw=1
//bit[3:2]: 故障下,p1b管脚的状态 00=高阻 01=无效电平 1x=有效电平
//bit[1:0]: 故障下,p1a管脚的状态 00=高阻 01=无效电平 1x=有效电平
p1br1 = 0b00000000;
//bit[7:6] 故障下,p1c管脚的状态,只有当p1calt为1时才有效 00=高阻 01输出0 1x=输出1
//bit[5:4] 故障下,p1c管脚的状态,只有当p1calt为1时才有效 00=高阻 01输出0 1x=输出1
//bit3 p1c功能映射选择
//bit2 p1b功能映射选择
//bit[1:0] 故障下,p1c管脚的状态 00=高阻 01=无效电平 1x=有效电平
tmr2if = 0; //清tmer2中断标志
tmr2on = 1; //使能tmer2启动
peie = 1; //使能外设中断
gie = 1; //使能全局中断
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial(); //系统初始化
pwm1_initial(); //lvd,pwm1,tm2的初始化
pcon |= 0b00001000; //开启lvd侦测功能
while(1)
{
if(pcon&0x04) //判断低电压标志位
{
nop(); //侦测到低电压标志为1
}
else
{
nop();
}
}
}
msck
// project: ft60e12x_msck.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 程序中读取快时钟测量慢时钟数据
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*******************************************************
#include "syscfg.h"
//***********************宏定义**************************
#define unint unsigned int
volatile unint testbuff;
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*----------------------------------------------------
* 函数名称: delayus
* 功能: 短延时函数 --16m-2t--大概快1%左右.
* 输入参数: time 延时时间长度 延时时长time us
* 返回参数: 无
----------------------------------------------------*/
void delayus(unsigned char time)
{
unsigned char a;
for(a=0;a<time;a++)
{
nop();
}
}
/*----------------------------------------------------
* 函数名称:delayms
* 功能: 短延时函数
* 输入参数:time 延时时间长度 延时时长time ms
* 返回参数:无
----------------------------------------------------*/
void delayms(unsigned char time)
{
unsigned char a,b;
for(a=0;a<time;a++)
{
for(b=0;b<5;b++)
{
delayus(197); //快1%
}
}
}
/*-------------------------------------------------
* 函数名: slowtimetest
* 功能: 快时钟测量慢时钟
* 输入: 无
* 输出: 慢时钟时钟测量值testtime
* 不开平均模式慢时钟频率=16m/testtime(2t)
* 开平均模式慢时钟频率 = 16m/testtime/4(2t)
--------------------------------------------------*/
unint slowtimetest()
{
unint testtime;
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
//ircf = 111,scs = 1.
tmr2on = 1; //开定时器2
ckmif = 0; //清标志位
ckmavg = 0; //关闭平均模式
//注:打开平均模式输出数据为四个周期的时钟数(单周期*4)
ckcnti = 1; //使能快时钟测量位,开始测量
while(!ckmif);
ckmif = 0;
testtime = soscprh << 8;
testtime = testtime + soscprl;
return testtime;
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial(); //系统初始化
while(1)
{
testbuff = slowtimetest(); //时钟测量值
//32768该数值≈488(不开平均模式-单周期)
//慢时钟= testbuff/16(khz)
nop();
nop();
nop();
delayms(200); //延时200ms
}
}
pa_int
// project: ft60e12x_pa_int.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 程序中demoportout(pa4)输出100帧50hz的占空比为50%的方波后,mcu进入睡眠,等待中断的发生;当每次pa2电平变化中断触发后,重复以上流程;
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//***********************宏定义****************************
#define unchar unsigned char
#define demoportout pa4
unchar fcount;
unchar readapin;
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//pa电平变化中断**********************
if(paie && paif)
{
readapin = porta; //读取porta数据清paif标志
paif = 0; //清paif标志位
paie = 0; //暂先禁止pa0中断
ioca2 =0; //禁止pa0电平变化中断
}
}
/*----------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
----------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000100; //pa输入输出 0-输出 1-输入
//pa4-out
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000100; //pa端口上拉控制 1-开上拉 0-关上拉
//开pa2上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 当t2时钟不是选择指令时钟的时候
// 0:睡眠时停止工作:1: 睡眠时保持工作
}
/*----------------------------------------------------
* 函数名称:delayus
* 功能: 短延时函数 --16m-2t--大概快1%左右.
* 输入参数:time 延时时间长度 延时时长time us
* 返回参数:无
----------------------------------------------------*/
void delayus(unsigned char time)
{
unsigned char a;
for(a=0;a<time;a++)
{
nop();
}
}
/*----------------------------------------------------
* 函数名称:delayms
* 功能: 短延时函数
* 输入参数:time 延时时间长度 延时时长time ms
* 返回参数:无
----------------------------------------------------*/
void delayms(unsigned char time)
{
unsigned char a,b;
for(a=0;a<time;a++)
{
for(b=0;b<5;b++)
{
delayus(197); //快1%
}
}
}
/*----------------------------------------------------
* 函数名称:delays
* 功能: 短延时函数
* 输入参数:time 延时时间长度 延时时长times
* 返回参数:无
----------------------------------------------------*/
void delays(unsigned char time)
{
unsigned char a,b;
for(a=0;a<time;a++)
{
for(b=0;b<10;b++)
{
delayms(100);
}
}
}
/*-------------------------------------------------
* 函数名: pa2_level_change_initial
* 功能: pa端口(pa2)电平变化中断初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void pa2_level_change_initial(void)
{
trisa2 = 1; //set pa2 input
readapin = porta; //清pa电平变化中断
paif = 0; //清pa int中断标志位
ioca2 = 1; //使能pa2电平变化中断
paie = 1; //使能pa int中断
//gie = 1; //使能全局中断
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
power_initial(); //系统初始化
while(1)
{
for(fcount=0;fcount<100;fcount++) //输出100次波形
{
demoportout = 1;
delayms(10); //10ms
demoportout = 0;
delayms(10);
}
pa2_level_change_initial(); //初始化外部中断
gie = 1; //开总中断
sleep(); //睡眠
}
}
pwm
// project: ft60e12x_pwm.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: pwm1~pwm6输出10khz占空比50%的波形
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器2的中断处理
if(tmr2ie && tmr2if) //50us中断一次 = 10khz
{
tmr2if = 0;
}
}
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //wdt 32khz ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
portc = 0b00000000;
trisc = 0b11000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
wpuc = 0b00000000; //pc端口上拉控制 1-开上拉 0-关上拉
//60系列pc口无上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
//bit7(papu)=0 enabled pull up pa
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5:psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4:psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3:ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0:0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*-------------------------------------------------
* 函数名称:timer2_initial
* 功能: 初始化设置定时器2
* 设置: 周期=(pr+1)*tt2ck*tmr2预分频(蜂鸣器模式周期*2)
* =(199+1)*1/8000000*4=100us
* 脉宽=p1xdt*tt2ck*tmr2预分频
* =100*1/8000000*4=50us
-------------------------------------------------*/
void pwm1_initial (void)
{
t2con0 = 0b00000001; //t2预分频1:4,后分频1:1
//bit7: 0:无意义; 1:把pr2/p1xdty缓冲值分别更新到pr2寄存器和p1xdty_act
//bit[6:3]: 定时器2输出后分频比选择 0000: 1:1;0001: 1:2;……1:16
//bit2:0: 关闭定时器2;1:打开定时器2
//bit[1:0]: 定时器2预分频选择 00:1;01:4;1x:16
t2con1 = 0b00000000; //t2时钟来自系统时钟,pwm连续模式
//bit4: pwm模式选择 0:连续模式;1:单脉冲模式
//bit3: 0:pwm模式;1:蜂鸣器模式
//bit[2:0] timer2时钟源选择:
// 000:指令时钟;
// 001:系统时钟;
// 010:hirc的2倍频;
// 100:hirc;
// 101:lirc
tmr2h = 0; //定时器2计数寄存器
tmr2l = 0;
pr2h = 0; //周期
pr2l = 199;
p1adth = 0; //脉宽
p1adtl = 100;
p1oe = 0b00111111; //允许p1a0-5输出pwm(配置成timer定时器时这位清零)
//bit7: 0:禁止p1c输出到管脚;1:允许p1c输出到管脚
//bit6: 0:禁止p1b输出到管脚;1:允许p1b输出到管脚
//bit5~bit0: 0:禁止p1ax输出到管脚;1:允许p1bx输出到管脚
p1pol = 0b00000000; //高电平有效
//bit7: 0:p1c高电平有效;1:p1c低电平有效
//bit6: 0:p1b高电平有效;1:p1b低电平有效
//bit5~bit0: 0:p1ax高电平有效;1:p1ax低电平有效
p1con = 0b00000000;
//bit7:pwm 重启使能位
//1 = 故障刹车时,p1bevt位在退出关闭事件时自动清零,pwm自动重启
//0 = 故障刹车时,必须用软件将p1bevt清零以重启pwm
//bit6~0:pwm1死区时间设置
//p1dcn = 预定mpwm信号应转变为有效与pwm信号实际转为有效之间的t2ck周期数
tmr2if = 0; //清tmer2中断标志
tmr2on = 1; //使能tmer2启动
peie = 1; //使能外设中断
gie = 1; //使能全局中断
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
power_initial(); //系统初始化
pwm1_initial(); //初始化t2
while(1)
{
nop();
}
}
sleep
// project: ft60e12x_sleep.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 此程序为ft60e12x-sleep睡眠演示程序,上电之后led1、led2同时置高约4s,然后置低,进入睡眠。测试ft60f12x的睡眠功耗:
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//***********************宏定义*****************************
#define led1 pa4
#define led2 pa5
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/4t=4mhz,0.25us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
//pa4,pa5-out
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 当t2时钟不是选择指令时钟的时候
// 0:睡眠时停止工作:1: 睡眠时保持工作
}
/*-------------------------------------------------
* 函数名称:delayus
* 功能: 短延时函数 --16m-4t--大概快1%左右.
* 输入参数:time 延时时间长度 延时时长time*2 us
* 返回参数:无
-------------------------------------------------*/
void delayus(unsigned char time)
{
unsigned char a;
for(a=0;a<time;a++)
{
nop();
}
}
/*-------------------------------------------------
* 函数名称:delayms
* 功能: 短延时函数
* 输入参数:time 延时时间长度 延时时长time ms
* 返回参数:无
-------------------------------------------------*/
void delayms(unsigned char time)
{
unsigned char a,b;
for(a=0;a<time;a++)
{
for(b=0;b<5;b++)
{
delayus(98); //快1%
}
}
}
/*-------------------------------------------------
* 函数名称:delays
* 功能: 短延时函数
* 输入参数:time 延时时间长度 延时时长time s
* 返回参数:无
-------------------------------------------------*/
void delays(unsigned char time)
{
unsigned char a,b;
for(a=0;a<time;a++)
{
for(b=0;b<10;b++)
{
delayms(100);
}
}
}/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial(); //系统初始化
led1 = 1;
led2 = 1;
delays(4);
led1 = 0;
led2 = 0;
while(1)
{
clrwdt(); //清看门狗
nop();
sleep();
nop();
}
}
spi
// project: ft60e12x_spi.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 此演示程序为60e12x_spi的演示程序.该程序写入0x55到(25c64)0x13地址,然后读取0x13地址值
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//***********************宏定义*****************************
#define unchar unsigned char
#define unint unsigned int
#define miso pa4
#define mosi pa2
#define sck pa6
#define cs pa7
volatile unchar spireaddata;
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/4=4mhz,0.25us
intcon = 0; //暂禁止所有中断
porta = 0b00010000;
trisa = 0b00010000; //pa输入输出 0-输出 1-输入
//pa4-in pa2-out
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00010000; //pa端口上拉控制 1-开上拉 0-关上拉
//开pa4上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
//bit7(papu)=0 enabled pull up pa
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 0:睡眠时停止工作:1: 睡眠时保持工作。当t2时钟不是选择指令时钟的时候
}
/*-------------------------------------------------
* 函数名:init_25c64_io
* 功能: 25c64初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void init_25c64_io(void)
{
cs = 1;
sck = 0;
mosi = 0;
}
/*-------------------------------------------------
* 函数名:spi_rw
* 功能: 主机输出以及输入一个字节
* 输入: data
* 输出: 根据接收的data输出给从机一个字节
--------------------------------------------------*/
unchar spi_rw(unchar data)
{
unchar i;
for(i=0;i<8;i++)
{
if(data&0x80)
mosi = 1; //输出 'uchar',msb to mosi
else
mosi = 0;
nop();
data <<= 1; //切换下一位到 msb
sck = 1; //sck置高...
nop();
if(miso)
data |= 0x01;
else
data &= 0xfe;
nop();
sck = 0;
}
return data;
}
/*-------------------------------------------------
* 函数名:writeenable
* 功能: 写允许(将wen置位)
--------------------------------------------------*/
void writeenable(void)
{
cs=0;
spi_rw(0x06);
cs=1;
}
/*-------------------------------------------------
* 函数名:writedisable
* 功能: 写禁止(将wen复位)
--------------------------------------------------*/
void writedisable (void)
{
cs=0;
spi_rw(0x04);
cs=1;
}
/*-------------------------------------------------
* 函数名: spi_readstatus
* 功能: 读取25c64芯片的状态。
* 返回值:状态寄存器数据字节
* 注: 25c64内部状态寄存器第0位=0表示空闲,0位=1表示忙。
--------------------------------------------------*/
unchar spi_readstatus(void)
{
unchar status=0;
cs=0;
spi_rw(0x05); //0x05读取状态的命令字
status = spi_rw(0x00);
cs=1; //关闭片选
return status;
}
/*-------------------------------------------------
* 程序名:spi_writestatus
* 功能: 写25c64芯片的状态寄存器。
* 只有bp1、bp0 (bit7、3、2)可以写、
* 注: 25c64内部状态寄存器第0位=0表示空闲,0位=1表示忙。
--------------------------------------------------*/
void spi_writestatus(unchar status)
{
cs=0;
spi_rw(0x01); //0x01读取状态的命令字
spi_rw(status); //写入一个字节
cs=1; //关闭片选
}
/*-------------------------------------------------
* 程序名:spi_read
* 输入: 16位的地址
* 返回: 读取的数据
* 说明: 从25c64指定的地址读取一个字节
--------------------------------------------------*/
unchar spi_read(unint addr)
{
unchar spidata;
while(spi_readstatus()&0x01); //判断是否忙
cs=0; //使能器件
spi_rw(0x03); //发送读取命令
spi_rw((unsigned char)((addr)>>8));
spi_rw((unsigned char)addr);
spidata = spi_rw(0x00); //读出数据
cs=1;
return spidata;
}
/*-------------------------------------------------
* 程序名:spi_write
* 输入: 地址,字节数据
* 说明: 将一个字节写入指定的地址
--------------------------------------------------*/
void spi_write(unint addr,unchar dat)
{
while(spi_readstatus()&0x01); //判断是否忙
writeenable(); //set wel
cs=0; //使能器件
spi_rw(0x02); //发送写命令
spi_rw((unchar)((addr)>>8));
spi_rw((unchar)addr);
spi_rw(dat);
cs=1; //关闭片选
writedisable();
while(spi_readstatus()&0x01);
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
power_initial(); //系统初始化
init_25c64_io();
spi_write(0x0013,0x55);
spireaddata = spi_read(0x0013); //读取0x13地址值
while(1)
{
nop();
}
}
timer0
// project: ft60e12x_timer0.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: demoportout输出60hz占空比50%的波形-timer0实现
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//***********************宏定义****************************
#define demoportout pa4
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器0的中断处理
if(t0ie && t0if) //8.192ms翻转一次≈60hz
{
t0if = 0;
demoportout = ~demoportout; //翻转电平
}
}
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
//pa4-out
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b01000000; //pa端口上拉控制 1-开上拉 0-关上拉
//开pa6上拉
option = 0b00000000; //bit3=0 tmr0 mode,ps=000=tmr0 rate 1:2
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 当t2时钟不是选择指令时钟的时候
// 0:睡眠时停止工作:1: 睡眠时保持工作。
}
/*----------------------------------------------------
* 函数名称:timer0_initial
* 功能:初始化设置定时器
* 相关寄存器:t0cs t0se psa
* 设置tmr0定时时长=(1/系统时钟频率)*指令周期*预分频值*255
* =(1/16000000)*2*256*255=8.192ms
----------------------------------------------------*/
void timer0_initial (void)
{
option = 0b00000111;
//bit5 t0cs timer0时钟源选择
// 1-外部引脚电平变化t0cki 0-内部时钟(fosc/2)
//bit4 t0cki引脚触发方式 1-下降沿 0-上升沿
//bit3 psa 预分频器分配位 0-timer0 1-wdt
//bit[2:0] ps 8个预分频比 111 - 1:256
t0if = 0; //清空t0软件中断
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial(); //系统初始化
timer0_initial();
gie = 1; //开中断
t0ie = 1; //开定时器/计数器0中断
while(1)
{
nop();
}
}
timer2
// project: ft60e12x_timer2.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 当demoportin悬空或者高电平时,demoportout输出5khz占空比50%的波形-tm2实现当demoportin接地时,demoportout输出高电平.关定时器
// release history
// version date description
// 1.1 24-2-21 修改文件头
//**********************************************************
#include "syscfg.h"
//***********************宏定义*****************************
#define demoportout pa4
#define demoportin pa6
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 定时器2中断处理程序
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器2的中断处理
if(tmr2ie && tmr2if) //100us中断一次 = 5khz
{
tmr2if = 0;
demoportout = ~demoportout; //翻转电平
}
}
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b01000000; //pa输入输出 0-输出 1-输入
//pa4-out ra6-in
portc = 0b00000000;
trisc = 0b11111111; //pc输入输出 0-输出 1-输入
wpua = 0b01000000; //pa端口上拉控制 1-开上拉 0-关上拉
//开pa6上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=wdt rate 1:1
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 当t2时钟不是选择指令时钟的时候
// 0:睡眠时停止工作:1: 睡眠时保持工作。
}
/*-------------------------------------------------
* 函数名称: timer2_initial
* 功能: 初始化设置定时器2
* 设置tmr2定时时长=1/系统时钟频率*2*预分频值*后分频值*pr2
* =(1/16000000)*2*4*1*200=100us
-------------------------------------------------*/
void timer2_initial (void)
{
t2con0 = 0b00000001; //t2预分频1:4,后分频1:1
//bit[6:3]: 定时器2输出后分频比 0000-1:1
//bit2: 定时器2输出是能位 0-关闭 1-使能
//bit[1:0]: 定时器2预分频比 01-1:4
t2con1 = 0b00000000; //t2时钟来自系统时钟,pwm1连续模式
//bit4: pwm单脉冲模式选择 0-连续 1-单脉冲
//bit3: pwm蜂鸣器模式选择 0-pwm模式 1:蜂鸣器模式
//bit[2:0]:timer2时钟源选择 000-指令时钟
tmr2h = 0; //tmr2赋值
tmr2l = 0;
pr2h = 0; //pr赋值
pr2l = 200;
tmr2if = 0; //清tmer2中断标志
tmr2ie = 1; //使能tmer2的中断(配置成timer定时器时不注释)
tmr2on = 1; //使能tmer2启动
peie = 1; //使能外设中断
gie = 1; //使能全局中断
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
power_initial(); //系统初始化
timer2_initial(); //初始化t2
while(1)
{
if(demoportin) //判断输入是否为高电平
{
tmr2ie = 1; //开定时器2
}
else
{
tmr2ie = 0; //关定时器2
demoportout = 1;
}
}
}
uart
// project: ft60e12x_uart.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 演示程序中波特率为9600,rxio(pa2)每次收到外部串口发过来的数据后,txio(pa4)把收到的数据再发送出去。收起始位时是用电平变化中断识别,后面就关闭电平变化中断了。
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//**********************宏定义*****************************
#define uchar unsigned char
#define txio pa4 //串口的发送脚
#define rxio pa2 //串口的接收脚
#define bord 49 //通过定时器提供波特率
uchar rxflag = 0;
uchar readapin;
/*-------------------------------------------------
* 函数名: power_initial
* 功能: mcu初始化函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial(void)
{
osccon = 0b01110001; //ircf=111=16mhz/4=4mhz,0.25us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000100; //pa输入输出 0-输出 1-输入
//pa4-out pa2-in
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
option = 0b00001000; //bit3=1 wdt mode,ps=000=1:1 wdt rate
//bit7(papu)=0 enabled pull up pa
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 当t2时钟不是选择指令时钟的时候
// 0:睡眠时停止工作:1: 睡眠时保持工作。
}
/*----------------------------------------------------
* 函数名:timer0_initial
* 功能: 初始化设置定时器
* 输入: 无
* 输出: 无
* 说明: 设置tmr0定时时长=(1/系统时钟频率)*指令周期*预分频值*208
* =(1/16000000)*4*2*208=104us
----------------------------------------------------*/
void timer0_initial (void)
{
option = 0b00000000;
//bit5: t0cs timer0时钟源选择
// 1-外部引脚电平变化t0cki 0-内部时钟(fosc/2)
//bit4: t0cki引脚触发方式 1-下降沿 0-上升沿
//bit3: psa 预分频器分配位 0-timer0 1-wdt
//bit[2:0]: ps2 8个预分频比 000 - 1:2
tmr0 = bord;
t0if = 0; //清空t0软件中断
}
/*-------------------------------------------------
* 函数名: pa2_level_change_initial
* 功能: pa端口(pa2)电平变化中断初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void pa2_level_change_initial(void)
{
trisa2 =1; //set pa2 input
readapin = porta; //清pa电平变化中断
paif =0; //清pa int中断标志位
ioca2 =1; //使能pa2电平变化中断
paie =1; //使能 pa int中断
//gie =1; //使能全局中断
}
/*-------------------------------------------------
* 函数名:interrupt isr
* 功能: 中断处理,包括定时器0中断和外部中断
* 说明: 定时器产生104us中断,对应9600的波特率 1000000÷9600=104
--------------------------------------------------*/
void interrupt isr(void)
{
//定时器0的中断处
if(t0ie && t0if) //104us
{
tmr0 = bord; //注意:对tmr0重新赋值tmr0在两个周期内不变化
t0if = 0;
t0ie = 0;
}
//pa电平变化中断
if(paie && paif)
{
readapin = porta; //读取porta数据清paif标志
paif = 0; //清paif标志位
if(rxio == 0)
{
paie = 0; //暂先禁止pa电平变化中断
ioca2 =0; //禁止pa2电平变化中断
rxflag = 1;
}
}
}
/*-------------------------------------------------
* 函数名: waittf0
* 功能: 查询定时器溢出后,在中断里关闭定时器后,再次打开定时器
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void waittf0( void )
{
while(t0ie);
t0ie=1;
}
/*-------------------------------------------------
* 函数名: wbyte
* 功能: uart发送一个字节
* 输入: input
* 输出: 无
--------------------------------------------------*/
void wbyte(uchar input)
{
//发送起始位
uchar i=8;
txio = 1;
tmr0 = bord;
t0ie = 1;
waittf0();
txio=0;
waittf0();
//发送8位数据位
while(i--)
{
if(input&0x01) //先传低位
{
txio=1;
}
else
{
txio = 0;
}
waittf0();
input=input>>1;
}
//发送结束位
txio=(bit)1;
t0ie=0;
}
/*-------------------------------------------------
* 函数名:rbyte
* 功能: uart接收一个字节
* 输入: 无
* 输出: output
--------------------------------------------------*/
uchar rbyte()
{
uchar output=0;
uchar i=8;
t0ie=1; //启动timer0
tmr0 = bord;
waittf0();
t0ie=1; //启动timer0
tmr0 = bord;
waittf0(); //等过起始位
//发送8位数据位
while(i--)
{
output >>=1;
if(rxio)
{
output |=0x80; //先收低位
}
waittf0(); //位间延时
}
t0ie=0; //停止timer0
return output;
}
/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
uchar rdata = 0;
power_initial();
timer0_initial();
pa2_level_change_initial();
gie = 1; //开中断
t0ie = 1; //开定时器/计数器0中断
while(1)
{
if(rxflag) //外部中断下降沿触发了
{
rdata = rbyte();
wbyte(rdata);
ioca2 =1; //使能pa2电平变化中断
paie =1; //使能pa int中断
rxflag = 0;
}
}
}
wdt
// project: ft60e12x_wdt.prj
// device: ft60e12x
// memory: prom=2kx14, sram=128byte, eeprom=256byte
// description: 程序中开启看门狗并将看门狗时间设置为32ms
// a. 主函数先在demoportout脚输出一个高3ms低3ms的信号,
// b. 然后循环输出高1ms低1ms,500hz的信号。
// 如果不在主程序中清看门狗,则每隔32ms单片机复位后,会重复输出a+b信号;
// 如果在主函数中清看门狗,则一直输出b信号
// release history
// version date description
// 1.1 24-2-21 修改文件头
//*********************************************************
#include "syscfg.h"
//***********************宏定义****************************
#define demoportout pa4
/*-------------------------------------------------
* 函数名:power_initial
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void power_initial (void)
{
osccon = 0b01110001; //ircf=111=16mhz/2=8mhz,0.125us
intcon = 0; //暂禁止所有中断
porta = 0b00000000;
trisa = 0b00000000; //pa输入输出 0-输出 1-输入
//pa4-out
portc = 0b00000000;
trisc = 0b00000000; //pc输入输出 0-输出 1-输入
wpua = 0b00000000; //pa端口上拉控制 1-开上拉 0-关上拉
option = 0b00001000; //bit3=1,wdt mode,ps=000=wdt rate 1:1
psrca = 0b11111111; //源电流设置最大
psrcc = 0b11111111;
psinka = 0b11111111; //灌电流设置最大
psinkc = 0b11111111;
mscon = 0b00110000;
//bit5: psrcah4和psrca[4]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit4: psrcah3和psrca[3]共同决定源电流。00:4ma; 11: 33ma; 01、10:8ma
//bit3: ucfg1<1:0>为01时此位有意义。0:禁止lvr;1:打开lvr
//bit2: 快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//bit1: 0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//bit0: 当t2时钟不是选择指令时钟的时候
// 0:睡眠时停止工作:1: 睡眠时保持工作。
}
/*-------------------------------------------------
* 函数名称:delayus
* 功能: 短延时函数--16m-2t--大概快1%左右.
* 输入参数:time 延时时间长度 延时时长time us
* 返回参数:无
--------------------------------------------------*/
void delayus(unsigned char time)
{
unsigned char a;
for(a=0;a<time;a++)
{
nop();
}
}
/*-------------------------------------------------
* 函数名称:delayms
* 功能: 短延时函数
* 输入参数:time 延时时间长度 延时时长time ms
* 返回参数:无
--------------------------------------------------*/
void delayms(unsigned char time)
{
unsigned char a,b;
for(a=0;a<time;a++)
{
for(b=0;b<5;b++)
{
delayus(197); //快1%
}
}
}
/*-------------------------------------------------
* 函数名称:wdt_initial
* 功能: 初始化设置看门狗1s时间复位
* 设置定时时长=(1/32000)*16位预分频值*8位预分频值
=(1/32000)*1024*1=32ms
-------------------------------------------------*/
void wdt_initial (void)
{
clrwdt(); //清看门狗
psa=0; //时钟分频分给wdt
wdtcon = 0b00001011; //wdtps:0101-1:1024,ps:000-1:1
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
power_initial(); //系统初始化
wdt_initial();
demoportout = 1;
delayms(3); //3ms
demoportout = 0;
delayms(3); //3ms
while(1)
{
//clrwdt(); //清看门狗
demoportout = 1;
delayms(1); //1ms
demoportout = 0;
delayms(1); //1ms
}
}
发表评论