历史上的今天

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

正在发生

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

发布者:数字梦行 来源: 51hei关键字:PIC16F877  外围功能模块  PORTD口 手机看文章 扫描二维码
随时随地手机看文章

第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)

{

[1] [2] [3]
关键字:PIC16F877  外围功能模块  PORTD口 引用地址:PIC16F877的外围功能模块例程

上一篇:PIC单片机车载仪表带CAN总线通讯源代码
下一篇:学习pic单片机经验

推荐阅读

作者:Alastair Johnson,Nuggets创始人兼CEO “双十一购物狂欢节”发源于淘宝商城在2009年11月11日举办的网络促销活动。这几年,“双十一”不仅已经成为中国电子商务行业的年度盛事,更在逐渐影响到国际电子商务行业。2017年双11一天的时间里,阿里巴巴旗下电商平台总成交额定格在了1682亿人民币1,但各家电商企业和金融科技公司对技术的追求却并未定格...
现如今,伴随着国内电动车从无到有的发展,越来越多的品牌车型络绎不绝的出现在我们的眼前。然而随着政策的退坡,市场竞争趋势与不断升级的消费需求成为要求新能源车企核心技术突破的双重压力。而这其中,占据了新能源车一部分成本的动力电池则成为了影响利润与发展的重要角色。特别是纯电动车型,动力电池对其来说是一个不可分割的存在,直接影响了车辆续...
现在有一种新技术可用于锂电池,让电池的充电速度更快。如今的锂离子电池经常采用石墨,不过可以找到石墨的替代品。据外媒报道,荷兰特温特大学(the University of Twente)MESA+研究所的研究人员发现,将此种石墨替代性材料制成纳米结构,可以为锂离子开创新的“路径”,从而让电池的充电速度更快。(图片来源:特温特大学)锂离子电池应用广泛,改变...
一、使用proteus绘制简单的电路图,用于后续仿真二、编写程序/********************************************************************************************************************---- @Project: USART---- @File: main.c---- @Edit: ZHQ---- @Version: V1.0---- @CreationTime: 20200713---- @ModifiedTime: 20200713---- @Description: ---- 波特...

史海拾趣

问答坊 | AI 解惑

L波段脉冲功率放大器幅相一致性技术研究

摘要文章对相控阵天线T/R组件阵列中的微波功率放大器幅相一致性技术进行了分析和讨论,对影响单级放大器的相移特性进行了研究,并介绍了控制放大器幅相一致性的几点方法和措施…

查看全部问答∨

手工布线

手工布线和布局一直做的不好 希望大家多讲些关于手工布局和布线…

查看全部问答∨

格式试验!

一个事满汉全席的ppt,一个是高校学籍管理的规定! 什么时候要是支持PPT就好了,就不用每次都压缩啦!…

查看全部问答∨

mtk 手机IDLE页面“中国联通”或“中国移动”标志消失的原因

我开机的时候先用socket连接了后台,下载了一些数据。每到数据写入T卡中的时候“中国移动”字样就消失了,其他的不影响,这是什么原因…

查看全部问答∨

请教一下MDD/PDD的问题

各位高手,我对MS的MDD/PDD不是很清楚,既然是分层驱动,有没有MDD层的那些接口定义,以及与PDD的接口定义,那些接口是在哪里定义好的,有没有手册?请各位指点。…

查看全部问答∨

想买笔记本,请各位大侠给点建议

能做PS, FIASH , coreldraw的,性价比好点的,大概多少钱?我是学艺术设计的,显示效果要好点,请给点建议!谢谢!…

查看全部问答∨

嵌入式爱好者的学习笔记连载(三)

嵌入式爱好者的学习笔记连载(三)     1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot ...…

查看全部问答∨

api的问题

我用凌阳的IC和MCU通讯,代码如下:   lda IOP_DATA3_L     ;装IOP_DATA3_L入累加器a   sta rOutBuffer        ldy #$08 lSPINextBit:   smb clk,clk_cfg & ...…

查看全部问答∨

usb驱动程序的开发

刚开始接触驱动程序的编写,想在winXP下用Driverstudio来写编写一些驱动,但是出现了一些问题。 我安装那三个文件的顺序是这样子的:     1。Vc++ 6.0      2。win2000 DDK     3。DriverStud ...…

查看全部问答∨

四轴运动控制卡

四轴运动控制卡 四轴运动控制卡是基于PC104总线的高性能四轴伺服/步进控制卡,位置可变环形,可在运动中随时改变速度,可使用连续插补等先进功能。脉冲输出方式可用单脉冲(脉冲+方向)或双脉冲(脉冲+脉冲)方式,最大脉冲频率4MHz,4轴步进/伺 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved