历史上的今天
返回首页

历史上的今天

今天是:2024年11月08日(星期五)

正在发生

2019年11月08日 | PIC16F877的外围功能模块例程

2019-11-08 来源:51hei

第5章 PIC16F877的外围功能模块


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

#include        

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                

/*该程序用于在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[i];                        /*通过数组的转换获得待显示的段码*/        

                SPILED(data);                /*发送显示段码显示*/                

          }

        PORTA_5=1;                                /*最后给锁存信号,代表显示任务完成*/

}

5.3.3  程序清单

        下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。有关显示部分的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)

{

推荐阅读

史海拾趣

EVERLIGHT公司的发展小趣事

在电子产品领域,品质是企业生存和发展的关键。EVERLIGHT一直将品质管理放在首位,建立了严格的质量控制体系。公司从原材料采购到生产过程,再到产品出厂,都进行严格的品质检测和监控,确保每一颗LED都符合高标准的质量要求。这种对品质的坚持让EVERLIGHT在市场上赢得了良好的口碑,也为企业赢得了更多客户的信任。

南京国博公司的发展小趣事

国博电子在军用领域同样占据重要地位。作为参与国防重点工程的重要单位,公司为陆、海、空、天等各型装备配套了大量的关键产品,确保了以有源相控阵T/R组件为代表的关键军用元器件的国产化自主保障。通过军民融合的发展模式,国博电子不仅为国防建设提供了有力支持,也促进了自身技术的不断升级和产品的持续优化。

广芯电子(BROADCHIP)公司的发展小趣事

2022年7月22日,国博电子在上海证券交易所科创板成功上市,标志着公司进入了一个新的发展阶段。上市不仅为公司带来了更多的资金支持和市场关注,也为其未来的发展提供了更广阔的空间。作为中国电子科技集团有限公司(简称“中国电科”)的首家科创板上市公司,国博电子承载着推动中国电子信息产业高质量发展的重任。上市以来,公司继续加大研发投入,拓展产品线,致力于成为全球射频电子领域的行业领导者。

Davies Molding公司的发展小趣事

Davies Molding公司自创立之初,就将产品质量视为企业的生命线。在早期,公司创始人意识到,只有提供高品质的塑料注塑成型产品,才能在竞争激烈的电子行业中立足。因此,公司投入大量资源在研发、生产和质量控制上,确保每一件产品都符合严格的标准。这种对品质的坚持,不仅赢得了客户的信任,也为Davies Molding公司赢得了良好的口碑。

Aces Electronics Co Ltd公司的发展小趣事

随着技术的不断进步和产品的日益成熟,Aces开始将目光投向国际市场。公司积极参与国际电子展会和技术交流,与多家国际知名企业建立了合作关系。通过引进国外先进的技术和管理经验,Aces不断提升自身竞争力,逐渐在国际市场上占据了一席之地。同时,公司还积极拓展海外市场,将产品销往全球多个国家和地区。

静芯微电子(ElecSuper)公司的发展小趣事

静芯微电子深知产品质量对于企业的重要性,因此建立了完善的质量管理体系。公司从原材料采购、生产制造到产品检测等各个环节都实行严格的质量控制和管理,确保每一款产品都符合高标准的质量要求。同时,静芯微电子还引进了先进的检测设备和技术手段,对产品质量进行全面检测和评估。这些措施保证了静芯微电子产品的稳定性和可靠性,赢得了客户的信任和好评。

问答坊 | AI 解惑

关于嵌入式系统--献给热爱此道的初学者们

如何学习嵌入式系统(基于ARM平台) 前言    网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。也请大家不要轻易转载。 一、嵌入式系统的概念     &n ...…

查看全部问答>

热招进行中- LSI 上海研发中心

Please submit your Resume to China.Recruiting@lsi.com 1)  Analog Design Engineer                               D ...…

查看全部问答>

GPRS问题

GPRS通信: S3C2410+ucos-ii操作系统+lwip协议,实现通过GPRS网络将数据传送到远程控制终端,请问由于我要将数据通过GPRS模块MC35I上传到GPRS网络,在经过INTERNET网传输到远程主机,那么我还需要初始化网卡CS8900A吗?…

查看全部问答>

3D电视:赤裸的商业利益诉求?

本帖最后由 jameswangsynnex 于 2015-3-3 20:03 编辑 几年来,我已经从一个技术至上主义者变成技术节制主义者。面对最近轮番炒作的3D电影、3D电视时,我没有任何激动。虽然调研机构DisplaySearch说,2008年3D电视出货70 万台,10年后是这样的:3D ...…

查看全部问答>

ucos系统综合讨论

1:你认为系统最难的是哪个部分2:你是怎么划分任务的3:任务间的同步你是怎么处理的 ucos大家都很熟悉,那么在使用过程中你遇到什么问题了,那么在这里大家可以一同讨论一下!基本上大多数人前期会把精力放到移植上,我认为在开始学习的时候不要 ...…

查看全部问答>

关于KEIL的问题

我在运行一个程序时  出现了下面的情况: The specified DLL was not found: C:\\Keil\\C51\\BIN\\ledkey Continuing without specified peripheral... 请问下要怎么解决啊?…

查看全部问答>

申请LPC1114FP48/301

我来报个名 公司:郑州弘毅电子技术有限公司 徐金荣 地址:郑州高新技术产业开发区玉兰街5号>邮编:450001电话:+86 (0371) 67998610传真:+86 (0371) 67998602网址:www.hongyiinc.com Email:MSN686@hotmail.com…

查看全部问答>

MSP430学习笔记之四:看门狗

看门狗定时器实际上是一个特殊的定时器,它的的功能是当程序运行发生故障时序时能使系统从新启动。其原理就是发生的故障的时间满足规定的定时时间后,产生一个非屏蔽中断,使系统的复位。这样当在调试程序或预计程序运行在某段内部可能瞬时发生时序 ...…

查看全部问答>

提高开关电源带负载能力

自制了一个简单的开关电源,可是带负载能力不行,加上负载电压就掉很多,哪位指点一下。如何提高带负载能力?…

查看全部问答>

内存分配

用ARM处理器     边采集视频边显示,分配一个缓存可以实现吗?…

查看全部问答>