📄 embed.c
字号:
#include <AT89X52.H>
#include "intrins.h"
//#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
bit rbit;//接收到脉冲
uint Num_Of_Circle;
uint array[6]={1,2,3,4,5,6}; //显示数据存储区
uint display;
//阳极段码
uchar code SEGPOS[34]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
//"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" "-" "空" "0." "1." "2." "3.""4." "5.""6." "7.""8." "9.""A." "B.""C." "D.""E." "F."
//带点的比不带点的大18个位置
//阴极段码
uchar code SEGNEG[34]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00,0xBF,0x86,0xD4,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1};
//uchar code CON[6]={0x3E,0x3D,0x3B,0x37,0x2F,0x1F};//数据显示的位选信号00111110 到00011111
uchar code CON[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//数据显示的位选信号11111110 到11011111
uint code RED[29]={0xE200, //1
0xE210 , //2
0xE208 , //3
0xE218 , //4
0xE204 , //5
0xE214 , //6
0xE20C , //7
0xE21C , //8
0xE280, //9
0xE288 , //1-
0xE298 , //2-
0xE250 , //p v
0xE248 , //p ^
0xE244 , //v v
0xE254 , //v ^
0xE2C4 , //色度v
0xE2D4 , //色度^
0xE2CC , //亮度v
0xE2DC , //亮度^
0xE25C , //TV/AV
0xE2F8 , //TIM0xE
0xE2D8, //+
0xE2D0, //->。<-
0xE2E4 , //ON.T
0xE2F4, //S0xEL
0xE2E8 , //CLOCK
0xE2EC , //INC
0xE240 , //CLOSE
0xE24C , //QUITE
};//M50462AP编码 低电平340us ,‘0’高电平730us ,‘1’高电平1.8ms
uchar data inkey _at_ 0x30;//按键值
uchar data key_down _at_ 0x7E;//按键次数
uchar key;
char IRCODE[2];
void initial(void)
{
/*
//51系列的专用寄存器
PC ACC B(乘除法) PSW(CY,AC,F0,RS1,RS2,OV,P) DPTR(16位) SP SBUF
IE (EA,/,ET2,ES,ET1,EX1,ET0,EX0)
IP (/,/,/,PS,PT1,PX1,PT0,PX0) //"0"位优先级低
PCON //最高位控制波特率加倍
SCON (SM0,SM1,SM2,REN,TB8,RB8,TI,RI)//方式0是移位;方式
TCON (TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0)//IEx 外部中断请求;ITx 外中断请求触发方式(1是脉冲负跳,0是电平低);TFx 计数溢出
TMOD (GATE1,C/~T,M1,M0,GATE0,C/~T,M1,M0)//方式0是13位;方式1是16位;方式2自动重载;
T2CON (TF2,EXF2,RLCLK,TCLK,EXEN2,TR2,C/~T2,CP/~RL2)
RCLK+TCLK CP/~RL2 TR2 MODE
0 0 1 16位自动重载(定时器1串口)
0 1 1 16位捕捉(定时器1串口)
1 x 1 波特率发生器
x x 0 (不用)
T2MOD (....,T2OE,DCEN) DCEN上计数
//*/
//*
T2CON=0x30;//位C/T2(T2CON.1)必须清0,
T2MOD=0x02;//位T2OE(T2MOD.1)必须置1
SCON=0x50;//方式1(8位数据),可接收
PCON=0x00;//波特率不加倍
RCAP2L=0xB7;//时钟输出频率=晶振频率/{4 [65536-( RCAP2H,RCAP2L)]}
RCAP2H=0xFF;//定时器2编程时钟输出38K
//*/
inkey=0;key_down=0;
rbit=1;IRCODE[0]=0x00;IRCODE[1]=0x00;
Num_Of_Circle=0;display=0;
TMOD=0x21;//T1 计时(方式2自动重载),T0 计时(方式1), GATE C/~T M1 M0
TH0=0xFF; TL0=0x83;//500us
TH1=0xFD; TL1=0xFD;//2400bps 11.0592M时钟晶振
TR0=1; TR1=1; TR2 = 1;
ET0=1; ET1=0;
IT0 = 1; //INT0下降沿有效
EX0 = 1; //开INT0中断;
EX1=0;
ES=1;
EA=1;
}
void Delay(void)
{
uint TempCyc;
for (TempCyc=0; TempCyc<6; TempCyc++);//0.05ms 防抖动
}
void delay10ms(uint s)//100 == 1second
{
uint i;
while(s--)
{
for(i=0;i<255;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void getKey()
{
P3=P3|0xF0;
delay10ms(1);
key=P3&0xF0;
if(key!=0xF0 && key_down==0)
{
key_down+=1;
switch(key)
{
case 0x70:
inkey=1;
break;
case 0xB0:
inkey=2;
break;
case 0xD0:
inkey=3;
break;
case 0xE0:
inkey=4;
break;
default:
key_down=0;
break;
}
}
}
void show( uint bitCon,uint num)
{
uchar seg =SEGPOS[num];
P2=P2&0xC0;
P0=seg;
switch(bitCon)
{
case 0:
P2=P2|CON[0];
break;
case 1:
P2=P2|CON[1];
break;
case 2:
P2=P2|CON[2];
break;
case 3:
P2=P2|CON[3];
break;
case 4:
P2=P2|CON[4];
break;
case 5:
P2=P2|CON[5];
break;
}
}
uint READ(void)
{
uint i;
for(i=0;i<130;i++)
{
if(!P3_2) break;
}
if(i==130)
{
return 1;
}
else
{
return 0;
}
}
/*
void setplay(char h2bit ,char m2bit,char l2bit)
{
array[5]=h2bit/10%10;
array[4]=h2bit%10;
array[3]=m2bit/10%10;
array[2]=m2bit%10;
array[1]=l2bit/10%10;
array[0]=l2bit%10;
}
//*/
void setplay(char h2bit ,char m2bit,char l2bit)
{
array[5]=h2bit/10%10;
array[4]=h2bit%10;
array[3]=m2bit/10%10;
array[2]=m2bit%10;
array[1]=l2bit/10%10;
array[0]=l2bit%10;
}
void check()
{
uchar i,m,l;
uint temp1,temp2;
// setplay(10,3,7);
temp1=(uint)IRCODE[0]&0x00FF;
for(i=0;i<29;i++)
{
temp2=0x00FF&RED[i];
if(temp1==temp2)
{
m=i+1;
setplay(0,m,l);
}
}
}
void main()
{
uint LED=0xFF7F;
initial();
while(1)
{
getKey();//获得按键输入
if(key_down)
{
key_down=0;
P3_0=!P3_0;
}
/*
P1=LED;//7个跑马灯
LED=LED>>1;
if(!rbit)
P1=IRCODE[1];//7个跑马灯
//*/
/*
if(LED==0x01FE) // 0x01FE 0x00FF
{
LED=0xFF7F;
}
//*/
}
}
/*/////////////////////////////////////////////////////////////
各中断函数的具体处理
//*/
void TIME0() interrupt 1 //
{
TH0=0xF8; TL0=0xCC;//100usFFA4 1msFC66 2msF8CC 4msF199 5msEE00 10msDC00 40ms7000 2^16-XX*1000*0.9216
if(Num_Of_Circle ++==200)
{
if(!rbit)
check();
Num_Of_Circle=0;
rbit=1;
IRCODE[1]=0x00;
IRCODE[0]=0x00;
}
P2_7=!P2_7;
//动态显示四位数据
show(display,array[display]);
if(display==5)
{
display=0;
}
else
display +=1;
}
void TIME1() interrupt 3
{
}
void EX0INT() interrupt 0 //低电平340us ,‘0’高电平730us ,‘1’高电平1.8ms 11100010
{
uint i;
EX0=0;
if(rbit)
{
for(i=0;i<16;i++)
{
Delay();
if(!P3_2)
{
while(!P3_2) ;
if( READ())
{
switch(i)
{
case 0:
IRCODE[1]=IRCODE[1]|0x80;
break;
case 1:
IRCODE[1]=IRCODE[1]|0x40;
break;
case 2:
IRCODE[1]=IRCODE[1]|0x20;
break;
case 3:
IRCODE[1]=IRCODE[1]|0x10;
break;
case 4:
IRCODE[1]=IRCODE[1]|0x08;
break;
case 5:
IRCODE[1]=IRCODE[1]|0x04;
break;
case 6:
IRCODE[1]=IRCODE[1]|0x02;
break;
case 7:
IRCODE[1]=IRCODE[1]|0x01;
break;
case 8:
IRCODE[0]=IRCODE[0]|0x80;
break;
case 9:
IRCODE[0]=IRCODE[0]|0x40;
break;
case 10:
IRCODE[0]=IRCODE[0]|0x20;
break;
case 11:
IRCODE[0]=IRCODE[0]|0x10;
break;
case 12:
IRCODE[0]=IRCODE[0]|0x08;
break;
case 13:
IRCODE[0]=IRCODE[0]|0x04;
break;
case 14:
IRCODE[0]=IRCODE[0]|0x02;
break;
case 15:
IRCODE[0]=IRCODE[0]|0x01;
break;
}
}
}
while(P3_2) ;//等下一位
}
SBUF=IRCODE[0];
P1=IRCODE[1];
rbit=0;
}
EX0=1;
}
void EX1INT() interrupt 2
{
}
void SERIAL() interrupt 4
{
uchar temp;
//*
if(TI)
TI=0;
if(RI)
{
RI=0;
temp=SBUF;
SBUF=temp;
}
//*/
}
///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -