📄 main1.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 + -