#include "SC92F732X_C.H"
#define uchar unsigned char
#define uint unsigned int
#define ul unsigned long
///引脚
#define mosout P00 //输出引脚
#define baiout P11
#define lvout_510r P17
#define huangout_510r P27
#define hongout P24
#define usbfout P12
#define led P26
#define on P13
#define vin P10
#define CLK P02
#define DATA_1 P01
#define CKSHX P05
#define hwpin P16
#define vbatt 0x41
#define v1 0x40
// 变量定义
bit ON_OFF,bi;
bit irpro_ok,irok,jsok;
uint sleep_data;
uchar bb,hs,h,ied;
ul v1_add,v1_data;
ul vb_add,vb_data;
uchar irtime,irdet;
uchar kehuh,kehul,keyma,keyfanma;
uchar keydata,jsokadd;
///
unsigned char IRcord[4];
unsigned char irdata[33];
/
unsigned char const code shuma[] =
{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};// 0--9 //
上电初始化程序
void mcu_init(void)
{
/* 初始化I/O口 */
P0CON =0xff; // 0为输入,1为输出
P0PH=0; // 1有效
P0 =0;
P1CON = 0x86;
P1PH=0x48;
P1 = 0x49;
P2CON = 0xf0;
P2PH=0;
P2 = 0;
/*初始化AD*/
ADCCFG1 = 0; // AIN8通道开关 //
ADCCFG0 = 0x3;
ADCCON = 0;
/打开外部中断
EA=1;
EINT0=0;
IPINT0=0;
INT0F=0;
INT0R=0;
EINT1=1;
INT1F=0x4; //INT12
INT1R=0;
IP1=0x8;
/打开定时器
ET0=1; //**** T0使能
TMCON=0; //*****频率来自FSYS/12(系统时钟) 12M
TMOD=0x1A; //****8位自动重装定时器,溢出时将TH0的值自动装入TL0
TR0=1; //*****定时器1的开始计数
TL0=0;
TH0=156; //256-120
//AD参考电压2.4
OPINX=0xC2;
OPREG=0X80;
// 初始化变量
}
//
void waibu12_int(void) interrupt 2
{
irdet=irtime;
irtime=0;
if((irdet<140)&&(irdet>=130))//引导码 TC9012的头码,9ms+4.5ms
{
ied=0;
jsok=1;
}
if(irdet>160)//引导码大于16MS
{
irdet=0;
ied=0;
jsok=0;
}
if(jsok)
{
irdata[ied]=irdet;//存储每个电平的持续时间,用于以后判断是0还是1
ied++;
if(ied>=33)
{
irok=1;
ied=0;
jsok=0;
}
}
}
定时中断
void time_int(void) interrupt 1
{
irtime++; //用于计数2个下降沿之间的时间
/*if(irtime>250)
{
irtime=0;
} */
//************************************
}
/
unsigned int ad_conver(uchar ad_pin)
{
uint ad_res_data,ad_h,ad_l;
uchar as;
ADCCON=0x80;
ad_h=0;ad_l=0;
ADCCON|=ad_pin; //ADCS=1; 00001000 on ad
while(!(ADCCON&0x10)){as=0;}
ad_l=ADCVL;
ad_h=ADCVH;
ad_h<<=4;
ad_l>>=4;
ad_res_data=ad_h|ad_l;
ADCCON=0;
return(ad_res_data);
}
///
void dalay_1(uint yanshi)
{
uint sb;
for(sb=0;sb
}
/IO口组合
void in_74ls595(uchar p)
{
uchar id;
for(id=0;id<8;id++)
{
if(p&0x80){DATA_1=1;}
else{DATA_1=0;}
CLK=0;
CLK=1;
p<<=1;
}
}
//
void led_display(uint display_data )
{
uchar qian,bai,shi,ge;
qian=display_data/1000;
bai=(display_data%1000)/100;
shi=(display_data%100)/10;
ge=display_data%10;
//************************************************扫描
if(qian==0){in_74ls595(0);}
else{in_74ls595(shuma[qian]);}
in_74ls595(0x10);
CKSHX=1;
dalay_1(5);
CKSHX=0;
dalay_1(100);
in_74ls595(0);
in_74ls595(0);
CKSHX=1;
dalay_1(3);
CKSHX=0;
dalay_1(3);
if((qian==0)&&(bai==0)){in_74ls595(0);}
else{in_74ls595(shuma[bai]);}
in_74ls595(0x20);
CKSHX=1;
dalay_1(5);
CKSHX=0;
dalay_1(100);
in_74ls595(0);
in_74ls595(0);
CKSHX=1;
dalay_1(3);
CKSHX=0;
dalay_1(3);
if((qian==0)&&(bai==0)&&(shi==0)){in_74ls595(0);}
else{in_74ls595(shuma[shi]);}
in_74ls595(0x40);
CKSHX=1;
dalay_1(5);
CKSHX=0;
dalay_1(100);
in_74ls595(0);
in_74ls595(0);
CKSHX=1;
dalay_1(3);
CKSHX=0;
dalay_1(3);
in_74ls595(shuma[ge]);
in_74ls595(0x80);
CKSHX=1;
dalay_1(5);
CKSHX=0;
dalay_1(100);
in_74ls595(0);
in_74ls595(0);
CKSHX=1;
dalay_1(3);
CKSHX=0;
dalay_1(3);
}
//
void ledoff_display()
{
//************************************************扫描
in_74ls595(0);
in_74ls595(0);
CKSHX=1;
dalay_1(3);
CKSHX=0;
dalay_1(400);
}
///
void key_in()
{
//*********************************************开关键
if(!on)
{
bb++;
if((bb>100)&&bi&&(!on))
{
bb=0;
ON_OFF=!ON_OFF;
bi=0;
}
}
else
{
bi=1;
bb=0;
}
//********************************************遥控功能键
}
/
void vbat_in()
{
h++;
vb_add+=ad_conver(vbatt);
if(h>=200)
{
h=0;
vb_data=vb_add/200;
vb_add=0;
}
}
/
void v1_in()
{
hs++;
v1_add+=ad_conver(v1);
if(hs>=200)
{
hs=0;
v1_data=v1_add/200;
v1_add=0;
}
}
// //红外码值处理
void Ircordpro(void)//红外码值处理函数
{
uchar i, j, k,value;
uchar cord;
k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>20)高电平2.25MS,低电平1.125MS
{
value|=0x80;
}
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
//
void Ir_work(void)
{
kehuh=IRcord[0];
kehul=IRcord[1];
keyma=IRcord[2];
keyfanma=IRcord[3];
if(keyma||keyfanma==255)
{
keydata=keyma;
}
}
//
void main(void)
{
mcu_init();
while(1)
{
v1_in();
vbat_in();
key_in();
//************************
if(irok) //如果接收好了进行红外处理
{
irok=0;
Ircordpro();
}
if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
irpro_ok=0;
Ir_work();
}
if(jsok)
{
jsokadd++;
if(jsokadd>250)
{
jsokadd=0;
jsok=0;
}
}
else
{
jsokadd=0;
}
//*********************
if(ON_OFF)
{
if(irok) //如果接收好了进行红外处理
{
irok=0;
Ircordpro();
}
if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
irpro_ok=0;
Ir_work();
}
led_display(keydata);
led=irok;
}
else
{
ledoff_display();
keydata=0;
led=0;
}
}
}