📄 dig_func.c
字号:
#include "c8051f020.h"
#include "lcd.h"
#include "digital_radio.h"
//#include "string.h"
#define T_3MS 0xf533 //定时器延时3ms(system clock=22118400/2,定时器12分频)
#define T_0_8MS 0xfd1f //定时器延时0.8ms(system clock=22118400/2,定时器12分频)
#define CONFIG_2614 0x8300
sbit CLK_2614 = P2^0;
sbit DATA_2614 = P2^1;
sbit EN_2614 = P2^2;
extern unsigned char code tble[10]={48,49,50,51,52,53,54,55,56,57};//0-9 ascii code
static bit Head_ok=0,Got=0; //head_ok=1:帧头正确,got=1:收齐四字节
static unsigned char val[4]=0;//四字节的红外键值
void Timer3_Init()
{
TMR3CN &=0xfb; //关定时器3
TMR3RL = T_3MS; //延时3ms
TMR3 = T_3MS;
}
unsigned char Wait_infrared()
{
unsigned char keyvalue;
while(!Got);
if(val[2]+val[3]==0xff)
keyvalue=val[2];
Got=0;
return(keyvalue);
}
/*即时输出并取出按键的实值*/
/* void Get_Letter(unsigned char x,unsigned char y,unsigned char *letter)
{
unsigned char m,ascii,temp;
unsigned char *let=letter;
for(m=0;m<7;m++) letter[m]=0;
clear1line(x);
LCD_Goto(x,y);
Delay1us(40);
for(m=0;m<5;m++)
{
temp=Wait_infrared();
ascii=tbel[temp];
if(temp==0x15)
{
clear1line(x);
let-=1;
*let='\0';
LCD_Printf(x, y,letter);
}
else if(temp==0x14)
{
*let='\0';
break;
}
else if(ascii!=0x21)
{
clear1line(x);
*let=ascii;
LCD_Printf(x, y,letter); //向LCD发送
let++;
}
}
} */
void One_float_Dis(unsigned char x,unsigned char y,float flt_data)
{
unsigned char dec_data,dec[3],dp_data,i,temp_dec;
temp_dec=dec_data=(unsigned char)flt_data;
for(i=0;i<3;i++)
{
dec[2-i]=dec_data%10;
dec_data=dec_data/10;
}
if(dec_data<100) i=1;
else i=0;
LCD_Goto(x,y);
for(;i<3;i++) LCD_WriteData(tble[dec[i]]);
Delay1us(40);
LCD_WriteData(0x2e);
dp_data=(unsigned char)((flt_data-temp_dec+0.01)*10);
LCD_WriteData(tble[dp_data]);
}
void clear1line(unsigned char j)
{
unsigned char i;
LCD_Goto(j,1);
for(i=0;i<16;i++) LCD_WriteData(0x20);
Delay1ms(1);
}
void Radio_Send(unsigned int num)
{
unsigned int conf=CONFIG_2614;
unsigned char i,j,d;
bit flag=0;
CLK_2614=EN_2614=1;
DATA_2614=1;
for(d=0;d<200;d++) conf=num;
for(j=0;j<2;j++)
{
for(i=0;i<32;i++)
{
CLK_2614=~CLK_2614;
if(flag==0)
{
DATA_2614=0x0001&conf;
conf=conf>>1;
}
for(d=0;d<200;d++);
flag=~flag;
}
conf=CONFIG_2614;
}
for(d=0;d<100;d++);
EN_2614=0;
for(d=0;d<200;d++) conf=CONFIG_2614;
}
void ex_interrupt() interrupt 19 //下降沿中断,收到低电平开始
{
if(!Head_ok)
{
EIE2&=0xdf;//关中断7
P3IF&=0x7f;//清中断7的中断标志
Timer3_Init();//定时器3初始化
TMR3CN|=0x04; //开定时器3
}
else
{
while(P37==0&&TMR3CN<0x80); //等待变高
if(TMR3CN<0x80)
{
P3IF&=0x7f;//清中断7的中断标志
TMR3 = T_0_8MS;//延时0.8ms
TMR3CN|=0x04; //开定时器3
}
}
}
void T3_inter() interrupt 14
{
static unsigned char i=0,n=0;
static bit h=0;
unsigned int v;
TMR3CN&=0x7f; //清中断标志
if(Head_ok==0&&h==0&&P37==0) h=1; //开始后第一个3ms处应为低
else if(Head_ok==0&&h==1&&P37==1) // 开始后第二个3ms处应为高
{
EIE2|=0x20; //开中断7
TMR3CN&=0xfb; //关定时器3
h=0;Head_ok=1;return;
}
else if(Head_ok)
{
TMR3CN&=0xfb; //关定时器3
n=i++/8;
if(P37) //每0.8ms读一次数据
{
val[n]=val[n]>>1;
val[n]|=0x80;
}
else
val[n]=val[n]>>1;
// n=++i/8;
if(i==32)
{
i=0;n=0;Head_ok=0;
EIE2&=0xdf;//关中断7
for(v=0;v<60000;v++); //避开重复码
EIE2|=0x20; //开中断7
Got=1;
}
}
else //还原为最原始状态
{
EIE2|=0x20;//开中断7
Timer3_Init();
h=0;Got=0;Head_ok=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -