⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testboard.c

📁 PIC MCU开发用的一个小工具,用于对某些外设芯片子程序的调试,有2个按键2x20的字符LCD,3个I/O,1个UART,非常好用,包含SCHPCB 以及初始化C代码.
💻 C
字号:
	#include <pic.h>
	#include <pic16630.h>

/**************端口定义**************
************************************/
	#define	cdc_clk		RA0		//用户IO端口0
	#define	cdc_clk_T	TRISA0		
	#define	port1		RA1		//用户IO端口1
	#define	cdc_dat		RA2		//用户IO端口2
	#define	cdc_dat_T	TRISA2
	#define	port3		RA3		//用户输入端口
	#define	incsel		RA4		//按键DEC
	#define	decent		RA5		//按键INC
	#define	dis_clk		RC0		//显示数据输出时钟
	#define	dis_data	RC1		//显示数据输出端口
	#define	dis_rs		RC2		//显示命令/数据选择
	#define	dis_en		RC3		//显示使能控制
	#define	txd			RC4		//URAT发送端
	#define	rxd			RC5		//URAT接收端
	#define buzz		RC5		//蜂鸣器

/********特殊寄存器初始化参数********
************************************/
	#define	TRISA_CODE		0X3f
/*	TRISA
		5	4	3	2	1	0
		I	I	I	I	I	I
		|	|	|	|	|	|->用户端口0
		|	|	|	|	|----->用户端口1
		|	|	|	|--------->用户端口2
		|	|	|------------->用户输入端口2
		|	|----------------->按键输入1
		|--------------------->按键输入2
*/
	#define	IOCA_CODE		0X00
	#define	TRISC_CODE		0X00
/*	TRISC
		5	4	3	2	1	0
		O	O	0	0	0	0
		|	|	|	|	|	|->显示时钟输出
		|	|	|	|	|----->显示数据输出
		|	|	|	|--------->命令/数字选择
		|	|	|------------->LCD EN使能
		|	|----------------->TXD
		|--------------------->BUZZ(RXD)
*/
	#define	WPUA_CODE		0X35	//A口弱上拉
	#define	ANSEL_CODE		0X00	//A/D模拟/数字端口选择
/*	ANSEL
		7	6	5	4	3	2	1	0
		|	|	|	|	|	|	|	|->RA0
		|	|	|	|	|	|	|----->RA1
		|	|	|	|	|	|--------->RA2
		|	|	|	|	|------------->RA4
		|	|	|	|----------------->RC0
		|	|	|--------------------->RC1
		|	|------------------------->RC2
		|----------------------------->RC3
*/
	#define	OPTION_CODE		0X07
/*	OPTION
		7	6	5	4	3	2	1	0
		|	|	|	|	|	|	|	|->\
		|	|	|	|	|	|	|------->T0前分频选择
		|	|	|	|	|	|--------->/
		|	|	|	|	|------------->预分频使用选择(为0时T0使用)
		|	|	|	|----------------->T0记数边沿选择(0为上边沿触发)
		|	|	|--------------------->T0计数来源选择(为1RA2输入)
		|	|------------------------->INT中断边沿选择(0为下降沿触发)
		|----------------------------->A口弱上拉控制(为0打开)
*/
	#define PIE1_CODE		0x00
/*	PIE1
		7	6	5	4	3	2	1	0
		|	|	|	|	|	|	|	|->TMR1IE定时器1中断控制
		|	|	|	|	|	|	|----->
		|	|	|	|	|	|--------->
		|	|	|	|	|------------->CMIE比较器中断控制
		|	|	|	|----------------->
		|	|	|--------------------->
		|	|------------------------->ADIE模数变换中断控制
		|----------------------------->EEIE内部EEROM中断控制
*/
	#define ADCON1_CODE		0x00
//AD变换工作时钟选择,选择标准以转换时间>1.6uS为准,基准时钟是主振荡频率
	#define VRCON_CODE		0x00
//比较器控制
	#define	PORTA_CODE		0X00		
	#define	PORTC_CODE		0X00
	#define	INTCON_CODE		0X40
/*	INTCON
		7	6	5	4	3	2	1	0
		|	|	|	|	|	|	|	|->A口中断标志
		|	|	|	|	|	|	|----->INT中断标志
		|	|	|	|	|	|--------->T0中断标志
		|	|	|	|	|------------->A口变化中断允许
		|	|	|	|----------------->INT中断允许
		|	|	|--------------------->T0中断允许
		|	|------------------------->外部中断总控制
		|----------------------------->中断总控制
*/
	#define T1CON_CODE		0X00
