第5章PIC16F877的外围功能模块
PIC16F877A功能及其编程
4.1.1 端口A
因此,在使用RA口时,除了要设置TRISA外,有 时相关寄存器也要设置。
注意:在上电复位时,与AN有关的端口的默认 设置是作为模拟端口,即ADCON1(见4.6)中默认 值为0b00xx0000,这个值的设置结果是除RA4外的所 有的RA引脚都作为模拟输入。
信的时钟线; RC7/RX/DT:IO引脚、异步串行通信的接收、同步串行通
信的数据线。
4.1.4 端口D
端口D有8个引脚,它除了作为普通IO口外, 还能作为并行从动口使用。
4.1.5 端口E 端口E只有3个引脚,它们都可以作为AD转换
的模拟电压输入口,功能如下:
RE0/RD/AN5:IO引脚、并行从动口的读控制、 模拟电压输入通道AN5;
➢ 中断的特点:可返回性。中断处理结束后必须能 回到原先的程序,并且能继续运行原先的程序,
这就需要在中断时能进行现场保护与恢复。
中断的执行过程
➢ 中断发生:程序执行到某行,突然事件(能够产 生中断的事件)发生,产生中断。
➢ 断点保护:CPU自动将中断时刻即将要执行的下 一条指令的地址压入堆栈。
➢ 中断响应:CPU自动将PC强制设为0X0004,且GIE =0。执行中断服务程序(自动完成现场保护与恢 复,手动清中断标志位)。
将被调试系统占用,因此在调试时此二个引脚暂 不能使用。
3、8个引脚具有内部弱上拉使能控制 由OPTION_REG寄存器的第7位RBPU控制,如果弱 上拉使能,作为输入的RB口在端口悬空时将被上拉 到高电平。以RB0为例,如下图所示:
4、RB0/INT具有外部中断功能。
5、RB的的高4位还具有电平变化中断功能
ADIE
PIC16f877中文资料1
PIC16F877原理简介1.1 PIC16F877特性:PIC16F877是由Microchip公司所生产开发的新产品,属于PICmicro系列单片微机,具有Flash program程序内存功能,可以重复烧录程序,适合教学、开发新产品等用途;而其内建ICD(In Circuit Debug)功能,可以让使用者直接在单片机电路或产品上,进行如暂停微处理器执行、观看缓存器内容等,让使用者能快速地进行程序除错与开发。
如图1为PIC16F877的40根接脚图,PDIP是指一般最常见的DIP(Dual In Line Package)包装,而PIC单片机也有PLCC(Plastic Leaded Chip Carrier)与QFP(Quad Flat Package)两种形式的包装,依照不同的需求,寻找不同的包装形式。
如图所示,每根接脚都有其特定功能,例如Pin11与Pin32(VDD)为正电源接脚,Pin12与Pin31(VSS)为地线接脚;而有些接脚有两种甚至三种以上功能,例如Pin2(RA0/AN0)代表PORTA的第一支接脚,在系统重置(Reset)后,可自动成为模拟输入接脚,接收模拟讯号,也可经由程序规划为数字输出输入接脚。
图1. PDIP40引脚PIC16F877接脚说明图2. PDIP28和SOIC28引脚PIC16F877接脚图说明图3. PLCC44引脚PIC16F877脚位图说明图4. QFP44引脚PIC16F877引脚图说明PIC16F877属于闪控式(Flash)单片机,可以重复烧录,其ROM的容量总共是8K words,以2K为一个page,区分为4个pages;内部RAM总共有512个字节(00f~1FFh),以128个字节为一个Bank,共区分为4个Bank,如图5所示,每个Bank的前半段都有其特殊用途,分别连接到其特殊功能模块,例如I/O、CCP、Timer、USART、MSSP等。
PIC16f877中文资料
PIC16f877中文资料PIC16F877原理简介1.1 PIC16F877特性:PIC16F877是由Microchip公司所生产开发的新产品,属于PICmicro系列单片微机,具有Flash program程序内存功能,可以重复烧录程序,适合教学、开发新产品等用途;而其内建ICD(In Circuit Debug)功能,可以让使用者直接在单片机电路或产品上,进行如暂停微处理器执行、观看缓存器内容等,让使用者能快速地进行程序除错与开发。
如图1为PIC16F877的40根接脚图,PDIP是指一般最常见的DIP(Dual In Line Package)包装,而PIC单片机也有PLCC(Plastic Leaded Chip Carrier)与QFP(Quad Flat Package)两种形式的包装,依照不同的需求,寻找不同的包装形式。
如图所示,每根接脚都有其特定功能,例如Pin11与Pin32(VDD)为正电源接脚,Pin12与Pin31(VSS)为地线接脚;而有些接脚有两种甚至三种以上功能,例如Pin2(RA0/AN0)代表PORTA的第一支接脚,在系统重置(Reset)后,可自动成为模拟输入接脚,接收模拟讯号,也可经由程序规划为数字输出输入接脚。
图1. PDIP40引脚PIC16F877接脚说明图2. PDIP28和SOIC28引脚PIC16F877接脚图说明图3. PLCC44引脚PIC16F877脚位图说明图4. QFP44引脚PIC16F877引脚图说明PIC16F877属于闪控式(Flash)单片机,可以重复烧录,其ROM 的容量总共是8K words,以2K为一个page,区分为4个pages;内部RAM总共有512个字节(00f~1FFh),以128个字节为一个Bank,共区分为4个Bank,如图5所示,每个Bank的前半段都有其特殊用途,分别连接到其特殊功能模块,例如I/O、CCP、Timer、USART、MSSP等。
PIC16F877学习开发板简介
PIC16F877学习开发板简介P S / 2 接 口 8路高亮LED 6位数码管 蜂 鸣 器 1 2 8 6 4 液 晶 I C S P PIC16F877A R S 2 3 2接口 红 外 接 收 IIC (24C02) U S B 口 P L 2 3 0 3 AD 电压调节D A C 0 8 3 2 电源切换开关 外接电源插硬件分布图一、资源模块介绍1. 八位LED 指示灯2. 六位数码管3. 4个独立按键4. 一体化红外接收头5. 蜂鸣器声音输出6. DS18B20温度传感器7. DS1302实时时钟电路8. 1602液晶显示模块9. 128*64液晶显示模块10. 4*4矩阵键盘扫描11. RS232串口模块可与PC通讯12. 一路A/D转换13. DAC0832 D/A转换14. 24C01 IIC EEPROM15. ICSP接口,可在线调试和编程二、实例(C语言)实验一:LED灯闪烁实验实验二:LED流水灯实验实验三:静态数码管实验实验四:动态数码管实验实验五:蜂鸣器实验实验六:独立按键实验实验七:矩阵键盘实验实验八:串口实验实验九:AD模数转换实验实验十:PS2键盘接口实验实验十一:DAC0832数模转换实验实验十二:HS0038红外接收一体头实验实验十三:AT24C02(I2C协议)实验实验十四:DS1302(SPI协议)实验实验十五:DS18B20温度传感器实验实验十六:lcd1602液晶实验实验十七:lcd12864液晶实验产品性能优点:1、支持ISP在线下载,直接把程序写到单片机中,不需要用户购买编程器,直接USB下载程序,初学者无需再购买任何仿真器或编程器等开发工具,只要有一台计算机(笔记本即可),就可以实践学习电子方面的知识。
2、 功能齐全,基本上涵盖了所有典型的外围接口电路,方便用户学习各样的硬件电路知识和软件编程,是市面上难见的多功能开发学习板。
3、配套光盘包含丰富的学习资料,其中包括:①学习板实验程序例程(C语言),注释详细,方便初学者学习阅读;②开发者多年积累的大量经典PIC单片机学习资料,使读者看完能有一想不到的收获。
基于PIC16F877智能高压脉冲电子围栏系统的设计
基于PIC16F877智能高压脉冲电子围栏系统的设计【摘要】鉴于MCU PIC16F877单片机的诸多优点,在智能高压脉冲电子围栏的设计中使用MCU PIC16F877作为核心部件可以使电路设计简捷,高压稳定,误报率低,整体性能好。
系统硬件由单片机PIC16F877、高压驱动电路、脉冲检测、系统通信、防拆报警、光电报警等部件组成。
系统软件由A/D转换、采样比较、反馈控制、远程通信、防拆报警等模块组成。
【关键词】高压电子围栏;PIC16F877单片机;智能智能高压脉冲电子围栏把阻挡和报警两大功能有机的结合起来,是目前国内主流的周界安防设备,特别适合政府、广电行业、电力行业等重要部位的防护。
该系统具有整体结构简单、控制灵活、误报率低、工作稳定等特点。
1.硬件设计系统硬件结构框图如图1所示。
1.1 PIC16 F877A单片机图2为PIC16F877各引脚在体系功能中的使用状态。
Microchip公司生产的MCU PIC16F877[1-4]是一款较新的中档产品,它具有高速(Harvard结构)、低功耗、较大的拉电流和灌电流(最大拉电流/灌电流为25mA)、高代码压缩率、抗干扰能力强、流水线取指令、FLASH存储器、E2PROM以及性价比高等特点.除此之外,MCU PIC16F877还有许多功能模块,诸如模数转换模块、三个定时器模块(TMRO,TMRl and TMR2)、通用同步/步收发器(USART)模块、主控同步串行接口(MSSP)模块以及两个捕捉/比较/PWM等等。
1.2 高压驱动高压脉冲发生器的电路原理图如图3所示。
根据国家安全防范报警系统的规范要求,高压脉冲间隔是每秒1次,脉冲持续时间≤0.1s,脉冲电量≤2.5mC,脉冲电压≤8000V。
系统采用二级升压的方式来实现。
由单片机输出口OUT1作为功率传输与控制,采用PWM方式,脉宽采用固定周期为50 lLS,占空比为10:1的脉冲序列,通过T2和Q2和C2实现第一次升压,达到C2电容上电压到600V,并通过改变单片机输出口OUT1的脉冲序列的占空比来达到控制高、低压和开、关机器的功能。
第二讲,PIC16F877的硬件系统,20090714
一、PIC16F877核心区域的 核心区域的 部件及其功能
程序存储器:8K*14 flash程序区 PC指针:程序计数器。 硬件堆栈:共有8层,在调用子程序时自动保存 主程序断点处的地址。至于其它的寄存器的内 容则需要用软件编程来保存。 指令寄存器: 暂存从程序存储器中取出的指令,并将指令 分解为操作码和操作数<或者操作数的地址>, 分别送到不同的目的地。
PIC16F877(A)具有8*13的独立堆栈空间, 不占用程序存储器和数据存储器的区域,也 不需要进栈出栈的指令,在调用和返回时自 动实现入口地址的进出栈操作,遵循“后进 先出”的规则。
六、数据存储器
数据存储器的特点
PIC单片机内的数据寄存器分为两种: 一是工作寄存器,只有W寄存器; 一是数据寄存器RAM,又叫文件寄存器,它包 括所有的特殊功能寄存器、通用寄存器以及所有的 输入输出端口。PIC中的RAM除了具备普通RAM可读 可写的功能外,还能实现移位、置位、清位、位测 试等一系列其它单片机中“工作寄存器”的功能。 掉电后,RAM中的内容消失。
RAM数据存储器结构 数据存储器结构
PIC16F877结构 —— 时钟电路
PIC16F877的时钟按提供时钟的速度快慢分成四种模式,模式 的时钟按提供时钟的速度快慢分成四种模式, 的时钟按提供时钟的速度快慢分成四种模式 的选用是由单片机中配置字中FOSC0位和 位和FOSC1位来设定: 位来设定: 的选用是由单片机中配置字中 位和 位来设定 LP模式 模式——低功耗振荡器(Low Power Crystal) 低功耗振荡器( 模式 低功耗振荡器 ) XT模式 模式——标准的振荡器 谐振器(Crystal/Resonator) 标准的振荡器/谐振器 模式 标准的振荡器 谐振器( ) HS模式 模式——高速振荡器 谐振器(High speed 高速振荡器/谐振器 模式 高速振荡器 谐振器( Crystal/Resonator ) RC模式 模式——低成本的电阻器 电容器(Resistor/Capacitor) 低成本的电阻器/电容器 模式 低成本的电阻器 电容器( )
PIC16F887系统资源
22
I/O 还可作为从动并行端口PSP实现与
RD4 / PSP4
27
I/O 其他的微处理器总线的连接
RD5 / PSP5
28
I/O
RD6 / PSP6
29
I/O
RD7 / PSP7
30
I/O
2021/3/11
中山火炬职业技术学院
8
引脚名称
PID 类 型
功能说明
端口RE:输入/输出可编程双向3线端口,此外全部引脚都有第2、3功能。
还可做同步/异步收发器USART的全双工 异步接收脚、半双工同步传送的数据
中山火炬职业技术学院
7
引脚名称
PID 类 型
复用功能说明
端口D:输入/输出可编程双向端口,此外全部引脚都有第2功能。
RD0 / PSP0
19
I/O
RD1 / PSP1
20
I/O
RD2 / PSP2
21
I/O
RD3 / PSP3
OSC1/CLKIN 13
I
外接晶体振荡器/外时钟输入
OSC2/CLKOUT 14
O
外接晶体振荡器/时钟输出端
/MCLR V pp
1
I/O 复位端/外加编程+12V电压输入端
端口A(6线):输入/输出可编程双向端口、第2、3 功能。
RA0 / AN0
2
I/O I/O口(下同) / 第0路模拟信号输入
2021/3/11
中山火炬职业技术学院
结构图
18
19.在线调试电路:实现对于焊接在板子上的PIC16F87X芯片的在线调 试。当然,必须使用microchip公司提供的 “MAPLAB — IDE”调试软件的支持。
PIC16F877单片机中串行通讯模块的应用
PIC16F877单片机中串行通讯模块的应用
麻恒进
【期刊名称】《电子世界》
【年(卷),期】2002(000)001
【摘要】@@ PIC16F877单片机具有通过两个端口线即可进行在线串行编程、在线调试的特点,因而出现了相对便宜的快速开发工具MPLAB-ICD.该芯片集成了多种外围功能模块,如十位多通道A/D转换模块、同步串行口SSP(synchronous serial port)部件、通用同步异步收发器部件USART(universal
synchronous/asynchronous receiver transmitter)等,从而减少了构成系统时所需的外部器件,提高了设计的速度.随着器件的减少,系统的稳定性也得到了提高.本文将讨论经常用到的USART模块及使用中应注意的几个问题.
【总页数】1页(P30)
【作者】麻恒进
【作者单位】中国航空精密机械研究所第四研究室
【正文语种】中文
【中图分类】TP3
【相关文献】
1.PIC16F877单片机在Scorpion采集站中的应用 [J], 周阿群;祝彩霞;吴秀琴
2.PIC16F877单片机在地震预测系统中的应用 [J], 王一飞;章勇
3.PIC16F877单片机在智能站用电源系统中的应用 [J], 皮大能;南光群;闵小玲
4.PIC16F877单片机在智能站用电源系统中的应用 [J], 皮大能;南光群;闵小玲
5.PIC16F877A单片机在软起动控制器中的应用 [J], 郭继红;李虹飞
因版权原因,仅展示原文概要,查看原文内容请购买。
PIC单片机C语言编程实例
/*等待中断*/
1.1.2 程序清单
下面给出一个调试通过的例程,可作为读者的参考。调试该程序把模板 J7 上的短路跳 针拔下,以免产生冲突。
#include <pic1687x.h>
volatile unsigned char data;
TRISC=0x00;
/*SDO 引脚为输出,SCK 引脚为输出*/
}
1.2.3 程序清单
下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。
#include
<pic1687x.h>
/*该程序用于在 8 个 LED 上依次显示 1~8 等 8 个字符*/
static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,
I;
unsigned char j;
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
/*B 口“电平变化中断”初始化子程序*/
/*启动发送*/
do
{
;
}while(SSPIF==0);
/*等待发送完毕*/
SSPIF=0;
/*清除 SSPIF 标志*/
}
/*主程序*/
main()
{
unsigned I;
initial();
基于单片机PIC16F877控制的路灯节能控制器设计
基于单片机PIC16F877控制的路灯节能控制器设计1. 引言1.1 研究背景路灯节能是城市节能减排的重要内容,而路灯控制器则是实现路灯节能的关键装置。
传统的路灯控制器多采用定时开关的方式,不能根据实际光照情况调节亮度,造成能源浪费;而基于单片机PIC16F877控制的路灯节能控制器可以根据实时光照情况调节亮度,实现节能的同时提高使用效率。
目前,市场上已经有许多基于单片机控制的路灯节能控制器产品,但是它们在节能效果、控制精度和稳定性等方面仍有待提高。
在这样的背景下,本研究旨在设计一款基于单片机PIC16F877控制的路灯节能控制器,通过优化硬件设计和软件算法,实现路灯的智能节能控制。
这不仅有助于提高路灯的节能效果,减少能源浪费,还能提升城市照明系统的智能化水平,为城市节能环保事业做出贡献。
本研究具有重要的现实意义和社会价值。
通过对路灯节能控制器设计的研究,有望为路灯节能技术的发展提供新的思路和方法,推动城市节能照明事业的进步和发展。
1.2 研究目的路灯在城市生活中扮演着重要的角色,它们不仅提供照明,还有助于提升道路安全和城市形象。
传统的路灯控制系统存在能耗高、管理不便等问题,在当前提倡节能环保的大背景下,对路灯能耗进行控制和优化已经成为迫切需要解决的问题。
本研究旨在设计并实现一种基于单片机PIC16F877控制的路灯节能控制器,通过智能控制路灯的开关及亮度,实现路灯能耗的有效管理,辅助实现节能减排的目标。
具体来说,本研究将结合单片机的控制能力和路灯的实际工作需求,设计一种具有智能控制功能的路灯节能控制器,实现根据实际环境亮度自动调节路灯亮度的功能,并通过远程控制、时间控制等方式管理路灯的工作状态。
通过本研究的实施,预计可以有效减少路灯的能耗,降低城市管理成本,提升城市能源利用效率,为城市节能减排工作做出贡献。
本研究还可以为智慧城市建设提供一种新的思路和技术手段,促进城市智能化水平的提升。
1.3 研究意义路灯在城市中起着非常重要的作用,不仅能提供道路照明,保障行车和行人安全,还可以美化城市夜景。
基于PIC16F877A的课程设计
第一模块:课程原理设计方面的内容●课程设计的目的:我是觉得焊板,是件挺有意思的事丰富同学自己动手做板,设计电路的经验,加强同学的动手能力,强化自我分析问题,解决问题的能力,培养一种全局观,一种良好的思维方式。
同时也可以让同学学到做到事都要细心。
●课程设计的原理:这个课程设计没有什么原理,原理就是先用头脑,构想出自己所要设计的东西,然后用Protel 99SE 画出电路原理图(电路设计原理图会在后面的清单中给出),再按照自己设计的电路图,利用万能的双手,将所需要用到的元件一个一个的焊接到万用板上,然后一个一个的把应该接的器件接起来,最后融合自己在这学期,PIC课程上所学得的编程语言,按照硬件所要实现的功能,编写源程序,最后就祈祷能一下子成功吧。
(原理好像挺简单的)●设计内容:本设计为一个多功能时钟的设计,芯片基于8位机PIC单片机,显示模块用LCD液晶显示器1602.●硬件组成:PIC单片机一片,一个LCD液晶显示器1602,一个7805稳压管,一个4M外接晶振,一个9V电池,电阻、电容若干,按键、导线若干。
(具体的材料清单后面在附录中会给出)●设计要求(自己按自己的要求设计)1.要求能在LCD1602上显示一个电子时钟2.可以通过一个按键来控制正常计时还进入修改时间模块3.再由一个按键控制选位,可以精确到每一位的选定,4.由另一个按键控制时钟的准确调整(可能扩充时钟功能和其它显示模式功能)第二块:焊接实物方面遇到的问题及注意事项1.焊接前一定得先将实物按照电路图合理的摆放在通用板上。
这个很关键,好的实物布局可以在很大程度上降低焊接时的难度。
LCD1602有16个管脚,其中有8个为数据和指令的输入、读出端口,3个为控制读/写数据/指令的端口,其余的背光接口,或是接VCC,或是直接接地。
我在画电路图的时候,将8个数据总线安排到PORTD端口,将3个控制端口安排在PORTA端口,而因为PIC单片机芯片上的管脚排列方式,PORTD的端口是分布在两边,只有PORTB的8个管脚在同一列上,当时安排端口的时候,如果将PORTB端口做为数据总线,PORTC安排作为控制总线,那样会大大降低布线、焊接的难度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(RB5==0) j=0X02;
if(RB4==0) j=0X04; /*以上通过逐行逐列扫描,以确定是何键按下*/
PORTB=0X00; /*恢复PORTB的值*/
}
/*软件延时子程序*/
void DELAY()
{
for(i = 6553; --i ;)
{
TRISA=0xDF;
TRISB=0XF0; /*设置与键盘有关的各口的数据方向*/
INTCON=0x00; /*关闭所有中断*/
data=0X00; /*待显示的寄存器赋初值*/
PORTB=0X00; /*RB1 RB2 先送低电平*/
j=0;
}
/*软件延时子程序*/
例5.2 SPI初始化程序
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0; /*清除SPI中断标志*/
SSPCON=0x30; /* SSPEN=1;CKP=0 , FOSC/4 */
SSPSTAT=0xC0;
TRISC=0x00; /*SDO引脚为输出,SCK引脚为输出*/
static bit PORTA_5 @ PORTAIT(PORTA,5);
#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit)) /*绝对寻址位操作指令*/
static bit PORTB_5 @ PORTBIT(PORTB,5);
void DELAY()
{
for(i = 6553; --i ;)
continue;
}
/*键扫描子程序*/
int KEYSCAN()
{
while(1)
{
if ((PORTB_5==0)||(PORTB_4==0))
break;
} /*等待有键按下*/
{
TRISB=0XF0; /*设置相应口的输入输出方式*/
OPTION=0x7F; /*B口弱上拉有效*/
PORTB=0X00; /*RB1,RB2 先送低电平*/
RBIE=1; /*B口变位中断允许 */
PORTB=PORTB; /*读B口的值,以锁存旧值,为变位中断创造条件*/
DELAY(); /*软件延时*/
if ((PORTB_5==0)||(PORTB_4==0))
KEYSERVE(); /*如果仍有键按下,则调用键服务子程序*/
else j=0x00; /*如果为干扰,则令返回值为0*/
return(j);
}
/*键服务子程序*/
PORTB=0X00; /*恢复PORTB的值*/
while(1)
{
if((PORTB_5==1)&&(PORTB_4==1)) break;/*等待键盘松开*/
}
return(j);
}
/*SPI发送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*启动发送*/
/*程序设置一个键值寄存器j,当按下S9键时j=1,按下S11键时 */
/*j=2,按下S10键时,j=3,按下S12键时j=4*/
unsigned char data;
unsigned int I;
unsigned char j;
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
continue;
}
/*SPI发送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*启动发送*/
do
{
;
}while(SSPIF==0);
SSPIF=0;
}
void IDEDIS()
{
KEYSERVE(); /*进行键盘的识别*/
int data;
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
TRISC=0xD7; /*SDO引脚为输出,SCK引脚为输出*/
}
/*系统各输入输出口初始化子程序*/
void initial()
initial();/*系统初始化*/
SPIINIT() ;/*SPI初始化*/
while(1)
{
KEYSCAN();
if(j!=0) /*如果j=0,证明先前的按键为干扰,则不予显示*/
{
data=table[j];
PORTA_5=0; /*LACK信号清0,为锁存做准备*/
data=table[j]; /*获得需要送出显示的段码*/
RA5=0; /*LACK信号清0,为锁存做准备*/
SPILED(data);
{
TRISA=0x00; /*A口设置为输出*/
INTCON=0x00; /*关闭所有中断*/
PORTA_5=0; /*LACK送低电平,为锁存做准备*/
}
/*SPI发送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*启动发送*/
}
5.3.3 程序清单
下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。有关显示部分的SPI初始化,请读者参考5.2节。
#include <pic.h>
/*该程序用于按下相应的键时,在第一个8段LED上显示相应的1~4的字符*/
#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) /*绝对寻址位操作指令*/
while(1); /*循环执行点亮发光二极管的语句*/
{
PORTD=0XF0; /*向PORTD送数据,点亮LED(由实验模板*/
/*的设计决定相应位置低时LED点亮)。*/
}
}
5.2.1 MSSP模块SPI方式功能简介
下面是一段简单的SPI初始化例程,用于利用SPI工作方式输出数据的场合。
SPILED(data);
PORTA_5=1; /*最后给锁存信号,代表显示任务完成*/
}
}
}
5.4.1 PORTB端口“电平变化中断”简介
例5.3 PORTB口“电平变化中断”初始化子程序
/*B口“电平变化中断”初始化子程序*/
void PORTBINT( )
}
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
TRISC=0xD7; /*SDO引脚为输出,SCK引脚为输出*/
}
/*系统各输入输出口初始化子程序*/
void initial()
{
do
{
;
}while(SSPIF==0); /*等待发送完毕*/
SSPIF=0; /*清除SSPIF标志*/
}
/*主程序*/
main()
{
unsigned I;
initial(); /*系统初始化*/
SPIINIT() ; /*SPI初始化*/
}
5.2.3 程序清单
下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。
#include <pic1687x.h>
/*该程序用于在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};
/*B口“电平变化中断”初始化子程序*/
void PORTBINT()
{
TRISB=0XF0; /*设置相应口的输入输出方式*/
OPTION=0x7F;
PORTB=0X00; /*RB1, RB2 先送低电平*/
RBIE=1; /*B口变位中断允许 */
PORTB=PORTB; /*读B口的值,为变位中断创造条件*/
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;/*以上根据按下的键确定相应的键值*/
}
5.4.3 程序清单
下面给出一个调试通过的例程,以供读者参考。有关显示的部分请读者参考前面章节。该程序中寄存器的位都用头文件中定义的位,如RB5表示PORTB的第5位,而不像前面几节那样自己定义。
#include <pic.h>
/*该程序用于通过PORTB的"电平变化中断"进行键盘的识别。*/
volatile unsigned char data;