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(); }
上一篇:pic之I2C设置
下一篇:PIC16F1933点亮LCD1602(汇编)
推荐阅读最新更新时间:2024-11-11 11:05
设计资源 培训 开发板 精华推荐
- ADP2138CB-2.8EVALZ,ADP2138 评估板,800 mA,输出电压 2.8 V,3 MHz 降压稳压器
- MPC563xMVBBOARDS: MPC563xM Vertical基础板
- MC33072DR2G 运算放大器用作 LED 驱动器的典型应用
- NCV33072DR2G高阻差分放大器典型应用
- ATtiny85 充电保护器
- 用于IoT节点的STM32Nucleo套件,具有连接到云的Wi-Fi,传感器和NFC
- LT6658AIMSE-2.5 精密双路输出 2.5V 基准和电源的典型应用电路
- APM32F103CBT6 17PAD 键盘
- 使用 MD1213 和 TC6320 100V 超声波脉冲器的高压脉冲器电路
- TCR6DA1525、200mA、1.5V 和 2.5V 输出电压双路输出 CMOS 低压降稳压器的典型应用