마이크로 컨트롤러와 DS18B20은 LCD1602를 사용하여 c 프로그램을 표시합니다.
/*main.c? 직접 참조하시겠습니까?
#include
#include"DS18B20_3.H" p>
p>
#define?uint?unsigned?int
#define?uchar?unsigned?char
uchar?a,miao,shi,fen, ri,yue,nian ,week,flag,key1n,temp;
//flag는 헤더 파일의 온도 값을 읽고 온도 값을 표시하는 데 사용됩니다.
#define? yh?0x80?// LCD1602 문자 주소의 첫 번째 비트인 D7이 항상 1(100000000=80)이기 때문에 LCD 첫 번째 줄의 초기 위치입니다.
#define?er?0x80 +0x40?//LCD의 두 번째 줄의 초기 위치(두 번째 줄의 첫 번째 문자 위치의 주소가 0x40이기 때문)
//LCD 화면 사이의 핀 연결 정의 및 C51(디스플레이 데이터 라인은 C51의 P0 포트에 연결됨)
sbit? rs=P2^0;
sbit?en=P2^2;
sbit?rw=P2^1;?//rw가 하드웨어에 기반을 두고 있다면 이 문장을 쓸 필요가 없고 뒤에 rw=0이 있습니다
sbit?led=P2^ 6;?//LCD 백라이트 스위치
//DS1302 클록 칩과 C51 사이의 핀 연결 정의
sbit?IO=P1^1;
sbit? SCLK=P1^0;
sbit?RST=P1^2;
sbit?ACC0=ACC^0;
sbit?ACC7=ACC^7 ;
/******************** *********************** *******************
ACC 누산기=A
ACC.0=E0H?
ACC.0은 ACC의 0번째 비트입니다. Acc는 비트 주소 지정이 가능합니다.
누산기 ACC는 데이터를 저장하는 데 사용되는 8비트 저장 장치입니다. 하지만 이 저장 장치는 특별한 지위를 가지고 있습니다.
마이크로 컨트롤러에서 매우 중요한 장치이며 많은 작업이 ACC를 통해 수행되어야 합니다. 나중에 명령어를 학습할 때
A는 누산기를 나타내는 데 자주 사용됩니다. 그러나 몇 가지 예외가 있습니다. 예를 들어 PUSH 명령에는 ACC와 같은 이름을 사용해야 합니다.
일반적으로 A는 누산기의 내용을 나타내고 ACC는 누산기의 주소를 나타냅니다.
?
****************************************** *********************/
//시간 조정 버튼과 C51 사이의 핀 연결 정의
sbit? key1=P1^5;//키 설정
sbit?key2=P1^6;//키 추가
sbit?key3=P1^7;//마이너스 키
p>sbit?buzzer=P1^3;//트랜지스터 9012에 의해 구동되는 버저, 포트 소리가 낮음
/************* ******* ******************************************* ******/
uchar?code?tab1[]={"20--?"};//연도에 표시되는 고정 문자
uchar?code? tab2[]={": :"};//시간 표시를 위한 고정 문자
//지연 함수, 종종 나중에 호출됨
void?delay(uint?xms)// 매개변수가 있는 지연 함수 Function
{ uint?x,y; for(x=xms;x>0;x--)
for(y=110;y>0 ;y--) ;
}
/********LCD 쓰기 명령 기능 및 데이터 쓰기 기능을 호출할 수 있습니다******** ** 향후 ***/
/*본 프로그램에서는 DS1302의 함수에서 액정 쓰기에 관련된 기능을 호출하므로 액정 프로그램을 앞에 배치해야 합니다*/
write_1602com(uchar ?com)//****LCD 쓰기 명령 기능****
{ rs=0;//데이터/명령 선택이 명령 rw로 설정됩니다. =0;?//읽기 및 쓰기 선택이 설정되었습니다. 쓰기 위해 P0=com;//데이터 전송 지연(1); en=1;//유효한 하강 에지 지연(1)을 준비하기 위해 활성화 단자를 높게 당깁니다. en=0;//en은 high에서 high로 낮아지고 하강 에지가 생성되며 LCD는 명령을 실행합니다.
}
write_1602dat(uchar?dat)// ***LCD 데이터 쓰기 기능****
{ rs=1;//데이터/명령 선택이 데이터 rw=0으로 설정됩니다.?//읽기 및 쓰기 선택이 쓰기로 설정됩니다. P0= dat;//데이터 전송 지연(1); en=1;?// en은 하강 에지에 대비하여 높은 수준으로 설정됩니다. 지연(1) en=0;?//en은 높은 수준에서 낮은 수준으로 변경됩니다. 하강 에지 및 액정은 명령을 실행합니다.
}
lcd_init()//***LCD 초기화 기능****
{ write_1602com (0x38);//LCD 작업 모드 설정, 의미: 16*2 라인 디스플레이, 5*7 도트 매트릭스, 8비트 데이터 write_1602com(0x0c);//커서를 표시하지 않고 디스플레이 열기 write_1602com(0x06);/ /전체 화면이 움직이지 않고 커서가 자동으로 오른쪽으로 이동합니다. write_1602com(0x01);//표시 지우기 write_1602com(yh+1);// 달력 표시의 고정 기호는 첫 번째 줄의 첫 번째 위치부터 시작됩니다. . for(a=0;a<14;a++) { write_1602dat(tab1[a]);//달력 표시의 고정 기호 부분을 LCD 화면에 씁니다.// Delay(3) } write_1602com(er+2 );//시간은 두 번째 위치부터 시작하여 고정 기호 쓰기 위치를 표시합니다 for (a=0;a<8;a++) { write_1602dat(tab2[a] );//표시 시간 고정 기호 쓰기, 콜론 2개 //지연(3) }
}
/**************** *********ov
어************************/
/**************** **DS1302 관련 하위 기능**********************/
void?write_byte(uchar?dat)//바이트 쓰기
p>{ ACC=dat; for(a=8;a>0;a--) {
IO=ACC0;
SCLK=0 ;
SCLK=1;
ACC=ACC>>1 }
}
uchar?read_byte()//읽기 1바이트
{ RST=1; for(a=8;a>0;a--) {
ACC7=IO;
SCLK=1 ;
p>
SCLK=0;
ACC=ACC>>1; } return?(ACC);
}
//--- ------------------------
void?write_1302(uchar? add,uchar?dat)//1302 칩에 쓰기 함수, 쓰기 주소, 데이터 지정
{ RST=0 write_byte; ); write_byte(dat); SCLK=0;
}
uchar?read_1302(uchar?add)//1302에서 데이터 읽기 기능, 읽기 데이터 지정 소스 주소
{ RST=0; RST=1(add); RST=0;
}
uchar?BCD_Decimal(uchar?bcd)//십진수 함수에 대한 BCD 코드, BCD 입력, 십진수 반환
{ uchar?Decimal= bcd>>4; return( Decimal=Decimal*1(bcd&=0x0F));
}
//------------- ------------- -----
void?ds1302_init()?//1302 칩 초기화 하위 -함수 (2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);?// 쓰기를 허용하고 쓰기 방지를 비활성화하시겠습니까?
//write_1302(0x80,0x00);?//두 번째 쓰기 레지스터에 초기 두 번째 데이터 00을 쓰시겠습니까? DS1302의 80H
//write_1302( 0x82,0x00);//DS1302 내부 쓰기 분 레지스터에 초기 분 데이터 00 쓰기
//write_1302(0x84,0x12);/ /DS1302 내부 쓰기 주 레지스터 84H 12에 초기 시간 데이터 쓰기
//write_1302(0x8a,0x04);//DS1302 내부 쓰기 주 레지스터 8aH에 초기 주 데이터 4 쓰기
//write_1302(0x86,0x07);// DS1302의 내부 쓰기 날짜 레지스터 86H에 초기 날짜 데이터 07을 씁니다.
//write_1302(0x88,0x01);//초기 월을 DS1302의 내부 쓰기 날짜 레지스터에 씁니다. DS1302의 내부 쓰기 월 레지스터 88H
데이터 01
//write_1302(0x8c,0x10);//DS1302 내부 쓰기 연도 레지스터 8cH에 초기 연도 데이터 10 쓰기
write_1302(0x8e,0x80);?// 회전 쓰기 방지 시
}
//------------------ --- ------
//온도 표시 하위 기능
void?write_temp(uchar?add,uchar?dat)//온도 데이터를 LCD에 쓰고 표시 위치 지정
{ uchar?gw,sw; gw=dat%10;//1자리 숫자 가져오기 sw=dat/10;//10자리 숫자 가져오기 write_1602com(er+add);/ /er는 헤더입니다. 파일에 지정된 값은 0x80x40입니다. write_1602dat(0x3sw);//숫자 +30은 숫자의 LCD1602 디스플레이 코드를 가져옵니다. write_1602dat(0x3gw);//숫자 +30은 숫자의 LCD1602 디스플레이 코드 write_1602dat(0xdf); //온도를 표시하는 작은 원 기호, 0xdf는 LCD 문자 라이브러리에 있는 이 기호의 주소 코드입니다. write_1602dat(0x43);?//"C" 기호를 표시합니다. , 0x43은 LCD 문자 라이브러리의 대문자 C의 주소 코드입니다.
}
//------ -------------
//시, 분, 초 표시 하위 기능
void?write_sfm(uchar?add,uchar?dat)//디스플레이 위치 추가 및 현재 데이터, 두 개의 매개변수를 사용하여 시간, 분, 초를 LCD에 기록합니다.
{ uchar?gw,sw= dat%10;//1의 자리를 가져옵니다 sw=dat/10;//10의 자리를 가져옵니다 write_1602com(er+add);//er 헤더 파일에 지정된 값입니다 0x80x40 write_1602dat(0x3sw) ;//숫자 +30은 숫자의 LCD1602 디스플레이 코드를 가져옵니다. write_1602dat(0x3gw);//숫자 +30은 숫자의 LCD1602 디스플레이 코드를 가져옵니다.
}
//-----------------------
//연월일 표시 하위 기능
void?write_nyr(uchar?add,uchar?dat)//연월일을 LCD에 쓰고, 위치 addend를 표시합니다. , 표시 데이터, 두 개의 매개변수
{ uchar?gw,sw,sw=dat%10;//한자리 숫자 가져오기 sw=dat/10;//십자리 숫자 가져오기 write_1602com(yh+add) ;//디스플레이 위치를 첫 번째 위치로 설정 +add write_1602dat(0x3sw);//숫자 +30은 숫자의 LCD1602 디스플레이 코드를 얻습니다. write_1602dat(0x3gw);//숫자 +30은 LCD1602를 얻습니다. 숫자 표시 코드
}
//---------------------------- ------ ------------
void?write_week(uchar?week)//쓰기 주 함수
{ write_1602com(yh+ 0x0c);//주 문자 표시 위치 switch(week) {
case?1:write_1602dat('M');//주 번호가 1일 때 표시
write_1602dat('O');
write_1602dat('N');
break;
case?2:write_1602dat('T');//주 데이터가 2일 때 표시
write_1602dat('U');
write_1602dat('E') ;
break;
case?3:write_1602dat('W');//주 데이터가 3일 때 표시
write_1602dat('E') ;
write_1602dat('D');
break;
case?4:write_1602dat('T');//주 데이터는 4입니다. 표시됨 p>
write_1602dat('H');
write_1602dat('U');
break;
case?5:write_1602dat ('F');//주 데이터가 5일 때 표시됨
write_1602dat('R');
write_1602dat('I');
break;
break;
write_1602dat('I');
break;
p>case?6:write_1602dat(' S');//주 데이터가 6일 때 표시
write_1602dat('T');
write_1602dat('A' );
break;
case?7:write_1602dat('S');//주 데이터가 7일 때 표시
write_1602dat('U') ;
write_1602dat( 'N');
break;
}
}
//* ********** *****키보드 스캔 관련 기능************************
void?keyscan()
{ if(key1==0)//---------------key1은 기능키(설정키)------ ------- ------ { 지연(9);//지터를 제거하는 데 사용되는 지연 if(key1==0)//지연 후 키 누름을 다시 확인합니다.{
buzzer=0;// 부저는 짧게 한 번 울립니다.
buzzer=1; while(!key1); if(key1n= =9)
key1n=1;//초, 분, 시간, 요일, 일, 월, 연도, 반환, 8개 기능 루프를 포함하여 키 *** 설정 switch(key1n) { case?1 :?TR0=0; //타이머 끄기//TR1=0; write_1602com(er+0x09);//버튼을 한 번 누르도록 설정하면 커서가 두 번째 위치에 표시됩니다.
write_1602com(0x0f) ;// 커서를 플래시로 설정
temp=(miao)/10*16+(miao)%10; //두 번째 데이터가 DS1302에 기록됩니다.
write_1302(0x8e, 0x00); p>
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);
break; (er+6) ;//fen을 두 번 눌러 커서를 표시합니다. //write_1602com(0x0f); break; case?3:?write_1602com(er+3);//3번 누르기, shi //write_1602com(0x0f); break; case? 4:?write_1602com(yh+0x0e);//주에 4번 누르기 //
write_1602com(0x0f); break; case?5:?write_1602com(yh+0);//5번 누르기, ri //write_1602com(0x0f) break; 6번, yue //write_1602com(0x0f); break; case?7:?write_1602com(yh+0x04);//7번 누르기, nian //write_1602com(0x0f) break; //8번째 누르기, 커서가 깜박이지 않도록 설정 TR0=1;//타이머 열기 temp=(miao)/10*16+(miao)%10 write_1302(0x8e,0x00); 0x00|temp);//miao 데이터는 DS1302 write_1302(0x8e,0x80)에 기록됩니다.
break;? } } }
//------- - ---------키2 추가------------ -- -- if(key1n!=0)//아래 key1을 눌렀을 때.
다음 키를 다시 누르는 경우에만 작동합니다(키 누름 횟수가 0이 아닙니다) { if(key2==0)//키 조정 { 지연(10);
buzzer=0;/ /부저가 짧게 한 번 울립니다.
delay(20);
buzzer=1; while(!key2); ) { case?1:miao++;//설정 키를 한 번 누르고 초를 조정합니다. if(miao==60)
miao=0;//초가 59를 초과하면 1을 더해 재설정합니다. 0으로 write_sfm(0x08,miao);//LCD 디스플레이를 올바른 위치에 설정된 초에 "더하기" 설정합니다. temp=(miao)/10*16+(miao)%10;//10진수를 필요한 DCB 코드로 변환합니다. DS1302
write_1302(0x8e, 0x00);?//쓰기는 허용되지만 쓰기 금지는 금지됩니까?
write_1302(0x80,temp);?//조정된 두 번째 데이터 BCD 쓰기 DS1302의 쓰기 두 번째 레지스터 80H에 대한 코드
write_1302(0x8e,0x80);?//쓰기 보호 열기 write_1602com(er+0x09);//LCD 설정 모드는 자동으로 이동하는 것이므로 데이터를 쓴 후 오른쪽으로 커서를 이동해야 하므로 return //write_1602com(0x0b ) break; if(fen==60)
write_sfm(0x05; ,fen);//LCD가 올바른 위치에 "plus" 설정을 표시하도록 합니다. 포인트 데이터 temp=(fen)/10*16+(fen)%10;//10진수를 DS1302에 필요한 DCB 코드로 변환
write_1302(0x8e,0x00);//쓰기 허용, 쓰기 금지 금지 ?
write_1302(0x82,temp);//조정된 하위 데이터 BCD 코드를 쓰기 하위 레지스터에 씁니다. DS1302의 82H
write_1302(0x8e,0x80);//쓰기 보호 열기 write_1602com(er+6);//LCD 모드가 데이터 쓰기로 설정되어 있기 때문에 포인터가 자동으로 1씩 증가합니다. break; case?3:shi++; if(shi==24)
shi=0;//LCD에 "+"를 표시합니다. 올바른 위치에 시간 데이터 설정 temp=(shi)/10*16+(shi)% 10;//10진수를 DS1302에 필요한 DCB 코드로 변환
write_1302(0x8e,0x00);//허용 쓰기, 쓰기 금지를 금지하시겠습니까?
write_1302(0x84,temp);/ /조정된 시간 데이터 BCD 코드를 DS1302의 쓰기 시간 레지스터 84H에 쓰기
write_1302(0x8e,0x80) ;//쓰기 방지 쓰기_1602com(er+3);//LCD의 모드가 설정되어 있기 때문에 데이터를 쓴 후 포인터가 자동으로 1씩 증가하므로 커서는 break를 반환해야 합니다. case?4:week++; week==8)
week=1;
write_1602com (yh+0x0C);//'추가' 후 주간 데이터 표시 위치 지정
write_week (주);//주간 데이터 표시 내용 지정
temp=(week)/ 10*16+(week)%10;//DS1302에서 요구하는 DCB 코드로 소수점 변환
write_1302(0x8e,0x00);//쓰기 허용, 쓰기 금지 금지?
write_1302(0x8a,temp);//DS1302 내부 쓰기 주 레지스터에 쓰기 8aH
조정된 주간 데이터 BCD 코드를 입력하세요
write_1302(0x8e,0x80);//쓰기 방지 켜기
write_1602com(yh+0x0e);//LCD 설정 모드이기 때문에 is write 데이터를 입력하면 포인터가 자동으로 1씩 증가하므로 커서는 break를 반환해야 합니다. case?5:ri++ if(ri==32)
ri=1; ri);//LCD에 올바른 위치에 설정된 날짜 데이터를 "더하기" 표시합니다. temp=(ri)/10*16+(ri)%10;//10진수를 DS1302에서 요구하는 DCB 코드로 변환
write_1302( 0x8e,0x00);//쓰기 허용, 쓰기 금지 금지
write_1302(0x86,temp);//조정된 날짜 데이터 BCD 코드를 쓰기 날짜 레지스터 86H에 씁니다. DS1302
write_1302(0x8e,0x80);//쓰기 방지 켜기 write_1602com(yh+10);//LCD 설정 모드는 데이터를 쓴 후 자동으로 하나를 추가하는 것이므로 커서는 break; case?6: yue++; if(yue==13)
yue=1; write_nyr(6,yue);//LCD에 "플러스" 세트 월 데이터가 표시되도록 합니다. 올바른 위치 temp=(yue) /10*16+(yue)%10;//10진수를 DS1302에 필요한 DCB 코드로 변환
write_1302(0x8e,0x00);//쓰기 허용, 쓰기 금지 금지
write_1302(0x88,temp);//조정된 월 데이터 BCD 코드를 DS1302의 쓰기 월 레지스터 88H에 씁니다.
write_1302(0x8e,0x80);//쓰기 켜기 protection write_1602com(yh+7) ;//LCD 설정 모드는 데이터를 쓴 후 자동으로 포인터를 1씩 증가시키는 것이므로 커서를 반환해야 합니다. break case?7:nian++ if(nian==100; ) nian=0; write_nyr(3,nian); //LCD에 "+" 설정 연도 데이터가 올바른 위치에 표시되도록 합니다.
temp=(nian)/10*16+(nian)% 10;//DS1302 코드에 필요한 DCB로 10진수 변환
write_1302(0x8e,0x00);//쓰기 허용, 쓰기 금지 금지
write_1302(0x8c,temp);// 연도 데이터의 DS1302 BCD 코드에 조정 연도 레지스터 8cH 쓰기
write_1302(0x8e,0x80);//쓰기 방지 열기 write_1602com(yh+4);//LCD 모드가 데이터 쓰기로 설정되어 있기 때문 , 포인터가 자동으로 1씩 증가하므로 커서를 반환해야 합니다. break } } } //------마이너스 키 key3, '추가 키'를 참조하세요. ' 각 문장 함수에 대한 설명--------- ------- if(key3==0) { 지연(10);//지연 조정 및 지터 제거 if(key3==0) {
buzzer=0;//Buzzer 부저가 짧게 한 번 울립니다.
delay(20);
buzzer=1 while(!key3); ) {
case?1: miao--;
if(miao==-1) miao=59;//두 번째 데이터가 -1로 감소하면 자동으로 59 write_sfm(0x08,miao);//LCD의 올바른 위치에서 변경 후 새로운 시간(초)을 표시합니다.
temp=(miao)/10*16+(miao)%10;/ /DS1302에 필요한 10진수를 DC로 변환
B 코드
write_1302(0x8e,0x00);?//쓰기 허용, 쓰기 방지 비활성화?
write_1302(0x80,temp);?//DS1302에 초 레지스터 80H 쓰기 조정된 두 번째 데이터 BCD 코드
write_1302(0x8e,0x80);?//쓰기 방지 열기 write_1602com(er+0x09);//LCD 설정 모드는 데이터를 쓰는 것이므로 포인터 자동으로 추가합니다. 여기서는 원래 위치에 다시 기록됩니다. //write_1602com(0x0b) break;
case?2:fen--;
if(fen==- 1 ) fen=59; write_sfm(5,fen); temp=(fen)/10*16+(fen)%10;//10진수를 DS1302에 필요한 DCB 코드로 변환
write_1302(0x8e, 0x00 );//쓰기를 허용하고 쓰기 금지를 비활성화하시겠습니까?
write_1302(0x82,temp);//조정된 분기 데이터 BCD 코드를 DS1302의 쓰기 레지스터 82H에 씁니다.
write_1302 (0x8e,0x80);//쓰기 방지 열기 write_1602com(er+6);//LCD 모드가 데이터 쓰기로 설정되어 있기 때문에 포인터가 자동으로 1씩 증가하며 여기서는 원래 위치 break에 다시 기록됩니다. p >
case?3:shi--;
if(shi==-1) shi=23; temp=(shi)/10*16+( shi )%10;//10진수를 DS1302에 필요한 DCB 코드로 변환
write_1302(0x8e,0x00);//쓰기를 허용하고 쓰기 방지를 비활성화하시겠습니까?
write_1302(0x84,temp ) ;//조정된 시간 데이터 BCD 코드를 DS1302의 쓰기 시간 레지스터 84H에 씁니다.
write_1302(0x8e,0x80);//쓰기 방지 열기 write_1602com(er+3);//LCD 때문에 is set 데이터를 쓴 후 포인터가 자동으로 1씩 증가하므로 커서가 break를 반환해야 하는 모드입니다.
case?4:week--;
if(week ==0) week =7;
write_1602com(yh+0x0C);//'추가' 후 주간 데이터 표시 위치 지정
write_week(week);//지정 주간 데이터 표시 내용
p>temp=(week)/10*16+(week)%10;//DS1302에서 요구하는 DCB 코드로 십진수 변환
write_1302(0x8e, 0x00);//쓰기를 허용하고 쓰기 금지를 비활성화하시겠습니까?
write_1302(0x8a,temp);//조정된 주간 데이터 BCD 코드를 DS1302의 쓰기 주간 레지스터 8aH에 씁니다.
write_1302(0x8e,0x80); //쓰기 방지 켜기
write_1602com(yh+0x0e);//LCD 모드가 데이터 쓰기로 설정되어 있기 때문에 포인터가 자동으로 1씩 증가하므로 커서가 필요합니다. 반환됨 break;
case?5:ri--;
if(ri==0) ri=31; write_nyr(9,ri); /10*16+(ri)%10; //10진수를 DS1302에 필요한 DCB 코드로 변환
write_1302(0x8e,0x00);//쓰기 허용, 쓰기 금지 금지
write_1302(0x86,temp);//DS1302에 내부 쓰기 날짜 레지스터 86H는 조정된 날짜 데이터 BCD 코드를 씁니다.
write_1302(0x8e,0x80
);//쓰기 방지 열기 write_1602com(yh+10);//LCD 설정 모드는 데이터 쓰기 후 자동으로 추가하는 모드이므로 커서를 반환해야 합니다. break;
case?6 : yue--;
if(yue==0) yue=12; write_nyr(6,yue); temp=(yue)/10*16+(yue)%10;//10진수 변환 DS1302에 필요한 DCB 코드
write_1302(0x8e,0x00);//쓰기 허용, 쓰기 금지 금지
write_1302(0x88,temp);//월 레지스터 88H를 DS1302에 쓰기 조정된 월간 데이터 BCD 코드 쓰기
write_1302(0x8e,0x80);//쓰기 방지 열기 write_1602com(yh+7);//LCD 모드가 데이터 쓰기로 설정되어 있으므로 포인터가 자동으로 하나 추가됩니다. 이므로 커서가 반환되어야 합니다. break;?
case?7:nian--; if(nian==-1) nian=99; /10*16+(nian)%10;//10진수를 DS1302에 필요한 DCB 코드로 변환
write_1302(0x8e,0x00);//쓰기 허용, 쓰기 금지 금지
write_1302(0x8c,temp);//조정된 연도 데이터 BCD 코드를 DS1302의 쓰기 연도 레지스터 8cH에 씁니다.
write_1302(0x8e,0x80);//쓰기 방지 켜기 write_1602com(yh+4) ;//LCD 설정 모드는 데이터를 쓴 후 자동으로 포인터를 1씩 증가시키는 것이므로 커서를 반환해야 합니다. break; //--- ---------------
void?init()?//타이머 및 카운터 설정 기능
{ TMOD=0x11;?//타이머/카운터의 작동 모드를 3으로 지정 TH0=0;//타이머 T0=0 TL0=0;//의 상위 4비트 타이머의 하위 4비트 T0 Bit=0 EA=1;//시스템은 개방 인터럽트 ET0=1을 허용합니다.?//T0 인터럽트 허용 TR0=1;?//인터럽트를 활성화하고 타이머를 시작합니다.
}
//************************주요 기능**************** *********** **
//**************************** ************** ************
void?main()
{ lcd_init(); //LCD 화면 초기화 하위 함수 ds1302_init() 호출;?/ /DS1302 클록의 초기화 하위 함수 init() 호출 //타이밍 카운터의 설정 하위 함수 호출 led=0;?// LCD 백라이트 전원 켜기
buzzer=0;//버저 길이 한 번 울림
delay(80);
buzzer=1 while(1; )//다음 명령문을 따르는 무한 루프: {
keyscan();/ /키보드 스캔 하위 기능 호출
}
}
void?timer0()?interrupt?1//달력 및 시간 가져오기 및 표시
{ //Init_DS18B20();//온도 센서 DS18b2 초기화 하위 기능, flag=ReadTemperature() in 헤더 파일;//18b2 헤더 파일에서 반환된 함수 결과를 표시용 FLAG 변수로 보냅니다.
//초, 시, 분, 일, 월 및 연도 읽기
7개 데이터(DS1302의 읽기 레지스터와 쓰기 레지스터가 다름): miao?=?BCD_Decimal(read_1302(0x81)); fen?=?BCD_Decimal(read_1302(0x83)) shi=?BCD_Decimal(read_1302(0x85)); ri=?BCD_Decimal(read_1302(0x87)); yue?=?BCD_Decimal(read_1302(0x89)); nian=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b)); 시 및 분 데이터: write_temp(12,flag);//두 번째 줄의 12번째 문자부터 온도 표시 write_sfm(8,miao);//초, 두 번째 줄의 8번째 문자부터 시작(하위- 함수 호출 시 분과 초 단위로 표시됨) write_sfm(5,fen);//분은 두 번째 줄의 5번째 문자부터 표시됨 write_sfm(2,shi);//시간은 두 번째 줄의 문자부터 표시됨 두 번째 줄 표시 시작//일, 월, 연도 데이터 표시: write_nyr(9,ri);//날짜, 두 번째 줄의 9번째 문자부터, write_nyr(6,yue);//월, 다음부터 시작 두 번째 줄의 9번째 문자 Write_nyr(3,nian)은 6자 뒤에 표시됩니다. //두 번째 줄의 세 번째 문자 뒤에 연도가 표시됩니다. write_week(week);
} 피>