PIC16F690 最简单的实例

发布者:bln898最新更新时间:2020-03-10 来源: eefocus关键字:PIC16F690  按键  LED 手机看文章 扫描二维码
随时随地手机看文章

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();


}


关键字:PIC16F690  按键  LED 引用地址:PIC16F690 最简单的实例

上一篇:pic之I2C设置
下一篇:PIC16F1933点亮LCD1602(汇编)

推荐阅读最新更新时间:2024-11-11 11:05

基于CPLD的LED显示屏控制电路设计
  引言   近年来,随着计算机技术和集成电路技术的飞速发展,得到广泛应用的大屏幕显示系统当属视频LED显示系统。在LED显示技术中,由于红色、绿色发光二极管的亮度、光效色差等性能也得到了很大的提高,加之计算机多媒体制作软件的发展,现在伪彩视频LED显示系统的制造成本大大降低,应用领域不断增加。这种伪彩色视频LED显示系统采用了计算机多媒体技术,全同步动态显示视频图像,图像清晰,亮度高,无拼缝,每种颜色的视频灰度等级已经由早期的16级灰度上升现在的256灰度,随着大规模集成电路和专用元器件的发展,256级灰度的全彩色视频LED显示系统随时都可能实现。   LED电子显示技术发展迅速,已成为当今平板显示领域的主导之一。本文着重介
[电源管理]
基于CPLD的<font color='red'>LED</font>显示屏控制电路设计
基于TLC5941的全彩色LED大屏幕驱动设计
  1 引言   近年来,随着计算机技术、大规模集成电路和专用元器件的飞速发展,256级灰度的全 彩色 LED大显示屏在国内发展迅速,但是目前其显示效果并不理想:一方面,LED的发光效率受制造工艺的影响表现出固有的差异,而且这种差异还随时间发生变化,这样由大量LED组成的大屏幕显示时会出现一些随机的暗斑或亮斑,严重影响显示要求,需要采用在线的点校正消除这种影响,另一方面,现有的全彩色大屏幕一般亮度等级不足,即便采用了非线性灰度控制技术,在低亮度等级上表现色彩的能力仍然较差,显示的层次感不强,由亮度等级不足导致的另一个问题是进行γ校正不容易,从而使全彩色LED大显示屏产生一定的颜色失真。   TI公司的最新推出的TLC5941
[电源管理]
基于TLC5941的全彩色<font color='red'>LED</font>大屏幕驱动设计
LED PAR30射灯 引领商用PAR射灯进入LED时代
在商用照明领域,散热一直是一个技术难点,产品的散热性能决定了产品寿命、可靠性、光衰等重要参数。不同于PC风扇设计的市售PAR灯,飞利浦照明采用更为可靠的被动式散热,创新地在压铸铝内嵌纯铝板,其导热系数高达226,为压铸铝的2.35倍,有效提高了产品散热性。 此外,该产品光源侧边比灯具略高5mm,露出侧边散热孔,有利于芯片及驱动的长效稳定。考虑到安全因素,该系列PAR灯具备智能反馈电路,当灯壳温度超过90℃时,将自动启动过温保护,光输出平缓下降,可以在不影响用户体验的前提下保证产品不死灯。充分考虑到不同地区不同季节的实际照明环境,过温保护在35度环境温度下则不会启动。 得益于优秀的散热性能,飞利浦新一代商用LED PAR30射灯在外
[电源管理]
8x8LED点阵驱动方法(74HC595的使用)
前几天学了点阵的显示,今天按自己的思路来总结一下。首先介绍一下点阵的显示原理。点阵的电路图和之前学过的矩阵按键的电路图是相似的。每个灯就相当于坐标图中的一个点,具有唯一独特的坐标位置,这样就可以通过引脚的信号来控制每个灯的关和开col管脚连接的是P0的八个引脚,row管脚连接的是595的八位并行输出端。 实验中采取的是逐列显示,通过P0控制八列每列逐列显示,其间通过595位移缓存器控制每列要亮的led灯。 74HC595是串入并出带有锁存功能移位寄存器. 如图:形象来说,14引脚是搬运工,11是进厂守门员,12是出厂守门员,11出现上升沿时,从14引脚输入一位数据,一共重复八次12引脚上升沿时,将之前进来的八位数据分别从1
[单片机]
8x8<font color='red'>LED</font>点阵驱动方法(74HC595的使用)
废旧品利用,制作LED节能灯
  用一只易拉罐的球形罐底,用剪刀修圆,在上面钻出20个小孔,小孔的分布呈圆形,尽量制作得美观些,孔的大小以刚好能嵌入白光灯为度。每只白光灯的工作电压为3.0V~3.6V,4只白光灯串联组成一组,工作电压为12.0V~14.4V,5组白光灯再并联起来,在12.6V电压时的电流约等于100mA,消耗的功率1.26W。   要在220V市电工作,需要一个降压整流滤波电路,比较省钱的办法是使用废旧的节能灯控制电路。节能灯可以说是家家都有,因价值低,损坏后维修店不愿意修理,一般均作废弃处理,因此可以不花钱或只花上少量钱在废品站等地方得到。其实大多数损坏的节能灯只是灯管坏了,其电路往往完好可用,既使损坏了也容易修复。5W~13W节能灯基本上