/*	T1CON
7	6	5	4	3	2	1	0
|	|	|	|	|	|	|	|->
|	|	|	|	|	|	|----->T1外部计数门控位(0开计数,1外部控制为0时计数)
|	|	|	|	|	|--------->\
|	|	|	|	|--------------->前分频选择
|	|	|	|----------------->LP外部时钟选择(1使能外部时钟)
|	|	|--------------------->外部时钟同步选择(0同步输入)
|	|------------------------->时钟来源选择(0为内部时钟,1为RA5输入)
|----------------------------->计数控制位(1开始计数)
*/
	#define ADCON0_CODE		0x00
/*	ADCON0
7	6	5	4	3	2	1	0
|	|	|	|	|	|	|	|->数据格式选择(为0数据靠高端)
|	|	|	|	|	|	|----->基准电压选择(为1由RA1提供)
|	|	|	|	|	|--------->
|	|	|	|	|------------->\
|	|	|	|------------------->通道选择
|	|	|--------------------->/
|	|------------------------->AD变换启动位(为1启动,硬件清零)
|----------------------------->AD模块电源控制(为1开启)
*/
	#define	CMCON_CODE		0X07
//关闭比较器功能

/***************变量定义*************
************************************/
	static volatile unsigned char discpsw0;	//碟机状态
	static volatile unsigned char discpsw1;
	static volatile unsigned char discpsw2;
	static volatile unsigned char discpsw3;
	static volatile unsigned char discpsw4;
	static volatile unsigned char discpsw5;
	static volatile unsigned char discpsw6;
	static volatile unsigned char discpsw7;
	static volatile unsigned char softpsw;
/*	softpsw
7	6	5	4	3	2	1	0
|	|	|	|	|	|	|	|->数据读取标志(为1正在读取)
|	|	|	|	|	|	|----->数据准备好标志(为1准备好)
|	|	|	|	|	|--------->显示标志
|	|	|	|	|------------->
|	|	|	|----------------->
|	|	|--------------------->
|	|------------------------->
|----------------------------->
*/
	static volatile unsigned char nowdisc;
	static volatile unsigned char nowtrackH;
	static volatile unsigned char nowtrackL;
	static volatile unsigned char nowminH;
	static volatile unsigned char nowminL;
	static volatile unsigned char nowsecH;
	static volatile unsigned char nowsecL;
/******************************************
特殊寄存器设置函数;sfr_setup
  作用:初始化内部特殊寄存器;
  入口:无;
  出口:无;
*******************************************/
	void sfr_setup(void)
	{
//BANK1
	TRISA=TRISA_CODE;
	TRISC=TRISC_CODE;
	OPTION=OPTION_CODE;
	PIE1=PIE1_CODE;
	ANSEL=ANSEL_CODE;
	ADCON1=ADCON1_CODE;
	IOCA=IOCA_CODE;
	WPUA=WPUA_CODE;
//BANK0
	PORTA=PORTA_CODE;		
	PORTC=PORTC_CODE;
	INTCON=INTCON_CODE;
	T1CON=T1CON_CODE;
	ADCON0=ADCON0_CODE;
	CMCON=CMCON_CODE;
	}
/************************************************************
总线空闲等待函数waitfree()
  作用:等待总线空闲
  入口:无
  出口:无
************************************************************/
	void waitfree(void)
	{
	 TMR1ON=0;
	 TMR1IF=0;
	 TMR1L=0x65;
	 TMR1H=0xf0;
	 TMR1ON=1;	//运行T1
	 while(!TMR1IF)
		{
		 if(RA1)
			{
			 TMR1L=0x65;
			 TMR1H=0xf0;
			 TMR1ON=1;	//运行T1
			}
		}
	}
/************************************************************
延时函数D7uS()
  作用:延时7uS
************************************************************/
	void D7uS(void)
	{
	 asm("nop");
	 asm("nop");
	}
