⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic16f73.c

📁 这是一个关于PIC单片机控制数码管和走时功能的C语言程序
💻 C
字号:
/***********************************************/
/*            A11H 手控板程序                 */
/***********************************************/
#include <pic16f7x.h>
#define UCHAR unsigned char
UCHAR KeySwapTask,nCurKeyValue,nPreKeyValue;
UCHAR temp1,temp2;
bit Sound_flag,KeyOff_flag,KeySendflag;           //定义标志位;
void Delay_ms(UCHAR nTimeValue);                  //延时子程序;
char keyscan();                                   //扫描子程序;
char keyserve();                                  //按键识别服务子程序;
void Initial_USART();                             //USART异步发送、接收初始化;
void tmint();                                     //定时器初始化;
/***********************************************/
    /*            中断程序                 */
/***********************************************/
  void interrupt low_isr()
{
   if(RCIF==1)
  {
   RCIF=0;
   
  }
}
/***************************************************/
     /*           主程序                    */
/***************************************************/
  main()
{  
ADCON1=0x06;                                      //PORTA端口设置为数字I/O;
TRISA=TRISA&0xc0;                                 //RA5设置为输出状态; 
TRISB=0xff;
RA5=0;
OPTION=0x8d;                                      //INT下降沿中断,分频为1:32 分配给WDT;
asm("clrwdt");
POR=1;	
BOR=1;                                            //上电复位后置1,在掉电锁定复位后软件置1;
Initial_USART();                                  //USART异步发送、接收初始化;
tmint();
INTCON=0x00;
PIE1=0;
PIE2=0;
PIR1=0;	                                          //清中断标志;
PIR2=0;                                           //清中断标志;
TMR1ON=1;                                         //开启定时器1;
     while(1)
   {
	  asm("clrwdt");
	   if(TMR1IF==1)
	 {
		 TMR1IF=0;
	     TMR1H=0xB1;
	     TMR1L=0xE0;                    //定时时间为20ms ,晶振为4.000M;
	     switch(KeySwapTask)
	   {
		 case 0:
		        keyscan();             //扫描按键;
		        if(nCurKeyValue!=0)    //检测按键是否按下;
		        KeySwapTask=1;          
 		         break;
 		 case 1:                       //去抖延时20ms;
	            keyscan();             //重新扫描按键; 
                if(nCurKeyValue!=0)    //检测按键是否按下;
		       {
			    KeySwapTask=2;         
			    nPreKeyValue=nCurKeyValue;
			    KeyOff_flag=0;         //有键按下标志;
			    KeySendflag=1;         //发送键值标志位置1;
			    }       
			    else KeySwapTask=0;    //否则为干扰;
 		         break;
 	     case 2:                       //检测按键是否松开;
 	            keyscan();             //重新扫描按键;
 	           if(nCurKeyValue==0)     //检测按键是否松开;
 	             KeySwapTask=3;
 	             break; 
 	     case 3:                       //松开延时20ms去抖动;
 	            keyscan();             //重新扫描按键;
 	           if(nCurKeyValue==0)     //检测按键是否松开;
		      {
			     KeySwapTask=4;         
		          Sound_flag=1;
		          KeyOff_flag=1;       //建立发声与按键松开标志位;
		          if(Sound_flag)
		           RA5=1;
		      }
 		         break;
 		 case 4:                       //发声延时20ms;
 		         KeySwapTask=0;
 		         Sound_flag=0;
 		         RA5=0;                //停止发声;
 		         break;
 		 default: KeySwapTask=0;
 		          break;
 	   }       
 	      if(KeySendflag)
 	    {   
	 	   KeySendflag=0;                     
          TXREG=nCurKeyValue;          //发出一个字符;
          TXEN=1;                      //启动发送允许;
           while(1)
          {
	       asm("clrwdt");
           if(TXIF==1) break;                                                 
          }                            //等待写入完成;
           TXEN=0;
        }                              //发送完成,准备送LCD显示键值功能;   
      }
    }
 }

  char keyscan()
{
   TRISB=0xff;
   TRISC=TRISC&0xf0;                  //设置C端口低四位为输出;
   PORTC=PORTC&0xf0;                  //低四位清0;
   asm("nop");
   asm("nop");
  temp1=PORTB;                        //读B口;
  if(temp1!=0xff)                     //判断B口是否有低电平出现,有则表示有键按下;
    keyserve();
  else nCurKeyValue=0;
 return(nCurKeyValue);
}

  char keyserve()
 {
 	int i,j;
 	switch(temp1)                     //读出列码;
  {
 	case 0xfe: j=1;
 		      break;
 	case 0xfd: j=2;
 			  break;
 	case 0xfb: j=3;
 		      break;
    case 0xf7: j=4;
 		      break;
 	case 0xef: j=5;
 		      break;
 	case 0xdf: j=6;
 	          break;
    case 0xbf: j=7;
 		      break;
 	case 0x7f: j=8;
 		      break;
  }
  TRISB=TRISB&0x00;                   //读出行码;
  TRISC=TRISC|0x0f;
  PORTB=temp1;
  asm("nop");
  asm("nop");
  temp2=PORTC;
  temp2=temp2&0x0f;                   //屏蔽掉高四位;
  switch(temp2)
 { 
  case 0x0e: i=0;
 			break;
  case 0x0d: i=1;
 			break;
  case 0x0b: i=2;
 			break;
  case 0x07: i=3;
 			break;
 }
   nCurKeyValue=8*i+j;                //赋予键码;
   return(nCurKeyValue);
}

 void Initial_USART()                 //USART异步发送,接收初始化;
{
  TXSTA=0x04;                         //选择异步高速方式传输8位数据;
 RCSTA=0x80;                          //允许串行口工作使能;
 TRISC=TRISC|0x80;                    //PIC16F73:将RC7(RX)设置为输入方式;
 TRISC=TRISC&0xbf;                    //RC6(TX)设置为输出;
 SPBRG=25;                            //4M晶振,波特率9600;
  TXIE=0;                             //禁止发送中断使能;
  RCIE=0;                             //RCIE=0,接收不使能;
}

//延时--以1ms为单位--晶体振荡(4.0MHz)
void Delay_ms(UCHAR nTimeValue)
{
	UCHAR i;
	while(nTimeValue--)
	{
		for(i=0;i<50;i++)
		{
			asm("nop");asm("nop");asm("nop");asm("nop");
			asm("nop");asm("nop");asm("nop");asm("nop");
			asm("nop");asm("nop");asm("nop");asm("nop");
			asm("nop");asm("nop");asm("nop");asm("nop");
			asm("nop");asm("nop");	
		}	
	}
}

void tmint()
{
    T1CON=0x00; //关闭TMR1定时器,预分频比1:1;
	TMR1H=0xB1;
	TMR1L=0xE0; //定时时间为20ms ,晶振为4.000M;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -