您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第5章PIC16F877的外围功能模块
88第5章PIC16F877的外围功能模块5.1.2简单应用实例该例用于令与PORTD口相连的8个发光二极管前4个点亮,后4个熄灭。在调试程序前,应使与PORTD口相连的8位拔码开关拔向相应的位置。例5.1PORTD输出#includepic.hmain(){TRISD=0X00;/*TRISD寄存器被赋值,PORTD每一位都为输出*/while(1);/*循环执行点亮发光二极管的语句*/{PORTD=0XF0;/*向PORTD送数据,点亮LED(由实验模板*//*的设计决定相应位置低时LED点亮)。*/}}5.2.1MSSP模块SPI方式功能简介下面是一段简单的SPI初始化例程,用于利用SPI工作方式输出数据的场合。例5.2SPI初始化程序/*spi初始化子程序*/voidSPIINIT(){PIR1=0;/*清除SPI中断标志*/SSPCON=0x30;/*SSPEN=1;CKP=0,FOSC/4*/SSPSTAT=0xC0;TRISC=0x00;/*SDO引脚为输出,SCK引脚为输出*/}5.2.3程序清单下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。#includepic1687x.h/*该程序用于在8个LED上依次显示1~8等8个字符*/staticvolatileinttable[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};volatileunsignedchardata;#definePORTAIT(adr,bit)((unsigned)(&adr)*8+(bit))/*绝对寻址位操作指令*/89staticbitPORTA_5@PORTAIT(PORTA,5);/*spi初始化子程序*/voidSPIINIT(){PIR1=0;SSPCON=0x30;/*SSPEN=1;CKP=0,FOSC/4*/SSPSTAT=0xC0;TRISC=0x00;/*SDO引脚为输出,SCK引脚为输出*/}/*系统各输入输出口初始化子程序*/voidinitial(){TRISA=0x00;/*A口设置为输出*/INTCON=0x00;/*关闭所有中断*/PORTA_5=0;/*LACK送低电平,为锁存做准备*/}/*SPI发送子程序*/voidSPILED(intdata){SSPBUF=data;/*启动发送*/do{;}while(SSPIF==0);/*等待发送完毕*/SSPIF=0;/*清除SSPIF标志*/}/*主程序*/main(){unsignedinti;initial();/*系统初始化*/SPIINIT();/*SPI初始化*/for(i=8;i0;i--)/*连续发送8个数据*/{data=table[i];/*通过数组的转换获得待显示的段码*/SPILED(data);/*发送显示段码显示*/}PORTA_5=1;/*最后给锁存信号,代表显示任务完成*/90}5.3.3程序清单下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。有关显示部分的SPI初始化,请读者参考5.2节。#includepic.h/*该程序用于按下相应的键时,在第一个8段LED上显示相应的1~4的字符*/#definePORTAIT(adr,bit)((unsigned)(&adr)*8+(bit))/*绝对寻址位操作指令*/staticbitPORTA_5@PORTAIT(PORTA,5);#definePORTBIT(adr,bit)((unsigned)(&adr)*8+(bit))/*绝对寻址位操作指令*/staticbitPORTB_5@PORTBIT(PORTB,5);staticbitPORTB_4@PORTBIT(PORTB,4);staticbitPORTB_1@PORTBIT(PORTB,1);staticbitPORTB_2@PORTBIT(PORTB,2);unsignedinti;unsignedcharj;intdata;/*spi初始化子程序*/voidSPIINIT(){PIR1=0;SSPCON=0x30;SSPSTAT=0xC0;TRISC=0xD7;/*SDO引脚为输出,SCK引脚为输出*/}/*系统各输入输出口初始化子程序*/voidinitial(){TRISA=0xDF;TRISB=0XF0;/*设置与键盘有关的各口的数据方向*/INTCON=0x00;/*关闭所有中断*/data=0X00;/*待显示的寄存器赋初值*/PORTB=0X00;/*RB1RB2先送低电平*/j=0;}/*软件延时子程序*/voidDELAY(){91for(i=6553;--i;)continue;}/*键扫描子程序*/intKEYSCAN(){while(1){if((PORTB_5==0)||(PORTB_4==0))break;}/*等待有键按下*/DELAY();/*软件延时*/if((PORTB_5==0)||(PORTB_4==0))KEYSERVE();/*如果仍有键按下,则调用键服务子程序*/elsej=0x00;/*如果为干扰,则令返回值为0*/return(j);}/*键服务子程序*/intKEYSERVE(){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发送子程序*/voidSPILED(intdata){SSPBUF=data;/*启动发送*/do92{;}while(SSPIF==0);/*等待发送完毕SSPIF=0;}/*主程序*/main(){staticinttable[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;/*最后给锁存信号,代表显示任务完成*/}}}5.4.1PORTB端口“电平变化中断”简介例5.3PORTB口“电平变化中断”初始化子程序/*B口“电平变化中断”初始化子程序*/voidPORTBINT(){TRISB=0XF0;/*设置相应口的输入输出方式*/OPTION=0x7F;/*B口弱上拉有效*/PORTB=0X00;/*RB1,RB2先送低电平*/RBIE=1;/*B口变位中断允许*/PORTB=PORTB;/*读B口的值,以锁存旧值,为变位中断创造条件*/}5.4.3程序清单下面给出一个调试通过的例程,以供读者参考。有关显示的部分请读者参考前面章节。93该程序中寄存器的位都用头文件中定义的位,如RB5表示PORTB的第5位,而不像前面几节那样自己定义。#includepic.h/*该程序用于通过PORTB的电平变化中断进行键盘的识别。*//*程序设置一个键值寄存器j,当按下S9键时j=1,按下S11键时*//*j=2,按下S10键时,j=3,按下S12键时j=4*/unsignedchardata;unsignedinti;unsignedcharj;constchartable[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};/*B口“电平变化中断”初始化子程序*/voidPORTBINT(){TRISB=0XF0;/*设置相应口的输入输出方式*/OPTION=0x7F;PORTB=0X00;/*RB1,RB2先送低电平*/RBIE=1;/*B口变位中断允许*/PORTB=PORTB;/*读B口的值,为变位中断创造条件*/}/*spi初始化子程序*/voidSPIINIT(){PIR1=0;SSPCON=0x30;SSPSTAT=0xC0;TRISC=0xD7;/*SDO引脚为输出,SCK引脚为输出*/}/*系统各输入输出口初始化子程序*/voidinitial(){TRISA=0xDF;INTCON=0x00;/*关闭所有中断*/data=0X00;/*待显示的寄存器赋初值*/}/*键服务子程序*/voidKEYSERVE(){94PORTB=0XFD;if(RB5==0)j=0X01;if(RB4==0)j=0X03;PORTB=0XFB;if(RB5==0)j=0X02;if(RB4==0)j=0X04;/*以上通过逐行逐列扫描,以确定是何键按下*/PORTB=0X00;/*恢复PORTB的值*/}/*软件延时子程序*/voidDELAY(){for(i=6553;--i;)continue;}/*SPI发送子程序*/voidSPILED(intdata){SSPBUF=data;/*启动发送*/do{;}while(SSPIF==0);SSPIF=0;}voidIDEDIS(){KEYSERVE();/*进行键盘的识别*/data=table[j];/*获得需要送出显示的段码*/RA5=0;/*LACK信号清0,为锁存做准备*/SPILED(data);RA5=1;/*最后给一个锁存信号,代表显示任务完成*/}/*中断服务程序*/voidinterruptkeyint(void){DELAY();/*软件延时*/if((RB5==0)||(RB4==0))/*该语句除了能够确认按键是否为干扰外,*//*还可以屏蔽一次键松开时引起的中断*/95IDEDIS();/*键识别和显示模块*/PORTB=PORTB;/*读B口的值,改变中断发生的条件,避免键*//*一直按下时,连续进行键识别*/RBIF=0;/*键扫描时可能会产生电平变化而使RBIF*//*置1,再清除一次RBIF以避免额外中断*/}main(){initial();/*系统初始化*/PORTBINT();/*B口变位中断初始化*/SPIINIT();/*利用SPI显示初始化*/ei();/*总中断允许*/while(1){;}/*等待中断*/}5.5.2程序清单下面给出一个调试通过的例程,可作为读者的参考。调试该程序把模板J7上的短路跳针拔下,以免产生冲突。#includepic1687x.hvolatileunsignedchardata;/*spi初始化子程序*/voidSPIINIT(){PIR1=0;SSPCON=0x30;/*SSPEN=1;CKP=0,FOSC/4*/SSPSTAT=0xC0;TRISC=0x10;/*SDI引脚为输入,SCK引脚为输出*/}/*系统各输入输出口初始化子程序*/voidinitial(){TRISA=0x00;TRISD=0x00;/*D口为输出方式*/INTCON=0x00;/*关闭所有中断*/}96/*SPI接收子程序*/intSPIIN(){RA4=0;/*74HC165并行置数使能,将8位开关量置入器件*//*(LOAD为低电平时8位并行数据置入74HC165)
本文标题:第5章PIC16F877的外围功能模块
链接地址:https://www.777doc.com/doc-2195897 .html