/************************************************************
总线空闲等待函数send_cdcdata()
  作用:等待总线空闲
  入口:无
  出口:无
************************************************************/
	void send_cdcdata(void)
	{
 	 unsigned char buffer[4];
	 unsigned char cnt1,cnt2,temp;
	 if(softpsw&0x02)
		{
		 buffer[0]=(nowtrackH<<4)|nowtrackL;
		 buffer[1]=(nowminH<<4)|nowminL;
		 buffer[2]=(nowsecH<<4)|nowsecL;
		 buffer[3]=nowdisc;
		//发送数据
		 cdc_dat=0;
		 cdc_dat_T=0;	//发送握手信号
		 while(cdc_clk);
		 GIE=0;
		 while(!cdc_clk);
		 cdc_clk=1;
		 cdc_clk_T=0;	//时钟为高
		 for(cnt1=0;cnt1<4;cnt1++)
			{
			 temp=buffer[cnt1];
			 for(cnt2=8;cnt2>0;cnt2--)
				{
				 D7uS();D7uS();D7uS();
				 if(temp&0x80)
					{cdc_dat=1;}
				 else
					{cdc_dat=0;}
				 cdc_clk=0;
				 D7uS();
				 temp<<=1;
				 cdc_clk=1;
				}
			}
		 cdc_dat_T=1;cdc_clk_T=1;softpsw&=0xFD;
		 waitfree();asm("movf _PORTA,w");RAIF=0;
		 GIE=1;
		}
	}
/******************************************
主循环程序main()
入口:无
出口:无
*******************************************/
	main()
	{
	 unsigned char count;
	 sfr_setup();
	 waitfree();
	 asm("movf _PORTA,w");RAIF=0;RAIE=1;IOCA1=1;
	 GIE=1;
	 while(1)
		{
		 send_cdcdata();
		}
	}
/************************************************************
延时函数d7uS()
  作用:延时7uS
************************************************************/
	void d7uS(void)
	{
	 asm("nop");
	 asm("nop");
	}
//CDC状态数据移位
	void shiftdata(void)
	{
	 unsigned char temp;
	 temp=STATUS;
	 #asm
	 	bcf 	_STATUS,6
		bsf		_STATUS,5
		rlf 	_discpsw0,f
		rlf 	_discpsw1,f
		rlf 	_discpsw2,f
		rlf 	_discpsw3,f
		rlf 	_discpsw4,f
		rlf 	_discpsw5,f
		rlf 	_discpsw6,f
		rlf 	_discpsw7,f
	 #endasm
	 STATUS=temp;
	}
//数据清除
	void dataclear(void)
	{
	 discpsw0=0;discpsw1=0;discpsw2=0;
	 discpsw3=0;discpsw4=0;discpsw5=0;
	 discpsw6=0;discpsw7=0;
	}
/******************************************
中断处理函数inthandle()
  作用:
  入口:无;
  出口:无;
*******************************************/
	void interrupt inthandle(void)
	{
	 if(RAIE&&RAIF)
		{
		 if(RA1)
			{
			 TMR1IE=0;TMR1ON=0;TMR1IF=0;	//停止1
			 TMR1L=0;TMR1H=0;			//T1初值
			 TMR1ON=1;	//运行T1
			}
		 else
			{
			 TMR1ON=0;
			 shiftdata();			//调整数据队列
			 if(TMR1H<0x04)
				{discpsw0&=0xfe;}
			 else
				{discpsw0|=0x01;}
	 		 TMR1IF=0;TMR1L=0x65;TMR1H=0xf0;			//T1初值
			 TMR1ON=1;TMR1IE=1;	//运行T1		 
			}
		 asm("movf _PORTA,w");RAIF=0;
		}
	 if(TMR1IE&&TMR1IF)
		{
		 TMR1IE=0;TMR1ON=0;TMR1IF=0;	//停止1
		 softpsw&=0xFE;			//关数据读取标志
		 if(discpsw7==0x99)
			{
			 nowtrackH=discpsw6&0x0f;
			 nowtrackL=discpsw5>>4;	//Track
			 nowminH=discpsw4&0x0f;	
			 nowminL=discpsw3>>4;	//Min
			 nowsecH=discpsw3&0x0f;
			 nowsecL=discpsw2>>4;	//sec
			 softpsw|=0x02;				
			}
		 else if(discpsw5==0x9b)
			{nowdisc=discpsw4&0x0f;softpsw|=0x02;} 
		 dataclear();
		 asm("movf _PORTA,w");RAIF=0;
		}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -