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

📄 testboard1.c

📁 PIC MCU开发用的一个小工具,用于对某些外设芯片子程序的调试,有2个按键2x20的字符LCD,3个I/O,1个UART,非常好用,包含SCHPCB 以及初始化C代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************
字符LCD命令写入函数writ_com
  作用:向LCD写入命令字节;
  入口:待传送的8位数据;
  出口:无;
  说明:一个字节的命令
*******************************************
	void writ_com(unsigned char command)
	{
	 dis_rs=0;
	 ttl74164(command);
	 dis_en=1;
	 dis_en=0;
	 d256uS();
	}
/******************************************
字符LCD命令写入函数writ_com
  作用:向LCD写入命令字节;
  入口:待传送的8位数据;
  出口:无;
  说明:一个字节的命令
*******************************************
	void writ_data(unsigned char data)
	{
	 dis_rs=1;
	 ttl74164(data);
	 dis_en=1;
	 dis_en=0;
	 d256uS();	 
	}
/******************************************
字符LCD初始化函数lcd_init
  作用:软件上电初始化
  入口:无
  出口:无
******************************************
	void lcd_init(void)
	{
	 d10mS();d10mS();d10mS();d10mS();
	 writ_com(0x30);
	 d4mS();
	 dis_en=1;dis_en=0;d256uS();
	 dis_en=1;dis_en=0;d256uS();
	 writ_com(0x38);writ_com(0x01);
	 d4mS();
	 writ_com(0x06); writ_com(0x0c);
	}
/******************************************
存储数据转换为显示数据disp_prodata()
  作用:将十六进制转成ASCII码
  入口:被转换数据
  出口:转换后的数据
******************************************
	unsigned char data_tab(unsigned char data)
	{
	 unsigned char temp;
	 data&=0x0f;
	 switch(data)
		{
		 case 0: temp='0';break;
		 case 1: temp='1';break;
		 case 2: temp='2';break;
		 case 3: temp='3';break;
		 case 4: temp='4';break;
		 case 5: temp='5';break;
		 case 6: temp='6';break;
		 case 7: temp='7';break;
		 case 8: temp='8';break;
		 case 9: temp='9';break;
		 case 10: temp='A';break;
		 case 11: temp='B';break;
		 case 12:	temp='C';break;
		 case 13: temp='D';break;
		 case 14:	temp='E';break;
		 case 15: temp='F';break;
		}
	 return(temp);
	}
/******************************************
显示刷新函数disp_one_row
  作用:将数据送入到LCD中
  入口:datapt->数据缓冲区首地址
		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(RA2)
			{
			 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");
	}
/******************************************
主循环程序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);	 
	 waitfree();
	 asm("movf _PORTA,w");RAIF=0;RAIE=0;IOCA1=1;
	 GIE=1;INTE=1;
	 while(1)
		{
		 ;
/*
		 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;
			}
*/
		}
	}

//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)
		{
		 RA0=0;
//************t1控制
		 TMR1IE=0;TMR1ON=0;TMR1IF=0;	//停止1
		 TMR1L=0x65;TMR1H=0xf0;			//T1初值
		 softpsw|=0x01;			//树数据读取标志
//************读取数据
		 d1mS();				//延时准备读数
		 shiftdata();			//调整数据队列
		 if(RA2)
			{discpsw0|=0x01;}
		 else
			{discpsw0&=0xfe;}
//************准备下一位
		 while(RA2);
		 TMR1ON=1;	//运行T1
		 TMR1IE=1;
//************复位INT中断
		 INTF=0;
		}

	 if(RAIE&&RAIF)
		{
		 unsigned char temp; 
		 if(RA0)
				{
				 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);softpsw&=0xfd;RA0=0;break;
					 default: ;
					}
				}
/*		 if(RA2)
			{
			 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;RAIE=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;}				
			}
		 else if(discpsw5==0x9b)
			{nowdisc=discpsw4&0x0f;} 
		 dataclear();RA0=1;
		 asm("movf _PORTA,w");RAIF=0;RAIE=1;
		}
	}

⌨️ 快捷键说明

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