历史上的今天
今天是:2025年03月10日(星期一)
2020年03月10日 | PIC16F690 最简单的实例
2020-03-10 来源:eefocus
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设置
史海拾趣
|
目前用ut6410想实现 radio的功能使用si47xx的模块 ut6410本身有提供i2c的接口和驱动 kernel linux2.6.24 硬件部份問題排除 有用示波器 sda sck脚位有讯号出来. 现在遇到的状况是想从user space透过i2c对si47xx丢cmd 但是write read回传都是-1 部 ...… 查看全部问答> |
|
背光代码 volatile S3C2440A_IOPORT_REG * v_pIOPregs= NULL; BOOL BacklightInitialize() { BOOL bRet = TRUE; BL_PowerOn(TRUE); & ...… 查看全部问答> |
|
msp430芯片RAM居然不能外扩??很郁闷,最近程序大了,需要大于2K的RAM了,可是msp430芯片RAM不能外扩,这个怎么办呢?课题做到一半,555555555555 谢谢各位,请出出主意!… 查看全部问答> |
|
TinyOS在MSP430F2618+CC2520平台上移植交流 目前TinyOS还仅支持MSP430低端的MCU比如f1611,以及CC2420等射频芯片。针对MSP430高端系列单片机,以及TI推出的第二代射频芯片CC2520还未能支持 前段时间把TinyOS移植到了上述平台上,基本功能都已经实现,针对无线协议栈还需要进一步优化!希望有 ...… 查看全部问答> |
|
CC2530串口中断接收的自定义缓存BUF最大可以定义多大? 我现在需要一个最少160字节的BUF存接收到的数据进行解析;但是定义buf[160]后用IAR编译总是提示IDATA空间不够;后来通过调节IAR-option -stack/heap 中的设置;但是最大也是只能设置到buf[135 ...… 查看全部问答> |
|
一般来说,七段数码管(也有称日字管)只能显示10个阿拉伯数字和部分英文字母,但是,按排列组合来算,七段数码管可以有128个组合,因此,就七段数码管可包含的信息量来说,显示26个字母加10个数字共36个字符是没问题的,只是人们没有建立一套显示 ...… 查看全部问答> |
|
做了块CC2500模块,模块发射数据很正常,但是接收的数据全部异常,找了两天了还没找到原因,程序问题已经排除(用别人的模块发射和接受都正常),请懂的人帮下小弟,小弟搞开始搞RF… 查看全部问答> |




