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

📄 main1.c

📁 433M收发,内有PCB(用99打开),源程序ICC打开,用了IC发送和三极管两种,接收用RX3310
💻 C
字号:
  /********************************************************/
/*         			ABOL      			  				*/
/*                868MHZ数码管显示接收器   				*/
/*     作者:于朝晖     2008-5-24 9:30:00  				*/
/*     目标MCU:MEGA48  晶振:INT RC 8MHZ  				*/
/* 文件名称:main.c  主函数								*/
/* 编译:ICC-AVR application builder					*/
/* 当前版本: 1.0										*/
/* 修改日期: 2008.5.24									*/
/********************************************************/

#include <iom88v.h>
#include <macros.h>
#include "eeprom.h"  
#include "delay.h"			 
#include "main.h"	
#include "init.h"
#include "key.h"
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long
#define bitset(var, bitno) ((var) |= (1 << (bitno)))
#define bitclr(var, bitno) ((var) &= ~(1 << (bitno)))
	



void init_pin(void)
{
flag=0;
flagl=0;
flagh &=~BIT(0); 
}
//发送一个字节至TM1620
void indat(unsigned char data)
{
unsigned char i; 
CLR_STB;	  //将STB至低,等待CLK为低
for(i=0;i<8;i++)
{
CLR_CLK;	  //CLK为低
 if((data&0x01)!=0)
  {
  SET_DIN;	  //数据I位为1
  }	
  else 
  {
  CLR_DIN;//数据I位为0 
  }
 SET_CLK;	   //CLK为高
 data>>=1;
 }
}

void display (unsigned char disa)
{
unsigned char i; 
SET_DIN;
SET_CLK;
SET_STB;
indat(0x02);

}
//显示初始化
void init_tm1620 (void)
{  
unsigned char i;
//TM1620模式设定 
SET_STB;
indat(0x02);
SET_STB;
//数据写设定
indat(0x40);	
SET_STB;
//地址模式设定
indat(0xc0);
SET_STB;
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
indat(0x3f);
//开显示
SET_STB;
indat(0x8f);
}
//数据刷新
void tm1620 (void)
{  
unsigned char i;
//TM1620模式设定 
SET_STB;
//地址模式设定
indat(0xc0);
SET_STB;
  WDR();
if((flagh&0x04)==0)
	{
	indat(0x3f);
	indat(dipdata[0]); 
	indat(0x06);
	indat(dipdata[1]); 
	indat(0x5b);
	indat(dipdata[2]);
	indat(0x4f);
	indat(dipdata[3]);
	indat(0x66);
	indat(dipdata[4]);  
	indat(0x6d);
	indat(dipdata[5]);
	SET_STB;
	}
else			   //开了闪烁位的显示
    { 
	indat(0x3f);
	if(D1FC==0)
	   { 
	   indat(dipdata[0]);
	   indat(0x06);
	   indat(dipdata[1]);
	   indat(0x5b);
	   indat(dipdata[2]); 
	   }
	else
	   {  
	   indat(0);
	   indat(0);
	   indat(0);
	   indat(0);
	   indat(0);
       }
	indat(0x4f);
	if(D3FC==0) indat(dipdata[3]);
	else  indat(0);
	indat(0x66);
	if(D4FC==0) indat(dipdata[4]);
	else  indat(0);
	indat(0x6d);
	if(D5FC==0) indat(dipdata[5]);
	else  indat(0);
	SET_STB;
	}
}
/*比较接收到的代码在EEPORM的位置
  有记录反回地址,没有反回FF*/
unsigned char code_comp (void)
{ 
unsigned char i,j=0,a,b;
for(i=0;i<100;i++)
{
  WDR();
j=i*4;                      //每个ID用两个记录地址,两个记录编号
a=EEPROM_read(j);
j++;
b=EEPROM_read(j);
j++;
if((a==data[0])&&(b==data[1]))
   {
   addr=i;
   break;
  }
  else
    { 
    addr=0xff;

	}
}
    return(addr); 
}  

