📄 lhj.c
字号:
#include <reg52.h>
#include <intrins.h>
#define W24C02 0xA0
#define R24C02 0xA1
#define MSB 0x80
#define LSB 0x01
/********************/
sbit SDA=P3^6;
sbit SCL=P3^7;
sbit hwx=P3^3;
sbit SPK=P3^4;
sbit JDQ=P3^5;
sbit SCL2=P1^3;
sbit SDA2=P1^4;
sbit CS2=P1^6;
sbit RST = P1^5;// DS1302片选 5脚
void ReadKey(void); //扫描键盘 返回键值
void leday(void); //5个空指令
void delay(void);
void display(unsigned char *lp,unsigned char lc);
void displaystr(unsigned char *lp,unsigned char lc);
unsigned char l_key=0xFF;
unsigned char l_keytmp=0;
unsigned char l_cmenu=0;
void _24c02menu(void);
void _24c02wdate(unsigned char tmp);
void I2C_write(unsigned char tmp);
unsigned char I2C_read();
void I2C_ACK(bit tmp);
void I2C_start(void);
void I2C_stop(void);
unsigned char l_address=0;
void ad0831menu(void);
unsigned char ad0831read(void);
unsigned char l_cad8031menu=0;
void ds1302menu(void);
unsigned char l_cds1302menu=0;
void ds1302play(unsigned char tmp);
void hongwai(void);
void jdq(void);
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);//read RTC
void Set_RTC(void);//set RTC
unsigned char l_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0};
unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0};
unsigned char l_lhj[66];
unsigned char l_lhjc=0;
unsigned char l_timer=3;
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char LHJ[3]={0x38,0x76,0x0e};
code unsigned char _24C02[5]={0x5b,0x66,0x39,0x3f,0x5b};
code unsigned char AD0831[6]={0x77,0x5e,0x3f,0x7f,0x4f,0x06};
code unsigned char DS1302[6]={0x5e,0x6d,0x06,0x4f,0x3f,0x5b};
code unsigned char JDQSTR[3]={0x0e,0x5e,0x67};
code unsigned char ON[2]={0x3f,0x37};
code unsigned char OFF[3]={0x3f,0x71,0x71};
code unsigned char Wdate[5]={0x1c,0x5e,0x77,0x31,0x79};
code unsigned char Rdate[5]={0x77,0x5e,0x77,0x31,0x79};
code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
//共阴数码管 0-9 - 空 表
/********************/
//==================================键盘程序
code unsigned char key_tab[17]={0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};
//=============
void main(void)
{
Set_RTC();
RST=0;
EA=1; //开启总中断
EX0=1; //开启外部中断 0
EX1=1;
IT1=1;
IT0=1; // 设置成 下降沿触发方式
RI=1;
RCAP2L = 0xD8;
RCAP2H = 0xFF;
TL2=0XD8;
TH2=0XFF;
T2CON=0X34;
SCON=0X50;
ES=1;
P0=0xf0;
while(1)
{
displaystr(LHJ,3); //主菜单显示LHJ,等待按键
if (l_key==0x0E){
P2=0;
l_key=0xff;
l_cmenu=0;
while (1){
if(l_key==0x0c){
l_key=0xff;
break;
}
switch(l_cmenu){
case 0:displaystr(_24C02,5);break;
case 1:displaystr(AD0831,6);break;
case 2:displaystr(DS1302,6);break;
case 3:displaystr(JDQSTR,3);break;
}
switch(l_key){
case 0x0a: //按A或B键,显示不同采单内容
l_key=0xff;
if(l_cmenu>0)
l_cmenu--;
break;
case 0x0b:
l_key=0xff;
if (l_cmenu<3)
l_cmenu++;
break;
case 0x0e:
l_key=0xff;
switch(l_cmenu){
case 0: l_address=0;_24c02menu();break; //相应的内容调用相应函数
case 1: ad0831menu();break;
case 2: ds1302menu();break;
case 3: jdq();break;
}
break;
}
}
}
}
}
void ReadKey(void) //读键盘值
{
unsigned char i,j,key;
j=0xfe;
key=0xff;
for (i=0;i<4;i++){
P0=j;
//leday();
if ((P0&0xf0)!=0xf0){
key=P0;
break;
}
j=_crol_(j,1);
}
if (key==0xff){
l_keytmp=0xff;
//l_key=0xff;
P0=0xf0;
EX0=1;
SPK=1;
return;
}
SPK=0;
if(l_keytmp==key){
TH0=0X2E;
TL0=0;
TR0=1;
return;
}
TH0=0X2E;
TL0=0;
TR0=1;
l_keytmp=key;
for(i=0;i<17;i++){
if (key==key_tab[i]){
l_key=i;
break;
}
}
}
void key_scan() interrupt 0 //外部中断 0 的优先级最高
{
EX0=0;
TMOD&=0XF1;
TH0=0X00;
TL0=0X00;
ET0=1;
TR0=1;
}
void hongwai(void) interrupt 2 //外部中断 1 做为红外线接收
{
unsigned char i,j,tmp;
unsigned int tmp2;
//EX1=0;
hwx=1;
j=33;
i=0;
tmp2=0;
while(!hwx){
tmp2++;
if(tmp2==1000)
break;
}
if(tmp2<1000){
EX1=1;
return;
}
P2=0x76;
while(j){
tmp=0;
l_lhj[i]=1;
while(!hwx){
l_lhj[i]++;
delay();
tmp++;
if(tmp==250)
break;
}
i++;
tmp=0;
l_lhj[i]=1;
while(hwx){
l_lhj[i]++;
delay();
tmp++;
if(tmp==250)
break;
}
i++;
j--;
}
l_lhj[0]+=170; //补回在刚开始接收时作判断失去的时间,是为了可以在电脑上显示接近正确波形
i=255;
while(i){
tmp=255;
while(tmp){
tmp--;
}
i--;
}
//IE1=0;
//EX1=1;
}
void timer0_isr(void) interrupt 1
{
TR0=0;
ReadKey();
}
void timer0_isr1(void) interrupt 3 //定时器2,我们用来输出二极管发光,不同的数据输出各种花样
{ //本程序针对24C02读出的数据进行64个数据循规蹈矩环输出
//TL1=0x01;
//TH1=0x01;
//TR1=1;
TF1=0;
if(l_tmpdate[2]>4){
l_tmpdate[2]=0;
if(l_tmpdate[0]==0){
P2=~l_lhj[l_tmpdate[1]];
l_tmpdate[1]++;
if(l_tmpdate[1]==64)
l_tmpdate[1]=0;
}
l_tmpdate[0]++;
if(l_tmpdate[0]>=l_timer)
l_tmpdate[0]=0;
}
l_tmpdate[2]++;
//ET1=0;
//display(l_lhj,8);
}
void com_isr(void) interrupt 4 //串口中断,与电脑连接,处理相应指令
{
unsigned char i,j,tmp;
if(RI!=1)
return;
RI=0;
tmp=SBUF;
if(tmp==0X01){//LED8
Read_RTC();
SBUF=0X01;
while(!TI){}
TI=0; //
for(i=0;i<7;i++){
SBUF=l_tmpdate[i];
while(!TI){}
TI=0;
}
return;
}
if((tmp&0xf0)==0x10){//读端口
switch(tmp&0x0f){
case 0:i=P0;break; //P0
case 1:i=P1;break; //P1
case 2:i=P2;break; //P2
case 3:i=P3;break; //P3
}
SBUF=0X10;
while(!TI){}
TI=0; //
SBUF=i;
while(!TI){}
TI=0;
return;
}
if((tmp&0xf0)==0x20){//写端口
ES=0;
SBUF=0X20;
while(!TI){}
TI=0; //
while(!RI){}
RI=0;
i=SBUF;
switch(tmp&0x07){
case 0:P0=i;break; //P0
case 1:P1=i;break; //P1
case 2:P2=i;break; //P2
case 3:P3=i;break; //P3
}
SBUF=0Xff;
while(!TI){}
TI=0; //
ES=1;
return;
}
if((tmp&0xf0)==0x30){//读24CX
switch(tmp&0x0f){
case 0:break;//24c01
case 1: //24c02
SBUF=0X30;
while(!TI){}
TI=0; //
I2C_start();
I2C_write(W24C02);
I2C_ACK(0);
I2C_write(0);
I2C_ACK(1);
I2C_stop();
I2C_start();
I2C_write(R24C02);
for(i=0;i<32;i++){
for(tmp=0;tmp<8;tmp++){
I2C_ACK(0);
SBUF=I2C_read();
while(!TI){}
TI=0;
}
}
I2C_ACK(1);
I2C_stop();
break;
}
return;
}
if((tmp&0xf0)==0x40){//写24CX
ES=0;
switch(tmp&0x0f){
case 0:break;
case 1:
for(i=0;i<32;i++){
SBUF=0X40;
while(!TI){}
TI=0;
for(j=0;j<8;j++){
while(!RI){}
RI=0;
l_tmpdate[j]=SBUF;
}
I2C_start();
I2C_write(W24C02);
I2C_ACK(0);
I2C_write(i*8);
for(j=0;j<8;j++){
I2C_ACK(0);
I2C_write(l_tmpdate[j]);
}
I2C_ACK(1);
I2C_stop();
leday();
leday();
leday();
leday();
leday();
}
SBUF=0X41;
while(!TI){}
TI=0;
break;
}
ES=1;
return;
}
if((tmp&0xf0)==0x50){//读AD0831
SBUF=0X50;
while(!TI){}
TI=0; //
SBUF=ad0831read();
while(!TI){}
TI=0;
return;
}
if((tmp&0xf0)==0x60){//红外线
SBUF=0x60;
while(!TI){}
TI=0;
if(l_lhj[0]==0){
SBUF=0X01;
while(!TI){}
TI=0;
return;
}
for (i=0;i<66;i++){
SBUF=l_lhj[i];
while(!TI){}
TI=0;
}
l_lhj[0]=0;
return;
}
}
void leday(void) //空5个指令
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void delay(void)
{
unsigned char i=13;
while(i)
i--;
}
void display(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i;
P2=0;
P1=P1&0xF8;
for(i=0;i<lc;i++){
P2=table[lp[i]];
delay();
P2=0;
if(i==7)
break;
P1++;
}
}
void displaystr(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i;
P2=0;
P1=P1&0xF8;
for(i=0;i<lc;i++){
P2=lp[i];
delay();
P2=0;
if(i==7)
break;
P1++;
}
}
void _24c02menu(void) //进入24C02菜单的操作,256字节分四段读取每段64字节(因89S52的RAM有限,
//所以我们只能用到64个RAM空间),按A键或B键来选择哪一段
{ //读取某一段的数据后,我们启动定时器2做相应处理
unsigned char i,j,tmp=0;
P2=0;
l_key=0xfe;
while (1){
if(l_key==0x0c){
l_key=0xff;
TR1=0;
ET1=0;
break;
}
switch(l_key){
case 0x0a:
l_key=0xff;
if(tmp>0){
tmp--;
l_key=0xfe;
}
break;
case 0x0b:
l_key=0xff;
if(tmp<3){
tmp++;
l_key=0xfe;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -