phamminh05
30-11-2008, 06:07 PM
Em là 1 newbie,đang viết 1 chương trình nho nhỏ bằng MCC18,đồng hồ có chức năng hẹn giờ(các nút chức năng gần giống với cái đồng hồ Casio).Khi đến giờ đã hẹn,nó sẽ phát âm thanh ra loa.Nhưng em đang gặp phải 2 vấn đề là:
1.Em dùng ngắt INT0 đề chuyển từ chế độ đồng hồ sang chế độ hẹn giờ(thể hiện qua button: ALARM IN trên mạch Proteus kèm theo) nhưng không hiểu vì sao nó không chuyển qua được.
2.Không biết viết hàm play_sound như thế nào để tạo ra âm thanh?
Mấy pro giúp giùm em với,cám ơn rất rất nhiều.
#include<p18f4550.h>
#include<timers.h>
#pragma config WDT=OFF, PWRT=OFF, LVP=OFF, CP0=OFF, CP1=OFF,CP2=OFF,CP3=OFF, WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF,EBTR0=OFF,EBTR1=OFF,EBT R2=OFF,EBTR3=OFF,EBTRB=OFF
void init(void);
void led(unsigned char x);
void interrupt_timer0(void);//se thiet lap timer0 co interrupt la cao
//void interrupt_timer1(void);//se thiet lap timer1 co interrupt la thap
void global_int(void);
void play_sound(void);
void int0_external(void);
static unsigned char table[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 };
unsigned char count = 0;
unsigned char mi0; //phut
unsigned char mi1;
unsigned char ho0; //gio
unsigned char ho1;
unsigned char mi02; //hen gio cho phut
unsigned char mi12;
unsigned char ho02; //hen gio cho gio
unsigned char ho12;
unsigned char test; //chuyen che do giua hen gio va dong ho
unsigned char mode; //chon chinh gio,chinh phut hay khong chinh gi ca
#pragma code high_vector = 0x08
void high_vector (void){
_asm
GOTO int0_external
_endasm
}
#pragma code low_vector = 0x18
void low_interrupt(void){
//if(INTCONbits.TMR0IF) interrupt_timer0();
//if(PIR1bits.TMR1IF) interrupt_timer1();
_asm
GOTO interrupt_timer0
_endasm
}
#pragma code
#pragma interrupt int0_external
void int0_external(void){
//INTCONbits.INT0IF = 0;
test = 1; // chuyen qua hen gio
mi02 = 0;
mi12 = 0;
ho02 = 0;
ho12 = 0;
while(1){
if(PORTAbits.RA1 == 0){//chon mode:chinh gio hoac phut hoac khong chinh gi
if(PORTAbits.RA0 == 0)//thoat khoi vong lap
break;
mode++;
mode = mode%3;
if(mode == 0){//khong chinh:2 den led bao hieu khong sang
PORTAbits.RA3 = 0;//2 led gan o 2 chan 3,4 cua PORTA dung de bao hieu cho nguoi dung biet dang chon o mode nao
PORTAbits.RA4 = 0;
}
if(mode == 2){//chinh phut
PORTAbits.RA3 = 0;//den led bao hieu dang chinh o phut se sang
PORTAbits.RA4 = 1;
while(1){
if(PORTAbits.RA2 == 0){ //nut thu 3 dung de chinh tang len 1 don vi
if(PORTAbits.RA1 == 0)
break;
if(mi02 >= 9){
mi02 = 0;
if(mi12 >= 5){
mi12 = 0;
}
else
mi12++;
}else
mi02++;
}
}
}
if(mode == 1){ //chinh gio
PORTAbits.RA3 = 1;//den led bao hieu dang o chinh o gio se sang
PORTAbits.RA4 = 0;
while(1){
if(PORTAbits.RA2 == 0){
if(PORTAbits.RA1 == 0)
break;
if((ho02 >= 9)&&(ho12 == 0)){
ho02 = 0;
ho1++;
}else if((ho02 >=4)&&(ho12 == 2)){
ho02 = 0;
ho12 = 0;
}
else
ho02++;
}
}
}
}
}
test = 0;//ve dong ho binh thuong
}
/*void interrupt_timer1(void){
PIR1bits.TMR1IF = 0;
if(count > 3){
count = 0;
}
led(count);
count++;
}*/
#pragma interruptlow interrupt_timer0
void interrupt_timer0(void){
INTCONbits.TMR0IF = 0;
if(mi0 >= 9){ //vao luc xx:x9
mi0 = 0;
if(mi1 >= 5){ //vao luc xx:59
mi1 = 0;
if((ho0 >= 9)&&(ho1 == 0)){ //vao luc x9:59
ho0 = 0;
ho1++;
}else if((ho0 >=4)&&(ho1 == 2)){
ho0 = 0;
ho1 = 0;
}else
ho0++;
}
else
mi1++;
}
else
mi0++;
}
void led(unsigned char x){
if(test == 0){ //hien thi dong ho
if(x == 0){ //se hien thi o led chi phut thu nhat(led so 0)
PORTD = table[mi0];
//PORTDbits.RD0 = 1; // day la code dung de quet led,chuong trinh se quet led tu phai(led so 0) qua trai(led so 3)
//PORTDbits.RD1 = 0;
//PORTDbits.RD2 = 0;
//PORTDbits.RD3 = 0;
PORTC = 0x10; //dien giai chi tiet ra la 3 dong o tren,hay 3 dong o tren tuong duong voi dong nay
}
else if(x == 1){ //se hien thi o led chi phut thu hai(led so 1)
PORTD = table[mi1];
PORTC = 0x20;
}
else if(x == 2){ // se hien thi o led chi gio thu nhat(led so 2)
PORTD = table[ho0];
PORTC = 0x40;
}
else{ // x == 3 // se hien thi o led chi gio thu hai(led so 3)
PORTD = table[ho1];
PORTC = 0x80;
}
}
if(test == 1){//hien thi o che do hen gio
if(x == 0){
PORTD = table[mi02];
PORTC = 0x10;
}
if(x == 1){
PORTD = table[mi12];
PORTC = 0x20;
}
if(x == 2){
PORTD = table[ho02];
PORTC = 0x40;
}
if(x == 3){
PORTD = table[ho12];
PORTC = 0x80;
}
}
}
void play_sound(void){
}
void init(void){
mi0 = 0;
mi1 = 0;
ho0 = 0;
ho1 = 0;
mi02 = 0;
mi12 = 0;
ho02 = 0;
ho12 = 0;
test = 0;
mode = 0;
//OpenTimer1( TIMER_INT_ON &T1_16BIT_RW &T1_SOURCE_INT &T1_PS_1_1 &T1_OSC1EN_OFF &T1_SYNC_EXT_OFF );
OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT & T0_PS_1_8);
INTCON2bits.TMR0IP = 0; //ngat timer0 la uu tien cao
INTCONbits.INT0IE = 1;
INTCON2bits.INTEDG0 = 0;
//IPR1bits.TMR1IP = 0; //ngat timer1 la uu tien thap
TMR0L = 0xFF;//chay thoi gian
TMR0H = 0xFF;
//TRISB = 0xFF;
TRISD = 0x00;
TRISA = 0x07; // 0b0000 0111 => PORTAbits.RA0-1-2 :dung de input nen bang 1
TRISC = 0x00;
}
void global_int(void){
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
}
void main(){
global_int();
init();
while(1){
int i;
for(i = 0;i<2000;i++){//delay
i++;
}
if(count > 3){
count = 0;
}
led(count);
count++;
//if((mi0 == mi02)&&(mi1 == mi12)&&(ho0 == ho02)&&(ho1 == ho12)){
// play_sound();
//}
}
}
1.Em dùng ngắt INT0 đề chuyển từ chế độ đồng hồ sang chế độ hẹn giờ(thể hiện qua button: ALARM IN trên mạch Proteus kèm theo) nhưng không hiểu vì sao nó không chuyển qua được.
2.Không biết viết hàm play_sound như thế nào để tạo ra âm thanh?
Mấy pro giúp giùm em với,cám ơn rất rất nhiều.
#include<p18f4550.h>
#include<timers.h>
#pragma config WDT=OFF, PWRT=OFF, LVP=OFF, CP0=OFF, CP1=OFF,CP2=OFF,CP3=OFF, WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF,EBTR0=OFF,EBTR1=OFF,EBT R2=OFF,EBTR3=OFF,EBTRB=OFF
void init(void);
void led(unsigned char x);
void interrupt_timer0(void);//se thiet lap timer0 co interrupt la cao
//void interrupt_timer1(void);//se thiet lap timer1 co interrupt la thap
void global_int(void);
void play_sound(void);
void int0_external(void);
static unsigned char table[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 };
unsigned char count = 0;
unsigned char mi0; //phut
unsigned char mi1;
unsigned char ho0; //gio
unsigned char ho1;
unsigned char mi02; //hen gio cho phut
unsigned char mi12;
unsigned char ho02; //hen gio cho gio
unsigned char ho12;
unsigned char test; //chuyen che do giua hen gio va dong ho
unsigned char mode; //chon chinh gio,chinh phut hay khong chinh gi ca
#pragma code high_vector = 0x08
void high_vector (void){
_asm
GOTO int0_external
_endasm
}
#pragma code low_vector = 0x18
void low_interrupt(void){
//if(INTCONbits.TMR0IF) interrupt_timer0();
//if(PIR1bits.TMR1IF) interrupt_timer1();
_asm
GOTO interrupt_timer0
_endasm
}
#pragma code
#pragma interrupt int0_external
void int0_external(void){
//INTCONbits.INT0IF = 0;
test = 1; // chuyen qua hen gio
mi02 = 0;
mi12 = 0;
ho02 = 0;
ho12 = 0;
while(1){
if(PORTAbits.RA1 == 0){//chon mode:chinh gio hoac phut hoac khong chinh gi
if(PORTAbits.RA0 == 0)//thoat khoi vong lap
break;
mode++;
mode = mode%3;
if(mode == 0){//khong chinh:2 den led bao hieu khong sang
PORTAbits.RA3 = 0;//2 led gan o 2 chan 3,4 cua PORTA dung de bao hieu cho nguoi dung biet dang chon o mode nao
PORTAbits.RA4 = 0;
}
if(mode == 2){//chinh phut
PORTAbits.RA3 = 0;//den led bao hieu dang chinh o phut se sang
PORTAbits.RA4 = 1;
while(1){
if(PORTAbits.RA2 == 0){ //nut thu 3 dung de chinh tang len 1 don vi
if(PORTAbits.RA1 == 0)
break;
if(mi02 >= 9){
mi02 = 0;
if(mi12 >= 5){
mi12 = 0;
}
else
mi12++;
}else
mi02++;
}
}
}
if(mode == 1){ //chinh gio
PORTAbits.RA3 = 1;//den led bao hieu dang o chinh o gio se sang
PORTAbits.RA4 = 0;
while(1){
if(PORTAbits.RA2 == 0){
if(PORTAbits.RA1 == 0)
break;
if((ho02 >= 9)&&(ho12 == 0)){
ho02 = 0;
ho1++;
}else if((ho02 >=4)&&(ho12 == 2)){
ho02 = 0;
ho12 = 0;
}
else
ho02++;
}
}
}
}
}
test = 0;//ve dong ho binh thuong
}
/*void interrupt_timer1(void){
PIR1bits.TMR1IF = 0;
if(count > 3){
count = 0;
}
led(count);
count++;
}*/
#pragma interruptlow interrupt_timer0
void interrupt_timer0(void){
INTCONbits.TMR0IF = 0;
if(mi0 >= 9){ //vao luc xx:x9
mi0 = 0;
if(mi1 >= 5){ //vao luc xx:59
mi1 = 0;
if((ho0 >= 9)&&(ho1 == 0)){ //vao luc x9:59
ho0 = 0;
ho1++;
}else if((ho0 >=4)&&(ho1 == 2)){
ho0 = 0;
ho1 = 0;
}else
ho0++;
}
else
mi1++;
}
else
mi0++;
}
void led(unsigned char x){
if(test == 0){ //hien thi dong ho
if(x == 0){ //se hien thi o led chi phut thu nhat(led so 0)
PORTD = table[mi0];
//PORTDbits.RD0 = 1; // day la code dung de quet led,chuong trinh se quet led tu phai(led so 0) qua trai(led so 3)
//PORTDbits.RD1 = 0;
//PORTDbits.RD2 = 0;
//PORTDbits.RD3 = 0;
PORTC = 0x10; //dien giai chi tiet ra la 3 dong o tren,hay 3 dong o tren tuong duong voi dong nay
}
else if(x == 1){ //se hien thi o led chi phut thu hai(led so 1)
PORTD = table[mi1];
PORTC = 0x20;
}
else if(x == 2){ // se hien thi o led chi gio thu nhat(led so 2)
PORTD = table[ho0];
PORTC = 0x40;
}
else{ // x == 3 // se hien thi o led chi gio thu hai(led so 3)
PORTD = table[ho1];
PORTC = 0x80;
}
}
if(test == 1){//hien thi o che do hen gio
if(x == 0){
PORTD = table[mi02];
PORTC = 0x10;
}
if(x == 1){
PORTD = table[mi12];
PORTC = 0x20;
}
if(x == 2){
PORTD = table[ho02];
PORTC = 0x40;
}
if(x == 3){
PORTD = table[ho12];
PORTC = 0x80;
}
}
}
void play_sound(void){
}
void init(void){
mi0 = 0;
mi1 = 0;
ho0 = 0;
ho1 = 0;
mi02 = 0;
mi12 = 0;
ho02 = 0;
ho12 = 0;
test = 0;
mode = 0;
//OpenTimer1( TIMER_INT_ON &T1_16BIT_RW &T1_SOURCE_INT &T1_PS_1_1 &T1_OSC1EN_OFF &T1_SYNC_EXT_OFF );
OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT & T0_PS_1_8);
INTCON2bits.TMR0IP = 0; //ngat timer0 la uu tien cao
INTCONbits.INT0IE = 1;
INTCON2bits.INTEDG0 = 0;
//IPR1bits.TMR1IP = 0; //ngat timer1 la uu tien thap
TMR0L = 0xFF;//chay thoi gian
TMR0H = 0xFF;
//TRISB = 0xFF;
TRISD = 0x00;
TRISA = 0x07; // 0b0000 0111 => PORTAbits.RA0-1-2 :dung de input nen bang 1
TRISC = 0x00;
}
void global_int(void){
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
}
void main(){
global_int();
init();
while(1){
int i;
for(i = 0;i<2000;i++){//delay
i++;
}
if(count > 3){
count = 0;
}
led(count);
count++;
//if((mi0 == mi02)&&(mi1 == mi12)&&(ho0 == ho02)&&(ho1 == ho12)){
// play_sound();
//}
}
}