专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC16F690 最简单的实例
2019-04-15 12:18
发布
生成海报
站内文章
/
PIC单片机
17618
0
1659
RA4 RA5 接SW2 SW1按键 RB7接LED delay.c
#include "delay.h" void DelayMs(unsigned char cnt) { #if XTAL_FREQ <= 2MHZ do { DelayUs(996); } while(--cnt); #endif #if XTAL_FREQ > 2MHZ unsigned char i; do { i = 4; do { DelayUs(250); } while(--i); asm("clrwdt"); } while(--cnt); #endif }
delay.h
#ifndef XTAL_FREQ #define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */ #endif #define MHZ *1000L /* number of kHz in a MHz */ #define KHZ *1 /* number of kHz in a kHz */ #if XTAL_FREQ >= 12MHZ #define DelayUs(x) { unsigned char _dcnt; / _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); / while(--_dcnt != 0) / continue; } #else #define DelayUs(x) { unsigned char _dcnt; / _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; / while(--_dcnt != 0) / continue; } #endif extern void DelayMs(unsigned char);
toppic.c
#include "pic16f685.h" #include "toppic.h" #include "delay.h" //#define BYTE unsigned char //#define WORD unsigned int #define uchar unsigned char #define uint unsigned int //typedef bit bool; //typedef unsigned char uint8; //typedef signed char int8; //typedef unsigned int uint16; //typedef signed int int16; //typedef unsigned long uint32; //typedef signed long int32; uchar data_temp,spi_data; uchar t; uchar flash_data,flag_timesover; /*toppic主板初始化函数*/ /*功 能:完成TOPPIC开发板初始化*/ /*参 数:无*/ /*返回值:无*/ /* void toppic_init(void) { /* toppic 引脚方向、输出初值定义 //COL8=1;/*让8个LED的公共端接地,为点亮LED做好准备 //TRIS_COL8=0; PORTB=0X00;/*先熄灭所有LED TRISB=0X00;/*设置D口为输出 // ADCON0 = 0x81; // ADCON1 = 0x38; // PORTA = 0X20; // TRISA=0X20; //TRISA = 0x00; PORTC=0X00;/*先熄灭所有LED TRISC=0X00;/*设置D口为输出 PORTA=0X00;/*先熄灭所有LED TRISA=0X00;/*设置D口为输出 } */ //************************************* void ini(void) { OPTION=07;//00 = 定时器1:2分频器初始值= //07=定时器1:256分频器初始值 ANSEL=0; ANSELH=0; C1ON=0;C2ON=0; //关闭比较模块 WPUA=0B00111111; //ENABLE PORTA PULL-UP WPUB=0XFF; //ENABLE PORTB PULL-UP IOCA = 0b00110000;//RA5 RA4 允许电平变化中断 INTCON=0x11101000;//GIE=1;PEIE=1;T0IE=1;INTE=0; //RABIE=1;TOIF=0;INTF=0;RABIF=0; //启动 TMR0 中断 //启动中断使能标志 TRISA= 0b00111111; //0x37;//0x07; TRISB= 0b11110000; //0xf0; TRISC= 0b00000111;//0x07; PORTA=0; PORTB=0; PORTC=0; clrwdt(); } //*****************************times查询子程序,flag_timesover=1时,延时500MS。 void sub_times() { uchar i; asm("clrwdt"); if (TMR0>121) { TMR0=0; i++; if(i>(flash_data*15)) { flag_timesover=1; i=0; } } } //********************************* void Loop_hz() { sub_times(); if(flag_timesover==1) { flag_timesover=0; if(flash_data!=0) //==0,没有键值,常亮 { G_LED=!G_LED; } else { G_LED=0; } } } //********************************* void Loop() { TRISB7 = 0 ; // TRISA5 = 1 ; // TRISA4 = 1 ; while(1) { clrwdt();//asm("clrwdt"); flash_data=0; // if(!SW1+!SW2+!SW3+!SW4+!SW5+!SW6+!SW7+!SW8+!SW9+!SW10==1) //所有的IO口,只能有一个为低电平 { if(SW2==0) { //flash_data=1; //RB7=1;//输出高电平// //LED_di(1); } if(SW1==0) { //flash_data=15 ; //RB7 =1; //LED_da(1); } } Loop_hz(); } } //******************************* void SPI_init(void) //端口初始化子程序 { PIR1 = 0x00; // SSPIF=0;没有中断发生 SSPCON = 0x30; //主控方式,Fosc/4,CKP=1空闲时钟电平为高,SSPEN=1使能同步串行功能 SSPSTAT = 0xC0; //SMP=1 时序信号末尾采样输入数据,CKE=1时序信号上升沿发送数据 TRISC = 0x00; //SDO引脚为输出,SCK引脚为输输出,SDI引脚输出 } void SPI_tx(unsigned char spi_data) //SPI发送数据子程序 { SSPBUF = spi_data; do { ; }while(!SSPIF);//等待产生SSP中断,等待发送完成 SSPIF = 0; data_temp=SSPBUF;//将接受到的数据放在变量中 } void LED_di(unsigned char t) { unsigned char i,j; for (j=0;j<=t;j++) for (i=0;i<=1;i++)//1 闪4次 2闪6次 3闪8次 4闪10次 5闪12次 6闪14次 { RB7=1;/*输出高电平*/ DelayMs(500);/*调用500us延时函数*/ RB7=0;/*输出低电平*/ DelayMs(500);/*调用500us延时函数*/ } } void LED_da(unsigned char t) { unsigned char i,j; for (j=0;j<=t;j++) for (i=0;i<=0;i++)//1 闪4次 2闪6次 3闪8次 4闪10次 5闪12次 6闪14次 { RB7=1;/*输出高电平*/ DelayMs(500);/*调用500us延时函数*/ RB7=0;/*输出低电平*/ DelayMs(500);/*调用500us延时函数*/ } } void interrupt ISR(void) { if(RABIF == 1 ) //RA4 0b00010000 口电平变化中断发生 { LED_di(1); } else if (RABIF == 0 ) //此处无意义,留待以后 { LED_da(1); } else { nop(); } RABIF=0;//清除中断标记 }
toppic.h
/*常量的宏定义*/ #define ON 1 #define OFF 0 /* 相关引脚对应的特殊功能寄存器位的宏定义 */ #define G_LED RB7 #define SW1 RA5 #define SW2 RA4 #define clrwdt() asm("clrwdt") #define nop() asm("nop") /*相关函数的声明*/ void ini(void);//toppic主板初始化 void sub_times(void); void Loop_hz(void); void Loop(void); void SPI_init(void);//端口初始化子程序 void SPI_tx(unsigned char spi_data); //SPI发送数据子程序 void LED_di(unsigned char t); void LED_da(unsigned char t);
main.c
/****************************************************************/ // // // /****************************************************************/ #include
#include
#include
#include "toppic.h" #include "delay.h" //__CONFIG(0x03F8C); __CONFIG(WDTEN & PWRTEN & MCLREN & BOREN & IESODIS & FCMDIS & INTIO); //*************************************** void main() { GIE=0;/*关全局中断*/ ini(); RABIF=0;//PORTA/PORTB 电平变化中断标志位 RABIE=1;//允许PORTA/PORTB 电平变化 GIE=1;/*开全局中断*/ Loop(); }
Ta的文章
更多
>>
嵌入式linux平台的NFS移植
0 个评论
PIC16F690 最简单的实例
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