没有合适的资源?快使用搜索试试~ 我知道了~
首页pic16f887 883单片机编程实例教程
资源详情
资源评论
资源推荐
单片机学习指南 资料提供:上海齐济电子有限公司
.1.
第1章 PIC16F877 的外围功能模块
1.1.2 简单应用实例
该例用于令与 PORTD 口相连的 8 个发光二极管前 4 个点亮,后 4 个熄灭。在调试程序
前,应使与 PORTD 口相连的 8 位拔码开关拔向相应的位置。
例 1.1 PORTD 输出
#include <pic.h>
main()
{
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 中断标志*/
SSPCON=0x30; /* SSPEN=1;CKP=0 , FOSC/4 */
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;
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送低电平,为锁存做准备*/
单片机学习指南 资料提供:上海齐济电子有限公司
.2.
}
/*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; /*最后给锁存信号,代表显示任务完成*/
}
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; /*关闭所有中断*/
单片机学习指南 资料提供:上海齐济电子有限公司
.3.
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()
{
单片机学习指南 资料提供:上海齐济电子有限公司
.4.
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 位,而不像前面几
节那样自己定义。
#include <pic.h>
/*该程序用于通过 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()
{
单片机学习指南 资料提供:上海齐济电子有限公司
.5.
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)) /*该语句除了能够确认按键是否为干扰外,*/
/*还可以屏蔽一次键松开时引起的中断*/
剩余60页未读,继续阅读
阿拉灯神ding
- 粉丝: 43
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0