PIC16F690 最简单的实例

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 <pic.h> #include <pic16f685.h> #include <htc.h> #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(); }

 

你可能感兴趣的:(c,IO,IE,Flash,ini,byte)