[电源管理]
NO.9 矩阵键盘和MSP432实例——控制MSP开发板板载LED
  上一节我们介绍了矩阵键盘的具体原理,这次我们来将实际操作。   首先,在MSP432中,对于按键的输入就是检测端口的高低电平来判断矩阵键盘的按键情况。   首先我们打开CCS中的gpiointerrupt工程,打开syscfg文件,增加几个输入和输出GPIO口,如下:      其中CONFIG_GPIO_ABCD是属于检测我们矩阵键盘中ABCD的键值。CONFIG_GPIO_GREENBLUERED是属于控制我们开发板上的三色LED灯。   然后我们打开gpiointerrupt.c这个文件,开始我们核心函数的编写。   我们实验的内容是:通过矩阵键盘检测不同的键值ABCD亮不同颜色的灯。   像往常一样,我们要引入G
[单片机]
NO.9 矩阵键盘和MSP432实例——控制MSP开发板板载<font color='red'>LED</font>
LED灯泡拆解:究竟用了怎样的LED驱动?
LED灯泡的价格正在下降。一年前,你可能要花50美元购买相当于60W的飞利浦可调光式LED灯,而现在去百思买购买一个8W、800流明,相当于60W的自有品牌Insignia灯,只要17美元。LED灯泡设计究竟有哪些变化推动了价格的下降?拆解让我们能够一窥LED照明的设计趋势,例如LED在灯泡内如何放置的,以及采用了什么驱动器架构。 Insignia球形灯的外观和节能灯类似,增加了三个金属散热片,并且用塑料灯球替代了玻璃灯球(图1)。 灯泡的调光功能对美国市场来说是个相当重要的功能。我用过Lutron Maestro调光开关,配备了可编程的调光控制,并且和节能灯做了逐项的对比。Insignia调光一致且平滑,调光也类似于节能灯。
[电源管理]
<font color='red'>LED</font>灯泡拆解:究竟用了怎样的<font color='red'>LED</font>驱动?
LED的一次与二次光学设计
大功率LED照明零组件在成为照明产品前,一般要进行两次光学设计:一次光学设计是把LED IC封装成LED光电零组件时所进行的设计,以解决LED的出光角度、光强、光通量大小、光强分布、色温的范围与分布;二次光学设计是将经过一次透镜后的光再通过一个光学透镜改变它的光学性能。(二次光学设计是针对大功率LED照明来说的,一般大功率LED都有一次透镜,发光角度为120度左右。)   我们必须清醒的认识到,一次光学设计是二次光学设计的基础。只有一次光学设计封装合理,能够保证每个LED发光零组件的出光品质,才能在一次光学设计的基础上进行二次光学设计,以保证整个发光系统的出光品质。简单地说,一次光学设计的目的是尽可能多的取出LED芯片中发出的光;二
[模拟电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved