8051 다운카운터를 만들려고 하는데요..
/* 7-세그먼트 상위 어드레스 */
#define FNDH (*(unsigned char*)(0x2fc4c))
/* 7-세그먼트 하위 어드레스 */
#define FNDL (*(unsigned char*)(0x2fc4d))
를 써서 할려고 합니다.
예전에 7-seg를 외부에서 연결을 하여서 0을 2개 줘서 한적은 있었는데요..
키트에 내장되어 있는 세그먼트로 30~0까지 다운카운토 할려고 했는데 잘안되더라구요..
#include <reg51.h>
/* 포트 선택 어드레스 */
#define SELECT (*(unsigned char*)(0x2fc48))
/* 7-세그먼트 상위 어드레스 */
#define FNDH (*(unsigned char*)(0x2fc4c))
/* 7-세그먼트 하위 어드레스 */
#define FNDL (*(unsigned char*)(0x2fc4d))
/* 전역 변수로 선언, 인터럽트 수 카운터용,초, 분 저장하는데 사용 */
unsigned char count,sec_l,sec_h;
/* 타이머 1 인터럽트 함수 */
void TIMER1(void) interrupt 3
{
count++; /* 0,071 초 마다 증가 */
}
void main( void )
{
/* 7 세그먼트 클리어 */
FNDH = 0;
FNDL = 0xf030;
/* 타이머 1, 모드 1, GATE ON */
TMOD = 0x90;
TH1 = 0;
TL1 = 0;
/* INT1 키 및 소수점 디스플레이 */
SELECT = 0xbc;
count = 0;
sec_l = 10;
sec_h = 3;
/* 인터럽트 인에이블 및 타이머 1 런 */ ET1 = 1;
TR1 = 1;
EA = 1;
do{
if (count == 4){
count = 0; sec_l--;
if(sec_l == 0){ FNDL = 0;
sec_l = 10; sec_h--;
if(sec_h < 1){
sec_h = 3; }
}
/* 현재 값 디스플레이 */
FNDL = sec_l | ( sec_h << 4 );
}
}while(1); }
언어를 이렇게 짯는데요..
세그먼트 초기값을 30 에서 29 28로 내려가길 원하는데..
실제로는
30, 39, 38, 37, 36, 35, 34, 33, 32, 31, 2□ <- 1자리는 아무것도 안뜹니다. 그리고 30이 아닌 2□ 로 뜨구요..
29, 28, 27, 26, 25, 24, 23, 22, 21, 1□
19, 18, 17, 16, 15, 14, 13, 12, 11, 3□
39, 38, 37, 36, 35, 34, 33, 32, 31
이런식으로 떠요.. 어디가 잘못된 걸까요..??
가르쳐주세요~~~
/* 7-세그먼트 상위 어드레스 */
#define FNDH (*(unsigned char*)(0x2fc4c))
/* 7-세그먼트 하위 어드레스 */
#define FNDL (*(unsigned char*)(0x2fc4d))
를 써서 할려고 합니다.
예전에 7-seg를 외부에서 연결을 하여서 0을 2개 줘서 한적은 있었는데요..
키트에 내장되어 있는 세그먼트로 30~0까지 다운카운토 할려고 했는데 잘안되더라구요..
#include <reg51.h>
/* 포트 선택 어드레스 */
#define SELECT (*(unsigned char*)(0x2fc48))
/* 7-세그먼트 상위 어드레스 */
#define FNDH (*(unsigned char*)(0x2fc4c))
/* 7-세그먼트 하위 어드레스 */
#define FNDL (*(unsigned char*)(0x2fc4d))
/* 전역 변수로 선언, 인터럽트 수 카운터용,초, 분 저장하는데 사용 */
unsigned char count,sec_l,sec_h;
/* 타이머 1 인터럽트 함수 */
void TIMER1(void) interrupt 3
{
count++; /* 0,071 초 마다 증가 */
}
void main( void )
{
/* 7 세그먼트 클리어 */
FNDH = 0;
FNDL = 0xf030;
/* 타이머 1, 모드 1, GATE ON */
TMOD = 0x90;
TH1 = 0;
TL1 = 0;
/* INT1 키 및 소수점 디스플레이 */
SELECT = 0xbc;
count = 0;
sec_l = 10;
sec_h = 3;
/* 인터럽트 인에이블 및 타이머 1 런 */ ET1 = 1;
TR1 = 1;
EA = 1;
do{
if (count == 4){
count = 0; sec_l--;
if(sec_l == 0){ FNDL = 0;
sec_l = 10; sec_h--;
if(sec_h < 1){
sec_h = 3; }
}
/* 현재 값 디스플레이 */
FNDL = sec_l | ( sec_h << 4 );
}
}while(1); }
언어를 이렇게 짯는데요..
세그먼트 초기값을 30 에서 29 28로 내려가길 원하는데..
실제로는
30, 39, 38, 37, 36, 35, 34, 33, 32, 31, 2□ <- 1자리는 아무것도 안뜹니다. 그리고 30이 아닌 2□ 로 뜨구요..
29, 28, 27, 26, 25, 24, 23, 22, 21, 1□
19, 18, 17, 16, 15, 14, 13, 12, 11, 3□
39, 38, 37, 36, 35, 34, 33, 32, 31
이런식으로 떠요.. 어디가 잘못된 걸까요..??
가르쳐주세요~~~