📄 iremote_ir._c
字号:
//ICC-AVR application builder : 2008-10-29 9:40:16
// Target : T13
// Crystal: 9.6000Mhz
#include <iot13v.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define WDR() asm("wdr")
#define SEI() asm("sei")
#define CLI() asm("cli")
#define NOP() asm("nop")
#define SBIT(val, bitn) (val|=(1<<(bitn)))//置位
#define CBIT(val, bitn) (val&=~(1<<(bitn)))//清位
#define FBIT(val, bitn) (val^=(1<<bitn)) //位取反
#define PW_ON SBIT(PORTB,4)
#define PW_OFF CBIT(PORTB,4)
#define IR_ON SBIT(PORTB,0)
#define IR_OFF CBIT(PORTB,0)
uchar time_10ms;
uchar User_ID[7],pw_off_ram;
//===========================================
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void){
TCNT0 = 0xA3; //reload counter value
time_10ms++;
}
uchar EEPROM_read(uchar Addr){
while(EECR & (1<<EEWE));//等待上一次写操作结束
EEARL = Addr;//设置地址寄存器
EECR |= (1<<EERE);//设置EERE 以启动读操作
return EEDR;//自数据寄存器返回数据
}
void EEPROM_write(uchar Addr,uchar ucdata){
while(EECR & (1<<EEWE));//等待上一次写操作结束
EEAR = Addr;//设置地址和数据寄存器
EEDR = ucdata;
EECR=0b00000100;//置位EEMWE
EECR=0b00000110;//置位EEWE 以启动写操作
// EECR |= (1<<EEMWE);//置位EEMWE
// EECR |= (1<<EEWE);//置位EEWE 以启动写操作
}
void delay_500us(void){
uchar ii;
for(ii=0;ii<250;ii++){//500us/0.10417us=4799.88
WDR();NOP();NOP();NOP();NOP();NOP();NOP();
NOP();NOP();NOP();NOP();NOP();NOP();NOP();
NOP();NOP();NOP();NOP();NOP();
}
}
void ir_500us(void){
uchar ii,kk;
ii=0;
do{
IR_ON; //38Khz=26.3us 占空比=1/3 9.6MHz晶振时=0.10417时钟周期指令
for(kk=0;kk<20;kk++);
IR_OFF;
for(kk=0;kk<39;kk++);
ii++;
}while(ii<16);
}
void send_code(void){
uchar ii,kk,nn,mm;
for(ii=0;ii<10;ii++){
ir_500us();//2.00ms+0.50ms开始码
ir_500us();
ir_500us();
ir_500us();
delay_500us();
for(mm=0;mm<7;mm++){
kk=User_ID[mm];
for(nn=0;nn<8;nn++){
if(!(kk&0x80)){
ir_500us();//0.50ms+0.50ms逻辑低
delay_500us();
}
else{
ir_500us();//1.00ms+0.50ms逻辑高
ir_500us();
delay_500us();
}
kk<<=1;
}
}
}
ir_500us();//0.50ms结束码
}
void main(void){
uchar temp1,temp2,temp5;
uint temp3,temp4;
ulong ID;
EECR=0;
while(pw_off_ram==0xaa){
DDRB = 0b11010111;
PW_OFF;WDR();
}
MCUSR=0;
WDTCR=0x1f;
WDTCR=0x0f;//WD=2Second
OCR0A = 0x5D;
OCR0B = 0x5D;
TCNT0 = 0xA3; //set count
TCCR0A = 0x00;
TCCR0B = 0x05; //start timer
TIMSK0 = 0x02;
SEI();
PORTB = 0b11111000;
DDRB = 0b11010111;
time_10ms=0;temp1=0;temp2=0;
do{
if(temp1!=time_10ms){
temp1=time_10ms;
if((PINB&0x08)==0){
temp2++;
}
}
}while(time_10ms<10);
User_ID[0]=EEPROM_read(0x10);
User_ID[1]=EEPROM_read(0x11);
User_ID[2]=EEPROM_read(0x12);
User_ID[3]=EEPROM_read(0x13);
User_ID[4]=EEPROM_read(0x14);
User_ID[5]=EEPROM_read(0x15);
EEPROM_read(0x38);
EEPROM_read(0x39);
if(temp2>5){
temp3=User_ID[2];
temp3<<=8;
temp3|=User_ID[3];
temp4=User_ID[4];
temp4<<=8;
temp4|=User_ID[5];
ID=temp3;
ID<<=16;
ID|=temp4;
time_10ms=0;temp1=0;temp2=0;temp5=0;
do{
WDR();
if(temp1!=time_10ms){
temp1=time_10ms;
if((PINB&0x08)==0){
time_10ms=0;
temp2++;temp5=0;
if(temp2>150)temp2=200;
}
else{
temp5++;
if(temp5>10)break;
}
}
User_ID[2]++;
ID++;
}while(time_10ms<200);
TCCR0B=0;
TIMSK0=0;
CLI();
if(temp2>150){
temp4=ID;
temp3=ID>>16;
User_ID[3]=temp3;
User_ID[2]=(temp3>>8)+User_ID[2];
User_ID[5]=temp4;
User_ID[4]=temp4>>8;
if(pw_off_ram!=0xaa){
EEPROM_write(0x12,User_ID[2]);
EEPROM_write(0x13,User_ID[3]);
EEPROM_write(0x14,User_ID[4]);
EEPROM_write(0x15,User_ID[5]);
EEPROM_write(0x38,0x55);
EEPROM_write(0x39,0xaa);
temp2=0;
for(temp1=0;temp1<6;temp1++){
temp2+=User_ID[temp1];
}
User_ID[6]=temp2;
send_code();
}
}
}
else{
TCCR0B=0;
TIMSK0=0;
CLI();
temp2=0;
for(temp1=0;temp1<6;temp1++){
temp2+=User_ID[temp1];
}
User_ID[6]=temp2;
send_code();
}
while(1){
pw_off_ram=0xaa;//写入防重复RESET误写码
PW_OFF;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -