PIC16F877的外围功能示例代码

@PIC16F877的外围功能示例代码

第5章 PIC16F877的外围功能模块
5.1.2 简单应用实例
该例用于令与PORTD口相连的8个发光二极管前4个点亮,后4个熄灭。在调试程序前,应使与PORTD口相连的8位拔码开关拔向相应的位置。
例5.1 PORTD输出

	#include	<pic.h>
main()
{
   
	TRISD=0X00/*TRISD寄存器被赋值,PORTD每一位都为输出*/
while(1)/*循环执行点亮发光二极管的语句*/
	{
   
		PORTD=0XF0/*向PORTD送数据,点亮LED(由实验模板*/
/*的设计决定相应位置低时LED点亮)。*/
}
}

5.2.1 MSSP模块SPI方式功能简介
下面是一段简单的SPI初始化例程,用于利用SPI工作方式输出数据的场合。
例5.2 SPI初始化程序

/*spi初始化子程序*/
void 	SPIINIT()
{
   
	PIR1=0/*清除SPI中断标志*/		
	SSPCON=0x30/* SSPEN=1;CKP=0 , FOSC/4 */
	SSPSTAT=0xC0;
	TRISC=0x00/*SDO引脚为输出,SCK引脚为输出*/
}

5.2.3 程序清单
下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。

#include		<pic1687x.h>
/*该程序用于在8个LED上依次显示1~8等8个字符*/
static volatile int table[20]={
   0xc00xf90xa40xb00x990x920x820XD80x800x900x880x830xc60xa10x860x8e0x7f0xbf0x890xff}volatile 	unsigned 	char 	data; 
#define 	PORTAIT(adr,bit)  ((unsigned)(&adr)*8+(bit))	/*绝对寻址位操作指令*/
static	bit PORTA_5 @ PORTAIT(PORTA,5)/*spi初始化子程序*/
void		SPIINIT()
{
   
	PIR1=0;		
	SSPCON=0x30/* SSPEN=1;CKP=0 , FOSC/4 */
	SSPSTAT=0xC0;
	TRISC=0x00/*SDO引脚为输出,SCK引脚为输出*/
}
/*系统各输入输出口初始化子程序*/
void		initial()
{
   
TRISA=0x00/*A口设置为输出*/
	INTCON=0x00/*关闭所有中断*/
	PORTA_5=0/*LACK送低电平,为锁存做准备*/
}
/*SPI发送子程序*/
void 		SPILED(int data)
{
   
	SSPBUF=data;			/*启动发送*/
	do
	{
   }while(SSPIF==0)/*等待发送完毕*/
SSPIF=0/*清除SSPIF标志*/
}
/*主程序*/
main()
{
   
	unsigned	I;
	initial()/*系统初始化*/
	SPIINIT()/*SPI初始化*/	
 	for(i=8;i>0;i--)			/*连续发送8个数据*/
  	{
   
		data=table[i]/*通过数组的转换获得待显示的段码*/	
		SPILED(data)/*发送显示段码显示*/		
  	}
	PORTA_5=1/*最后给锁存信号,代表显示任务完成*/
}

5.3.3 程序清单
下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。有关显示部分的SPI初始化,请读者参考5.2节。

#include		<pic.h>
/*该程序用于按下相应的键时,在第一个8段LED上显示相应的1~4的字符*/
#define 	PORTAIT(adr,bit)  ((unsigned)(&adr)*8+(bit))	/*绝对寻址位操作指令*/
static	 bit  PORTA_5  @  PORTAIT(PORTA,5)#define	PORTBIT(adr, bit)	((unsigned)(&adr)*8+(bit))	 /*绝对寻址位操作指令*/
static	 bit  PORTB_5  @  PORTBIT(PORTB,5)static 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值