void lookup_led(unsigned char j)
   {
   unsigned char a,b;
   WDR();
   j=(j*4)+2;
   a=EEPROM_read(j);	   
   j++;
   b=EEPROM_read(j);
   j++;
   d3=a;
   d4=(b&0xf0)>>4;
   d5=(b&0x0f);
   if(d3<10) dipdata[3]=diptable[d3];
   else 
   {dipdata[3]=diptable[0];d3=0;}
   if(d4<10) dipdata[4]=diptable[d4];
   else 
   {dipdata[4]=diptable[0];d4=0;}
   if(d5<10)  dipdata[5]=diptable[d5];
   else 
   {dipdata[5]=diptable[0];d5=0;}
   }
//设定模式
void set_led(void)
{
unsigned char i,j,a,b,c,d=0;
sec=30;
flagh &=~0x01; 
dipdata[0]=diptable[0];		//在上一行显示记忆体位置
dipdata[1]=diptable[0]; 
dipdata[2]=diptable[0];
lookup_led(d);			 //下一行显示门牌号

D1FC=1;
		while(!(PIND&0x80)) 
		{
		WDR(); 
		}
while(!(flagh&0x01))
  {
  WDR();
  i=key_1();
  if(i==1)			  //设置闪烁位
     {
	  WDR();
	 sec=30;
	 if((D3FC!=0)&&(D4FC!=0)&&(D5FC!=0))
	     {
		 D3FC=0;
		 D4FC=0;
		 D5FC=0;
		 flagh |=0x01;
		 goto exit_1;
		 }
	 if(D1FC!=0)	 
	     {
	 	 D1FC=0;
	 	 D3FC=1;
		 goto exit_1;
		 }
	 if(D3FC!=0)
	     {
		 D3FC=0;
		 D4FC=1;
		 goto exit_1;
		 }
	 if(D4FC!=0)
	     {
		 D4FC=0;
		 D5FC=1;
		 goto exit_1;
		 }
	 if(D5FC!=0)
	     {
		 D5FC=1;
		 D4FC=1;
		 D3FC=1; 
		 DECODER_FLAG_L;
		 goto exit_1;
		 }
	exit_1:;
	 }
   if(key_2())			   //闪烁数据加一
     {	
	    sec=30;
	    if(D1FC!=0)
		   {
		   if(d<99) d++;	 //转成BCD到显示
		   dipdata[1]=diptable[(d/10)];
		   dipdata[2]=diptable[d%10];
		   lookup_led(d);
		   if((d3==0)&&(d4==0)&&(d5==0)) //未用过的EEPROM
		      {	  
			  EEPROM_write((d*4)+2,0);
			  EEPROM_write((d*4)+3,0);
			  }
		   }
		if((D3FC!=0)&&(D4FC==0))
		   {
		   if(d3<9) d3++;
		   dipdata[3]=diptable[d3];
		   EEPROM_write((d*4)+2,d3); 
		   } 
		if((D4FC!=0)&&(D5FC==0))
		   {
		   if(d4<9) d4++;
		   dipdata[4]=diptable[d4];
		   j=((d4<<4)+d5);
		   EEPROM_write((d*4)+3,j); 
		   }
		if((D5FC!=0)&&(D4FC==0))
		   {
		   if(d5<9) d5++;
		   dipdata[5]=diptable[d5];
		   j=((d4<<4)+d5);
		   EEPROM_write((d*4)+3,j); 
		   }
	 }
	if(key_3())		 //闪烁数据减一
	  {	
	    sec=30;
	    if(D1FC!=0)
		   {
		   if(d!=0) d--;	 //转成BCD到显示
		   dipdata[1]=diptable[(d/10)];
		   dipdata[2]=diptable[d%10];
		   lookup_led(d);
		   }
		if((D3FC!=0)&&(D4FC==0))
		   {
		   if(d3!=0) d3--;	 
		   dipdata[3]=diptable[d3];
		   EEPROM_write((d*4)+2,d3); 
		   }
		if((D4FC!=0)&&(D5FC==0))
		   {
		   if(d4!=0) d4--;
		   dipdata[4]=diptable[d4];
		   j=((d4<<4)+d5);
		   EEPROM_write((d*4)+3,d4); 
		   }
		if((D5FC!=0)&&(D4FC==0))
		   {
		   if(d5!=0) d5--;
		   dipdata[5]=diptable[d5];
		   j=((d4<<4)+d5);
		   EEPROM_write((d*4)+3,d5); 
		   }
	  }
	if((D3FC!=0)&&(D4FC!=0)&&(D5FC!=0))
	     {
		  if((flag&0x04)!=0)
		     {
			 j=code_comp();
			 if(j<100)			 //代码存在,显示代码位置,响三下表示学习不成功
			 		{
			 		 SPFC=3;
					 d=j;
					 dipdata[0]=diptable[0];
					 dipdata[1]=diptable[(d/10)];
		   	 	  	 dipdata[2]=diptable[d%10];
			   	  	 lookup_led(d);
					 D1FC=1;
					 D3FC=0;
			 		 D4FC=0;
			 		 D5FC=0;
			 		}
			 else
			     {
			 	 EEPROM_write(d*4,eaddr0);		   //写入EEPROM
			 	 EEPROM_write((d*4)+1,eaddr1); 
			 	 DECODER_FLAG_L;
			 	 SPFC=1;
		   	 	 if(d<99)
			          { 
			 	  	  d++;	 //转成BCD到显示
		   	 	  	  dipdata[1]=diptable[(d/10)];
		   	 	  	  dipdata[2]=diptable[d%10];
			   	  	  lookup_led(d);
		   		  	  if((d3==0)&&(d4==0)&&(d5==0)) //未用过的EEPROM写0
		              		{	  
			  		 		EEPROM_write((d*4)+2,0);
			  		 		EEPROM_write((d*4)+3,0);
			  		  		}
				      }
			 		  else  flagh |=0x01;
			 		  D3FC=1;
			 		  D4FC=0;
			 		  D5FC=0;
			 	 }
			 }
		 }
  }
  dipdata[0]=0;	  //退出设定时全部清空,不显示
  dipdata[1]=0;
  dipdata[2]=0;
  dipdata[3]=0;
  dipdata[4]=0;
  dipdata[5]=0;
  dipdata[5]|=0x80;  //电源LED
  D1FC=0;
  D3FC=0;
  D4FC=0;
  D5FC=0;
}

