컴퓨터 지식 네트워크 - 컴퓨터 하드웨어 - 마이크로 컨트롤러와 DS18B20은 LCD1602를 사용하여 c 프로그램을 표시합니다.

마이크로 컨트롤러와 DS18B20은 LCD1602를 사용하여 c 프로그램을 표시합니다.

/*main.c? 직접 참조하시겠습니까?

#include

#include"DS18B20_3.H"

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입니다. 표시됨

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);

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에 다시 기록됩니다.

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);

}

上篇: 데스크탑 raid 디스크 어레이는 어떻게 합니까? 下篇: 콜라 우품 핸드폰은 어떠세요? 살 가치가 있습니까?
관련 내용