PIC16f877_C学习指南
- 格式:pdf
- 大小:162.47 KB
- 文档页数:61
第1章PIC16F877单片机实验板介绍美国微芯公司推出的CMOS 8位PIC系列单片机,采用精简指令集(RISC)、哈佛总线结构、2级流水线取指令方式,具有实用、低价、指令集小、简单易学、低功耗、高速度、体积小、功能强等特点,体现了单片机发展的一种新趋势,深受广大用户的欢迎,已逐渐成为单片机发展的新潮流。
PIC16F87X是微芯公司的中档产品。
它采用14位的类RISC指令系统,在保持低价格的前提下,增加了A/D转换器、内部E2PROM存储器、比较输出、捕捉输入、PWM 输出(加上简单的滤波电路后还可以作为D/A输出)、I2C总线和SPI总线接口电路、异步串行通信(USART)接口电路、模拟电压比较器、LCD驱动、FLASH程序存储器等许多功能,可以方便地在线多次编程和调试,特别适用于初学者学习和在产品的开发阶段使用;它也可以作为产品开发的终极产品。
微芯公司还将FLASH芯片做成与OTP芯片价格相近,以致可用FLASH芯片代替OTP芯片。
微芯公司的单片机是品种最丰富的单片机系列之一,被广泛地应用于各种仪器和设备中。
这种单片机具有如下显著的特点:开发容易,周期短:由于PIC采用类RISC指令集,指令数目少(PIC16F87X 仅35条指令),且全部为单字长指令,易学易用;相对于采用CISC(复杂指令集)结构的单片机可节省30 %以上的开发时间、2倍以上的程序空间。
高速:PIC采用哈佛总线和类精简指令集,逐步建立了一种新的工业标准,指令的执行速度比一般的单片机要快4~5倍。
低功耗:PIC采用CMOS电路设计,结合了诸多的节电特性,使其功耗很低;100 %的静态设计可进入休眠(Sleep)省电状态,而不会影响激活后的正常运行。
微芯公司的单片机是各类单片机中低功耗设计最好的产品之一。
低价实用:PIC配备有OTP(One Time Programmable)型、EPROM型及FLASH型等多种形式的芯片,其OTP型芯片的价格很低。
基于PIC16F887单片机的温度、时钟显示以及闹钟功能一、课程设计的目的《PIC 单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程在《PIC 单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC 单片机的应用方法,熟练PIC 单片机的C 程序的编写与调试,是毕业设计前的一次重要的实践,为今后走上工作岗位打下坚实的单片机应用基础。
二、设计内容1 Proteus 线路图绘制根据所设计的线路图,绘制与之一致的,能用于仿真的Proteus 线路图。
要求所绘的线路图美观、紧凑,参数要与课设一致。
2、软件编制与调试根据所设计的线路图制相应的单片机C 程序,要求所制的程序符合C 语言格式并加上注解。
每编一段即进行译,有错及时修改,并先在Proteus 上仿真,基本正确后再用PICkit3 在线调试,最后应脱机运行。
三、设计目标1该设计包括数字钟及数字温度计:按键的使用.LCD.蜂鸣器时钟芯片DS1307和温度传感器TC74。
2功能;此设计可以感测环境的温度,显示当前的时间,及闹钟。
温度与时间都显示在LCD显示屏上,以及如何调整闹钟界面四硬件设计及说明1复位按键2时钟芯片DS1307及附属接线时钟芯片DS1307用于产生时间,它提供了秒、分、时、日、年、和星期等数据,能算只瑞年2100年,时钟的晶振是典型的32.768Hz。
(1)其引脚作用如下:2(2)DS1307的读写如下;1写DS1307 的步骤如下:a) 发送启始位;b) 发送DS1307 的7位地址+0 (写),即0b11010000;c) 发送要写入DS1307 的地址,地址见图16,如要修改分,此值为1;d) 发送要写入DS1307 的数,如要把分修改为十进制数37,则此数为0x37;e) 发送停止位;2读DS1307 的步骤如下:a) 发送启始位;b) 发送DS1307 的7位地址+0 (写),即0b11010000;c) 发送要读的DS1307 的起始地址,如要从秒读起,为0;d) 发送停止位;e) 发送重新开始位;f) 发送DS1307 的7位地址+1 (读),即0b11010001;g) 发送读使能位,接收一个数据,单片机发送应答位;h) 发送读使能,接收下一个数据(地址会自动+1),单片机发送应答位,直到读数完成,接收最后一个数时单片机不发送应答位;i) 发送停止位;注意在DS1307仿真的时候七位地址为0b1001101 而实际为0b1001000 ;(3)功能是;提供时间通过pic16F877送入LCD中显示。
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等。
PIC16位数字信号控制器和单片机入门指南基本连接要求在开始使用 dsPIC33EPXXXGP50X、 dsPIC33EPXXXMC20X/50X PIC24EPXXXGP/MC20X 系列器件进行开发之前,需要注意最基本的器件引脚连接要求。
下面列出了必须始终连接的引脚名称:•所有 VDD 和 VSS 引脚•所有 AVDD 和 AVSS 引脚(不论是否使用 ADC 模块)• VCAP• MCLR 引脚• PGECx/PGEDx 引脚,用于进行在线串行编程( In-Circuit Serial Programming™, ICSP™)和调试• OSC1 和 OSC2 引脚(使用外部振荡器源时)此外,可能还需要连接以下引脚:• VREF+/VREF- 引脚(在实现 ADC 模块的外部参考电压时使用)去耦电容需要在每对电源引脚(例如, VDD/VSS 和 AVDD/AVSS)上使用去耦电容。
使用去耦电容时,需要考虑以下标准:•电容的类型和电容值:建议使用参数为 0.1 μF( 100 nF)、 10-20V 的电容。
该电容应具有低ESR,谐振频率为 20 MHz 或更高。
建议使用陶瓷电容。
•在印刷电路板上的放置:去耦电容应尽可能靠近引脚。
建议将电容与器件放置在电路板的同一层。
如果空间受限,可以使用过孔将电容放置在 PCB 的另一层,但请确保从引脚到电容的走线长度小于0.25 英寸( 6 毫米)。
•高频噪声处理:如果电路板遇到高频噪声(频率高于数十 MHz),则另外添加一个陶瓷电容,与上述去耦电容并联。
第二个电容的电容值可以介于0.001 µF 和0.01 µF 之间。
请将第二个电容放置在靠近主去耦电容的位置。
在高速电路设计中,需要考虑尽可能靠近电源和接地引脚放置一对电容。
例如,0.1 µF 电容与0.001 µF 电容并联。
•最大程度提高性能:对于从电源电路开始的电路板布线,需要将电源和返回走线先连接到去耦电容,然后再与器件引脚连接。
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单片机概述单片机的发展和应用单片机的历史发展概况单片机技术发展十分迅速,产品种类已琳琅满目。
纵横整个单片机技术发展过程,可以分为以下三个主要过程:一、单芯片微机形成过程1976年,Intel公司推出了MCS-48系列单片机。
该系列单片机早期产品在芯片内集成有:8位CPU、1K字节程序存储器(ROM)、64字节数据存储器(RAM)、27根I/O线和1个8位定时/计数器。
此阶段的主要特点是:在单个芯片内完成了CPU、存储器、I/O接口、定时/计数器、中断系统、时钟等部件的集成,但存储器的容量较小,寻址范围小(不大于4K),无串行接口,指令系统功能不强。
二、性能完善提高阶段1980年,Intel公司推出MCS-51系列单片机。
该系列单片机在芯片内集成有:8位CPU、4K字节程序存储器(ROM)、128位字节数据存储器(RAM)、4个8位并行接口、1个全双工串行接口和2个16位定时/计数器。
寻址范围为64K,并集成有控制功能较强的布尔处理器完成处理功能。
此阶段的主要特点是:结构体系完善,性能已大大提高,面向控制的特点进一步突出。
现在,MCS-51已成为公认的单片机经典机种。
三、微控制器化阶段1982年,Intel公司推出MCS-96系列单片机。
该系列单片机在芯片内部集成有:16位CPU、K字节程序存储器(ROM)、232字节数据存储器(RAM)、5个8位并行接口、1个全双工串行接口和2个16位定时/计数器。
寻址范围最大为64K。
片上还有8路10位ADC、1路PWM(D/A)输出及高速I/O部件等。
近年来,许多半导体厂商以MCS-51系列单片机的8051为内核,将许多测控系统中的接口技术、可靠性技术及先进的存储器技术和工艺技术集成到单片机中,生产出了多种功能强大、使用灵活的新一代80C51系列单片机。
此阶段的主要特点是:片内面向测控系统的外围电路增强,使单片机可以方便灵活地应用于复杂的自动测控系统及设备。
基于PIC16F877的空调温度控制系统设计摘要近几年,随着人民生活水平的逐步提高,居住条件也越来越宽敞;另一方面,环境保护运动的蓬勃发展,也要求进一步提高制冷和空调系统的利用率。
此外,人们对舒适的生活品质与环境愈来愈重视,要求也愈来愈高,不仅对室内温、湿度提出了较高的要求,也希望室内环境趋于自然环境。
综观空调器的发展过程,有三个主要的发展阶段:(1)从异步电机的定频控制发展到变频控制。
(2)从异步电机变频控制发展到无刷直流电机的变频控制。
(3)控制方法从简单的开关控制向智能控制转变。
随着对变频空调器研究的日渐深入,控制目标逐渐从单一的室温控制向温湿度控制、舒适度控制转移;控制方法从简单的开关控制向PID控制、神经网络控制、专家系统控制等智能控制方向发展。
由于神经网络控制和专家系统控制实现难度较大而且效果不一定很理想,因此本设计采用PID控制算法。
本设计从硬件和软件两方面完成了空调的温度控制系统,主要是以PIC系列单片机为核心的控制系统设计,采用PID控制算法,即通过A/D转换器将温度传感器采集来的温度数据送入单片机,单片机将采集的数据与设定温度相比较决定压缩机的工作状态,单片机通过对制冷压缩机的控制,调节压缩机的转速,实现了空调的制冷。
空调的硬件电路只是起到支持作用,因为作为自动化控制的大部分功能,只能采取软件程序来实现,而且软件程序的优点是显而易见的。
它既经济又灵活方便,而且易于模块化和标准化。
同时,软件程序所占用的空间和时间相对来说比硬件电路的开销要小得多。
同时,与硬件不同,软件有不致磨损、复制容易、易于更新或改造等特点,但由于它所要处理的问题往往远较硬件复杂,因而软件的设计、开发、调试及维护往往要花费巨大的经历及时间。
对比软件和硬件的优缺点,本设计采用软硬件结合的办法设计。
关键词:空调单片机 PID算法温度传感器目次1 引言 (3)2 总体方案设计 (3)3 硬件设计 (4)3.1 控制器的选择 (5)3.2 信号转换及调理电路 (6)3.3 数据采集模块 (8)3.4 数据显示模块 (8)3.5 脉宽调制控制及驱动电路 (9)3.6 键盘接口 (10)3.7 原理图 (11)4 软件设计 (12)4.1 软件设计思想 (12)4.2 流程图 (13)4.2.1 主程序的设计及流程图 (13)4.2.2 PID运算子程序 (15)4.2.3温度测量子程序 (19)4.3 数字滤波设计 (20)心得体会 (22)参考文献 (24)1 引言随着人们生活水平的不断提高,智能建筑得到了迅猛发展,并已成为21世纪建筑业的发展主流。
手把手教你学PIC单片机——先介绍一下我们所要使用的PIC单片机学习实验设备如果你想学习PIC单片机,请做好如下准备工作:一、需要准备的硬件设备有:计算机一台,仿真烧写调试器一台,单片机芯片一片,如PIC16F877A芯片(它PIC单片机家族中非常经典的一个型号,涵盖了PIC16F***子系列的所有功能,特别适合初学者使用,它在PIC家族中的地位类似51家族中的S51或者S52,不过内部包含了更多的功能,比如内部集成了AD等特殊单元),PIC实验板一块。
这样需要的硬件设备就齐了。
想学好单片机,肯定要多动手,多实践,当然也肯定是要适当的投入的。
二、对于PIC单片机学习和开发的软、硬件大致流程介绍1.1硬件部分上面我们已有介绍,您需要准备一台仿真烧写调试器和一块PIC学习板,我们推荐您看一下本站的“ICD2PIC仿真烧写器”和“增强型PIC实验板”,这样硬件部分可以很快搭建起来,插上相应的连接线即可,如果用户方案中有开发板所没有的特殊接口电路,或者说有其它特殊的应用,那么您可以通过实验板上扩展接口来实现外扩展,以实现自己的实际电路需求。
1.2软件部分(主要由5个步骤组成)1.用汇编语言或C语言编写源程序代码。
2.将源程序编译成目标代码(机器码),即HEX格式16进制文件。
3.用仿真烧写调试器完成软件的调试工作,解决程序中所存在的一些语法、语意问题,即排除所编程序中存在的各种错误。
4.用仿真烧写调试器将目标代码写入到单片机中,即我们平时所说的烧写芯片步骤。
5.单片机实验板上电,运行目标代码程序。
如果您能保证您所编写的程序绝对没有问题,也可以跳过第3步。
注意:“ICD2PIC仿真烧写器”既有仿真器的功能,又有编程器的功能,也就是说:一台机器同时拥有两种功能,因此也体现了它的性价比及实际使用的方便性。
下面我们先来看一看,在下面的学习过程中将要用到的硬件设备有哪些,它们分别是:“ICD2PIC仿真烧写器”和“增强型PIC实验板”,实物如图所示,你只需要有一台电脑就可以进行学习和开发了。
第1章PIC16F877单⽚机实验板介绍第1章PIC16F877单⽚机实验板介绍美国微芯公司推出的CMOS 8位PIC系列单⽚机,采⽤精简指令集(RISC)、哈佛总线结构、2级流⽔线取指令⽅式,具有实⽤、低价、指令集⼩、简单易学、低功耗、⾼速度、体积⼩、功能强等特点,体现了单⽚机发展的⼀种新趋势,深受⼴⼤⽤户的欢迎,已逐渐成为单⽚机发展的新潮流。
PIC16F87X是微芯公司的中档产品。
它采⽤14位的类RISC指令系统,在保持低价格的前提下,增加了A/D转换器、内部E2PROM存储器、⽐较输出、捕捉输⼊、PWM 输出(加上简单的滤波电路后还可以作为D/A输出)、I2C总线和SPI总线接⼝电路、异步串⾏通信(USART)接⼝电路、模拟电压⽐较器、LCD驱动、FLASH程序存储器等许多功能,可以⽅便地在线多次编程和调试,特别适⽤于初学者学习和在产品的开发阶段使⽤;它也可以作为产品开发的终极产品。
微芯公司还将FLASH 芯⽚做成与OTP芯⽚价格相近,以致可⽤FLASH芯⽚代替OTP芯⽚。
微芯公司的单⽚机是品种最丰富的单⽚机系列之⼀,被⼴泛地应⽤于各种仪器和设备中。
这种单⽚机具有如下显著的特点:开发容易,周期短:由于PIC采⽤类RISC指令集,指令数⽬少(PIC16F87X 仅35条指令),且全部为单字长指令,易学易⽤;相对于采⽤CISC(复杂指令集)结构的单⽚机可节省30 %以上的开发时间、2倍以上的程序空间。
⾼速:PIC采⽤哈佛总线和类精简指令集,逐步建⽴了⼀种新的⼯业标准,指令的执⾏速度⽐⼀般的单⽚机要快4~5倍。
低功耗:PIC采⽤CMOS电路设计,结合了诸多的节电特性,使其功耗很低;100 %的静态设计可进⼊休眠(Sleep)省电状态,⽽不会影响激活后的正常运⾏。
微芯公司的单⽚机是各类单⽚机中低功耗设计最好的产品之⼀。
低价实⽤:PIC配备有OTP(One Time Programmable)型、EPROM型及FLASH型等多种形式的芯⽚,其OTP型芯⽚的价格很低。
《PIC单片机》课程设计学生姓名:学生学号:指导教师:鲍光海二○一三年5月16 日目录1. 课程设计目的 (2)2. 课程设计题目和要求 (2)3. 课程设计报告内容 (3)3.1 硬件原理图 (3)3.2 软件原理框图 (6)3.3 功能实现 (7)4. 课设中存在的问题以及解决方法 (8)5 设计体会 ........................................................................................ 错误!未定义书签。
6 参考文献 (8)7 附录 (9)7.1 仿真原理图 (9)7.2 部分程序 (9)7.2.1 秒表程序 (9)7.2.2 闹钟程序 (12)1.课程设计目的《PIC单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程设计是在《PIC 单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC单片机的应用方法,熟练PIC单片机的C程序的编写与调试,是毕业设计前的一次重要实践,为今后走上工作岗位打下坚实的单片机应用基础。
通过本次课程设计:熟悉PCB板的焊接流程,熟练运用Proteus进行原理图设计与仿真,熟练运用MPLAB和ICD2进行软件编程与调试熟练掌握PIC16F887 TC74模块(IIC接口的温度传感器)、实时时钟芯片DS1307、定时器、中断的编程方法;熟练掌握LCD YB1602A、按键模块的应用与编程设计掌握单片机应用的一般设计方法,熟悉开发一单片机应用系统的全过程,为今后从事相应的工作打下基础。
学会用C语言编写一个完整的程序,掌握程序的设计方法,拓展编程思维。
2. 课程设计题目和要求本次课程设计我的设计题目为《多功能数字钟》,通过在PROTEUS仿真及在开发板上调试,功能实现。
设计内容:采用DS1307芯片和单片机进行IIC通信,将时钟芯片中的数据读出来,然后送到LCD1602中去显示,然后设置秒表功能,闹钟功能,还有温度显示功能,通过按键的切换来实现各个功能。
基于PIC16F877的以太网通讯设计与应用以太网是当今最常用的局域网技术,它能够实现高速、稳定的数据传输。
在嵌入式系统中,以太网也广泛应用。
本文将介绍如何利用PIC16F877单片机设计实现以太网通讯功能,并探讨其在实际应用中的运用。
首先,需要用到的硬件是以太网芯片ENC28J60和PIC16F877单片机。
ENC28J60是一款非常流行的以太网芯片,它具有低功耗、小封装、支持SPI通讯等优势,适合用于嵌入式系统等场景。
而PIC16F877单片机是一款高性能、低功耗的微处理器,适用于各种应用,尤其擅长数据采集和控制。
以太网芯片ENC28J60采用SPI接口与PIC16F877单片机进行通讯。
具体实现过程如下:1.初始化以太网芯片在使用以太网芯片前,需要对其进行初始化。
初始化过程包括设置寄存器值、设置MAC地址、授权等操作。
2.建立连接建立连接是以太网通讯的关键。
建立连接包括获取IP地址、建立TCP连接、处理数据等步骤。
连接成功后,可以发送和接收数据。
3.发送数据发送数据是以太网通讯的核心部分。
在PIC16F877单片机中,需要将要发送的数据打包成一个数据帧,并通过SPI接口发送给ENC28J60芯片。
4.接收数据接收数据同样也很关键。
在PIC16F877单片机中,需要不断通过SPI接口接收ENC28J60芯片发送过来的数据。
接收到数据后,需要对其进行处理,并进行相应的操作。
除了上述步骤外,以太网通讯中还有许多其它的操作,比如数据加密、数据解密、数据压缩、数据解压缩等。
这些操作都需要PIC16F877单片机完成。
以太网通讯在实际应用中有着广泛的运用。
例如,在工业控制系统中,可以利用以太网通讯实现各个设备之间的数据交换和控制。
在智能家居系统中,可以利用以太网通讯实现各种家居设备之间的联动和远程控制。
总结起来,以太网通讯是当今最重要的局域网技术之一,利用PIC16F877单片机设计实现以太网通讯功能,能够实现高效、稳定、快速的数据传输。
第1章 PIC16F877的外围功能模块1.1.2 简单应用实例该例用于令与PORTD口相连的8个发光二极管前4个点亮,后4个熄灭。
在调试程序前,应使与PORTD口相连的8位拔码开关拔向相应的位置。
例1.1 PORTD输出<pic.h>#includemain(){TRISD=0X00;/*TRISD寄存器被赋值,PORTD每一位都为输出*/ while(1);/*循环执行点亮发光二极管的语句*/{PORTD=0XF0;/*向PORTD送数据,点亮LED(由实验模板*//*的设计决定相应位置低时LED点亮)。
*/ }}1.2.1 MSSP模块SPI方式功能简介下面是一段简单的SPI初始化例程,用于利用SPI工作方式输出数据的场合。
例1.2 SPI初始化程序/*spi初始化子程序*/void SPIINIT(){PIR1=0;/*清除SPI中断标志*/SSPEN=1;CKP=0 , FOSC/4 */SSPCON=0x30; /*SSPSTAT=0xC0;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,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;SSPEN=1;CKP=0 , FOSC/4 */SSPCON=0x30; /*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(){I;unsignedinitial();/*系统初始化*/SPIINIT() ;/*SPI初始化*//*连续发送8个数据*/for(i=8;i>0;i--){data=table[i];/*通过数组的转换获得待显示的段码*/SPILED(data);/*发送显示段码显示*/}PORTA_5=1;/*最后给锁存信号,代表显示任务完成*/}1.3.3 程序清单下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。
有关显示部分的SPI初始化,请读者参考1.2节。
#include <pic.h>/*该程序用于按下相应的键时,在第一个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;/*待显示的寄存器赋初值*/先送低电平*/RB2PORTB=0X00; /*RB1j=0;}/*软件延时子程序*/void DELAY(){for(i = 6553; --i ;)continue;}/*键扫描子程序*/int KEYSCAN(){while(1){((PORTB_5==0)||(PORTB_4==0))ifbreak;} /*等待有键按下*/DELAY();/*软件延时*/if((PORTB_5==0)||(PORTB_4==0))KEYSERVE();/*如果仍有键按下,则调用键服务子程序*/ j=0x00;/*如果为干扰,则令返回值为0*/elsereturn(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;/*最后给锁存信号,代表显示任务完成*/ }}}1.4.1 PORTB端口“电平变化中断”简介例1.3 PORTB口“电平变化中断”初始化子程序/*B口“电平变化中断”初始化子程序*/void PORTBINT( ){TRISB=0XF0;/*设置相应口的输入输出方式*/OPTION=0x7F;/*B口弱上拉有效*/PORTB=0X00; /*RB1,RB2 先送低电平*/RBIE=1;/*B口变位中断允许 */PORTB=PORTB;/*读B口的值,以锁存旧值,为变位中断创造条件*/}1.4.3 程序清单下面给出一个调试通过的例程,以供读者参考。
有关显示的部分请读者参考前面章节。
该程序中寄存器的位都用头文件中定义的位,如RB5表示PORTB的第5位,而不像前面几节那样自己定义。
<pic.h>#include/*该程序用于通过PORTB的"电平变化中断"进行键盘的识别。
*//*程序设置一个键值寄存器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};/*B口“电平变化中断”初始化子程序*/void PORTBINT(){TRISB=0XF0;/*设置相应口的输入输出方式*/OPTION=0x7F;PORTB=0X00; /*RB1, RB2 先送低电平*/RBIE=1;/*B口变位中断允许 */PORTB=PORTB;/*读B口的值,为变位中断创造条件*/}/*spi初始化子程序*/void SPIINIT(){PIR1=0;SSPCON=0x30;SSPSTAT=0xC0;TRISC=0xD7;/*SDO引脚为输出,SCK引脚为输出*/}/*系统各输入输出口初始化子程序*/void initial(){TRISA=0xDF;INTCON=0x00;/*关闭所有中断*/data=0X00;/*待显示的寄存器赋初值*/}/*键服务子程序*/void KEYSERVE(){PORTB=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的值*/}/*软件延时子程序*/void DELAY(){for(i = 6553; --i ;)continue;}/*SPI发送子程序*/void SPILED(int data){SSPBUF=data;/*启动发送*/do{;}while(SSPIF==0);SSPIF=0;}void IDEDIS(){KEYSERVE();/*进行键盘的识别*/data=table[j];/*获得需要送出显示的段码*/RA5=0;/*LACK信号清0,为锁存做准备*/SPILED(data);RA5=1;/*最后给一个锁存信号,代表显示任务完成*/}/*中断服务程序*/void interrupt keyint(void){DELAY();/*软件延时*/if((RB5==0)||(RB4==0)) /*该语句除了能够确认按键是否为干扰外,*//*还可以屏蔽一次键松开时引起的中断*/IDEDIS();/*键识别和显示模块*/PORTB=PORTB;/*读B口的值,改变中断发生的条件,避免键*//*一直按下时,连续进行键识别*/RBIF=0;/*键扫描时可能会产生"电平变化"而使RBIF*//*置1,再清除一次RBIF以避免额外中断*/}main(){initial();/*系统初始化*/PORTBINT();/*B口变位中断初始化*/SPIINIT() ;/*利用SPI显示初始化*/ei();/*总中断允许*/while(1){;} /*等待中断*/}1.5.2 程序清单下面给出一个调试通过的例程,可作为读者的参考。