void main(void)
{//m
unit tr,ar;	 
//EEPROM_read(0xff);       //校正振荡频率
//OSCCAL=EEDR; 
bitset(PORTD,0);
delay(60);	
init_devices();
init_tm1620();
dipdata[5]|=0x80;	//电源LED
delay(600);
sec=3;
flagh &=~0x01;	  
while(1)	 //
{//1		  
  WDR();
   if((flag&0x04)!=0)
     {	 
     ar=code_comp(); //对照地址
	 if(ar<100)
	    {
		if(!(data[2]&0x40))
		  {
		   if((datas[0]!=data[0])||(datas[1]!=data[1]))
  		       {
			   j=(ar*4)+2;
   			   ar=EEPROM_read(j);
   			   j++;
   			   tr=EEPROM_read(j);
			   datas[6]=datas[4];	//移动存贮号码
   			   datas[7]=datas[5]; 
			   
   			   datas[4]=datas[2];	
			   datas[5]=datas[3];
			   
   			   datas[2]=datas[0]; 
   			   datas[3]=datas[1];
			   
			   datas[0]=data[0];
   			   datas[1]=data[1]; 
			   
   			   dipdata[0]=dipdata[3];
   			   dipdata[1]=dipdata[4]; 
   			   dipdata[2]=dipdata[5];
			   dipdata[2]&=~0x80;
			   
   			   dipdata[3]=diptable[ar];
   			   ar=(tr&0xf0)>>4;
   			   dipdata[4]=diptable[ar];
   			   ar=(tr&0x0f);
   			   dipdata[5]=diptable[ar];
			   dipdata[5]|=0x80;  //电源LED	
			   if((data[2]&0x80))
			      {
				  dipdata[3]|=0x80;  //发射电源低LED	
				  }
			   sec=6;			 //显示6秒后刷新
	 		   flagh &=~0x01;
			   dipcount=3;
			   SPFC=5; 
    		   }
			}
			else 	  //按了清除键
			{
			 if((datas[0]==data[0])&&(datas[1]==data[1])) 
			     {
				 datas[0]=datas[1]=0;
				 dipdata[3]=dipdata[4]=dipdata[5]=0;
				 }	
			 if((datas[2]==data[0])&&(datas[3]==data[1])) 
			     {
				 datas[2]=datas[3]=0;
				 }
			 if((datas[4]==data[0])&&(datas[5]==data[1])) 
			     {
				 datas[4]=datas[5]=0;
				 }
			 if((datas[6]==data[0])&&(datas[7]==data[1])) 
			     {
				 datas[6]=datas[7]=0;
				 }
			 if((datas[6]==0)&&(datas[5]==0)&&(datas[4]==0)&&(datas[3]==0)&&(datas[2]==0)&&(datas[1]==0)&&(datas[0]==0))
			     {
				 dipdata[0]=dipdata[1]=dipdata[2]=0;
				 }
				 SPFC=1;
			}
		dipdata[5]|=0x80;	  //电源LED
	 	DECODER_FLAG_L; 
	 	}
	 }
   tr=key_1();
   if(tr==2)
     {
	 set_led();
	 }
 	 //被挤出的三个号码在上一层数码管显示 三秒一次更新
   if(flagh&0x01)
     {
	 sec=3;
	 flagh &=~0x01;
	 switch(dipcount)  //显示计数器
	      {
		   case 1:	if((datas[6]!=0)||(datas[7]!=0)) //没有数据不替换显示
		   				{
						data[0]=datas[6];
   			   			data[1]=datas[7];
						ar=code_comp(); //对照地址
						if(ar<100)
						{
			   			j=(ar*4)+2;
   			   			ar=EEPROM_read(j);
   			   			j++;
   			   			tr=EEPROM_read(j);
   			   			dipdata[0]=diptable[ar];
   			   			ar=(tr&0xf0)>>4;
   			   			dipdata[1]=diptable[ar];
   			   			ar=(tr&0x0f);
   			   			dipdata[2]=diptable[ar];
						dipdata[0]|=0x80;
						dipdata[1]&=~0x80;
						dipdata[2]&=~0x80;
						}
						}
						else flagh |=BIT(0);
					dipcount=2;
					break;
		   case 2:	if((datas[4]!=0)||(datas[5]!=0)) //没有数据不替换显示
		   				{
						data[0]=datas[4];
   			   			data[1]=datas[5];
						ar=code_comp(); //对照地址 
						if(ar<100)
						{
			   			j=(ar*4)+2;
   			   			ar=EEPROM_read(j);
   			   			j++;
   			   			tr=EEPROM_read(j);
   			   			dipdata[0]=diptable[ar];
   			   			ar=(tr&0xf0)>>4;
   			   			dipdata[1]=diptable[ar];
   			   			ar=(tr&0x0f);
   			   			dipdata[2]=diptable[ar];
						dipdata[1]|=0x80;
						dipdata[2]&=~0x80;
						dipdata[0]&=~0x80;
						}
						}
						else flagh |=BIT(0);
					dipcount=3;
					break;
		   case 3:	if((datas[2]!=0)||(datas[3]!=0)) //没有数据不替换显示
		   				{
						data[0]=datas[2];
   			   			data[1]=datas[3];
						ar=code_comp(); //对照地址
						if(ar<100)
						{
			   			j=(ar*4)+2;
   			   			ar=EEPROM_read(j);
   			   			j++;
   			   			tr=EEPROM_read(j);
   			   			dipdata[0]=diptable[ar];
   			   			ar=(tr&0xf0)>>4;
   			   			dipdata[1]=diptable[ar];
   			   			ar=(tr&0x0f);
   			   			dipdata[2]=diptable[ar];
						dipdata[2]|=0x80;
						dipdata[1]&=~0x80;
						dipdata[0]&=~0x80;
						}
						}
						else flagh |=BIT(0);
					dipcount=1;
					break;		
		   default:break;
		  } 
	 }
}//1
}//m

⌨️ 快捷键说明

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