?? lhj.c
字號:
#include <reg51.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=10;
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;
TL2C=0XD8;
TH2C=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;
//EX1=0;
hwx=1;
j=33;
i=0;
tmp=100;
while(tmp){
tmp--;
}
if(hwx){
EX1=1;
return;
}
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--;
}
i=255;
while(i){
tmp=255;
while(tmp){
P2=0XF0;
tmp--;
}
i--;
}
i=255;
while(i){
tmp=255;
while(tmp){
P2=0XF0;
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:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -