testboard_rec.c

来自「PIC MCU开发用的一个小工具,用于对某些外设芯片子程序的调试,有2个按键2x」· C语言 代码 · 共 684 行 · 第 1/2 页

C
684
字号
		cnt---->数据个数(不大于20,超出部分不显示)
		row---->选择上下行(0上行显示,1下行显示)
  出口:无
******************************************/
	void disp_one_row(unsigned char *datapt,unsigned char cnt,unsigned char row)
	{
	 unsigned char count;
	 if(row==0)
	 	{writ_com(0x80);}	//第一行显示地址设置
	 else
		{writ_com(0xc0);}	//第二行显示地址设置
	//防止数据溢出
	 if(cnt>=20)	
		{cnt=20;count=0;}
	 else
		{count=20-cnt;}
	 for(;cnt>0;cnt--)
		{
		 writ_data(*datapt);
		 datapt++;
		}
	 for(;count>0;count--)
		{writ_data(' ');}
	 writ_com(0x0c);		//开显示
	}
/******************************************
显示刷新函数disp_welcome
  作用:显示起画面
  入口:无
  出口:无
******************************************/
	void disp_loge(const unsigned char *pt,unsigned char cnt,unsigned char par)
	{
	 if(par==0)
		{writ_com(0x80);}
	 else
		{writ_com(0xc0);}
	 for(;cnt>0;cnt--)
		{writ_data(*pt);pt++;}
	 writ_com(0x0c);
	}
/******************************************
向指定位置写数据
  作用:想指定位置写数
  入口:写入数据data,写入位置addr(0~39)
  出口:无
******************************************/
	void disp_onedata(unsigned char data,unsigned char addr)
	{
	 if(addr>19)
		{addr-=20;addr+=0xc0;}
	 else
		{;addr+=0x80;}
	 writ_com(addr);
	 writ_data(data);
	}
/************************************************************
总线空闲等待函数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
			}
		}
	}
/************************************************************
延时函数d1mS()
  作用:延时1mS
************************************************************/
	void d1mS(void)
	{
	 unsigned char cnt;
	 for(cnt=123;cnt>0;cnt--);
	 asm("nop");asm("nop");
	}
/************************************************************
延时函数d7uS()
  作用:延时7uS
************************************************************/
	void d7uS(void)
	{
	 asm("nop");
	 asm("nop");
	}
/************************************************************
延时函数d17uS()
  作用:延时17uS
************************************************************/
	void d17uS(void)
	{
	 asm("goto $+1");asm("goto $+1");
	 asm("goto $+1");asm("goto $+1");
	 asm("goto $+1");asm("goto $+1");
	}
/************************************************************
延时函数d100uS()
  作用:延时100uS
************************************************************/
	void d100uS(void)
	{
	 unsigned char cnt;
	 for(cnt=11;cnt>0;cnt--);
	}
/******************************************
主循环程序main()
入口:无
出口:无
*******************************************/
	main()
	{
//	 unsigned char count;
	 sfr_setup();
/*	 buzz=1;
	 lcd_init();
	 disp_loge(welcome_words,20,0);
	 disp_loge(type_words,20,1);
	 d10mS();
	 buzz=0;
	 for(count=255;count>0;count--)
		{d10mS();}
	 writ_com(0x01);
	 d4mS();
	 disp_loge(playpar,12,0);
	 disp_loge(playstate,13,1);	 
*/
	 TRISC5=1;
	 waitfree();
	 asm("movf _PORTA,w");RAIF=0;RAIE=1;IOCA1=1;
	 GIE=1;
	 while(1)
		{	
			d4mS();
/*		 if(softpsw&0x02)
			{
			 disp_onedata(data_tab(nowdisc),3);
			 disp_onedata(data_tab(nowminH),9);
			 writ_data(data_tab(nowminL));
			 disp_onedata(data_tab(nowsecH),12);
			 writ_data(data_tab(nowsecL));
			 disp_onedata(data_tab(nowtrackH),17);
			 writ_data(data_tab(nowtrackL));
			 if(playpsw&0x01)
				{disp_onedata('S',36);writ_data('c');writ_data('a');writ_data('n');}
			 else
				{disp_onedata(' ',36);writ_data(' ');writ_data(' ');writ_data(' ');}
			 if(playpsw&0x08)
				{disp_onedata('R',36);writ_data('e');writ_data('p');
				 writ_data('A');}
			 else if(playpsw&0x04)
				{disp_onedata('R',36);writ_data('e');writ_data('p');
				 writ_data('1');}
			 softpsw&=0xfd;
			}
*/
		}
	}




/*********************************************************************************

								双机通讯管理

*********************************************************************************/

/************************************************************
数据发送函数data_send()
  作用:发送1字节数据
  入口:待发送的数据
  出口:无
************************************************************/
	void data_send(unsigned char data)
	{
	 unsigned char cnt;	 
	 GIE=0;				//关闭总中断
	 SCB=0;				
	 SCB_T=0;		//获得总线控制权
	 d100uS();		//起始信号(低电平1mS)
	 for(cnt=8;cnt>0;cnt--)
		{
		 SCB=1;				//同步头信号
		 d7uS();
		 if(data&0x80)
			SCB=1;			//输出数据1
		 else
			SCB=0;			//输出数据0
		 d17uS();data<<=1;
		 SCB=0;				//位结束信号
		 d7uS();
		}
	 SCB=1;
	 SCB_T=1;		//放弃总线控制权
	 INTF=0;
	 GIE=1;				//开总中断
	}
/************************************************************
数据接收函数data_rec()
  作用:接收1字节数据
  入口:待发送的数据
  出口:接收到的一字节数据
************************************************************/
	unsigned char data_rec(void)
	{
	 unsigned char cnt,temp;
	 temp=0;
	 SCB_T=1;
	 for(cnt=8;cnt>0;cnt--)
		{
		 while(SCB);		//等待低电平
		 while(!SCB);		//等待同步信号头
		 temp<<=1;
		 d17uS();			//延时到数据区
		 if(SCB)			//读取数据
			temp|=0x01;
		 else
			temp&=0xfe;
		}
	 return(temp);
	}
//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(INTE&&INTF)
		{
		 unsigned char temp;
		 temp=data_rec();
		 switch(temp)
			{
			 case 0xf0:		//数位1
				data_send(nowdisc);break;
			 case 0xf1:		//数位2
				data_send(nowtrackH);break;
			 case 0xf2:		//数位3
				data_send(nowtrackL);break;
			 case 0xf3:		//数位4
				data_send(nowminH);break;
			 case 0xf4:		//数位5
				data_send(nowminL);break;
			 case 0xf5:		//数位6
				data_send(nowsecH);break;
			 case 0xf6:		//数位7
				data_send(nowsecL);INTE=0;break;
			 default: ;
			}
//************复位INT中断
		 INTF=0;ready=0;
		}

	 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
			 playpsw&=0xf3;
			 playpsw|=discpsw2&0x0c;	//REP状态
			 if(discpsw1&0x80)			//SCAN状态
				{playpsw|=0x01;}
			 else
				{playpsw&=0xfe;}
			 ready=1;INTE=1;				
			}
		 else if(discpsw5==0x9b)
			{nowdisc=discpsw4&0x0f;ready=1;INTE=1;} 
		 dataclear();//waitfree();
		 asm("movf _PORTA,w");RAIF=0;
		}
	}

⌨️ 快捷键说明

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