当前位置: 代码网 > 科技>人工智能 > 辉芒微单片机学习参考

辉芒微单片机学习参考

2024年08月02日 人工智能 我要评论
芯片:FT60E12X FT60F12X。

芯片:ft60e12x ft60f12x

芯片规格书以及参考demo

数据手册
应用笔记
示例代码

硬件准备

一块带ft60e12x的板子 以及对应的原理图

环境搭建ide

从github上找到的

跑通一个简单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
	}
}

参考

辉芒微电子
辉芒微(fmd)单片机开发环境搭建
立创商城
立创eda

c语言入门基础知识【完整版】

代码中字符串乱码恢复

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com