文章分类

当前位置:首页>技术文章>PIC16F877的外围功能模块

PIC16F877的外围功能模块

1. 简单应用实例该例用于令与 PORTD 口相连的 8 个发光二极管前 4 个点亮,后 4 个熄灭。在调试程序前,应使与 PORTD 口相连的 8 位拔码开关拔向相应的位置。例 5.1 PORTD 输出#includemain(){TRISD=0X00; /*TRISD 寄存器被赋值,PORTD 每一位都为输出*/while(1); /*循环执行点亮发光二极管的语句*/{PORTD=0XF0; /*向 PORTD 送数据,点亮 LED(由实验模板*//*的设计决定相应位置低时 LED 点亮)。*/}}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 引脚为输出*/}程序清单下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。#include/*该程序用于在 8 个 LED 上依次显示 1~8 等 8 个字符*/static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};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; /*通过数组的转换获得待显示的段码*/SPILED(data); /*发送显示段码显示*/}PORTA_5=1; /*最后给锁存信号,代表显示任务完成*/}程序清单下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。有关显示部分的 SPI 初始化,请读者参考 5.2 节。#include/*该程序用于按下相应的键时,在第一个 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 bit PORTB_4 @ PORTBIT(PORTB,4);static bit PORTB_1 @ PORTBIT(PORTB,1);static bit PORTB_2 @ PORTBIT(PORTB,2);unsigned int I;unsigned char j;int data;/*spi 初始化子程序*/void SPIINIT(){PIR1=0;SSPCON=0x30;SSPSTAT=0xC0;TRISC=0xD7; /*SDO 引脚为输出,SCK 引脚为输出*/}/*系统各输入输出口初始化子程序*/void initial(){TRISA=0xDF;TRISB=0XF0; /*设置与键盘有关的各口的数据方向*/INTCON=0x00; /*关闭所有中断*/data=0X00; /*待显示的寄存器赋初值*/PORTB=0X00; /*RB1 RB2 先送低电平*/j=0;}/*软件延时子程序*/void DELAY(){for(i = 6553; --i;)continue;}/*键扫描子程序*/int KEYSCAN(){while(1){if ((PORTB_5==0)||(PORTB_4==0))break;} /*等待有键按下*/DELAY(); /*软件延时*/if ((PORTB_5==0)||(PORTB_4==0))KEYSERVE(); /*如果仍有键按下,则调用键服务子程序*/else j=0x00; /*如果为干扰,则令返回值为 0*/return(j);}/*键服务子程序*/int KEYSERVE(){PORTB=0XFD;if(PORTB_5==0) j=0X01;if(PORTB_4==0) j=0X03;PORTB=0XFB;if(PORTB_5==0) j=0X02;if(PORTB_4==0) j=0X04;/*以上根据按下的键确定相应的键值*/PORTB=0X00; /*恢复 PORTB 的值*/while(1){if((PORTB_5==1)&&(PORTB_4==1)) break;/*等待键盘松开*/}return(j);}/*SPI 发送子程序*/void SPILED(int data){SSPBUF=data; /*启动发送*/do{;}while(SSPIF==0); /*等待发送完毕 SSPIF=0;}/*主程序*/main(){static int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};initial();/*系统初始化*/SPIINIT();/*SPI 初始化*/while(1){KEYSCAN();if(j!=0) /*如果 j=0,证明先前的按键为干扰,则不予显示*/{data=table[j];PORTA_5=0; /*LACK 信号清 0,为锁存做准备*/SPILED(data);PORTA_5=1; /*最后给锁存信号,代表显示任务完成*/}}}


© 星光电子技术工作室 2021 All Rights Reserved.
如有任何问题、建议、业务、合作,请联系手机/微信:13713820066