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

📄 复件 testboard.c

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

/**************端口定义**************
************************************/
	#define	port0		RA0		//用户IO端口0
	#define	port1		RA1		//用户IO端口1
	#define	port2		RA2		//用户IO端口2
	#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		0X38
/*	TRISA
		5	4	3	2	1	0
		I	I	I	O	O	O
		|	|	|	|	|	|->用户端口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		0X30	//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		0X00
/*	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
//关闭比较器功能

/***************常数定义*************
************************************/
	const unsigned char welcome_words[]="PICMCU software test";
	const unsigned char type_words[]="     Ver 1.0  051210";
/******************************************
特殊寄存器设置函数;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;
	}
/******************************************
LCD操作延时函数d256us();
  作用:延时256uS;
  入口:无;
  出口:无;
  说明:用于LCD的操作延时
*******************************************/
	void d256uS(void)
	{
	 unsigned char i;
	 for(i=83;i>0;i--);
	}
/******************************************
延时函数d4ms();
  作用:延时4ms
  入口:无
  出口:无
  说明:用于LCD初始化
******************************************/
	void d4mS(void)
	{
	 unsigned int i;
	 for(i=443;i>0;i--);
	}
/******************************************
延时函数d10ms();
  作用:延时10ms
  入口:无
  出口:无
******************************************/
	void d10mS(void)
	{
	 unsigned int i;
	 for(i=909;i>0;i--);
	}
/******************************************
串行移位寄存器操作函数ttl14164()
  作用:传送8BIT数据到74hc164中
  入口:待传送的8位数据;
  出口:无;
  说明:字节传送顺序为MSB->LSB
*******************************************/
	void ttl74164(unsigned char data)
	{
	 unsigned char temp,cnt;
	 temp=data;
	 for(cnt=8;cnt>0;cnt--)
		{
		 if(temp&0x80)
	 	 	dis_data=1;
		 else
			dis_data=0;
	 	 temp=temp<<1;
	 	 dis_clk=0;
	 	 dis_clk=1;
     	}
	 dis_data=0;
	}

/******************************************
字符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_welcome(void)
	{
	 const unsigned char *pt;
	 unsigned char cnt;
	 writ_com(0x80);
	 pt=welcome_words;
	 for(cnt=20;cnt>0;cnt--)
		{writ_data(*pt);pt++;}
	 writ_com(0xc0);
	 pt=type_words;
	 for(cnt=20;cnt>0;cnt--)
		{writ_data(*pt);pt++;}
	 writ_com(0x0c);		//开显示
	}
/******************************************
主循环程序main()
入口:无
出口:无
*******************************************/
	main()
	{
	 unsigned char count;
	 sfr_setup();
	 buzz=1;
	 lcd_init();
	 disp_welcome();
	 d10mS();
	 buzz=0;
	 for(count=255;count>0;count--)
		{d10mS();}
	 writ_com(0x01);
	 while(1)
		{
	 	 
		}
	}
/******************************************
中断处理函数inthandle()
  作用:
  入口:无;
  出口:无;
*******************************************/
	void interrupt inthandle(void)
	{
	}

⌨️ 快捷键说明

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