Interrupt based off internal timer?

Oh, sorry.

Glad it works then. Perhaps someone else can explain better than me, I've obviously failed to do so.

I don't know if it is significant, but the reference page for the Serial library says that you can't use the serial pins (0 and 1) for digital I/O when the Serial port is in use...

int reset = 0;
...
void setup(){
  Serial.begin(9600);
...
  pinMode(reset,INPUT);
...
  if(digitalRead(reset) == HIGH){
    digitalWrite(speaker,LOW);     //turn alarm off
  }

I don't know what the actual results are though.

I'd like to see the whole sketch as it is now though, so I could test it for myself.

Yeah, I figured that one out too. Thanks for your help though.

int half_period=200;
int hours = 0;
int hours_up = 7;
int hours_down = 6;
int mins_up = 13;
int mins_down = 12;
int lcd = 1;
int speaker = 10;
int mins = 0;
int reset = 4;
int start = 3;
int x = 1;
int alarm_status = 0;
int i =0;
unsigned long int time = 0;
unsigned long int etime = 0;
void setup(){
  Serial.begin(9600);
  pinMode(speaker,OUTPUT);
  pinMode(1,OUTPUT);
  pinMode(hours_up,INPUT);
  pinMode(hours_down,INPUT);
  digitalWrite(mins_up,LOW);
  pinMode(mins_up,INPUT);
  digitalWrite(mins_down,LOW);
  pinMode(mins_down,INPUT);
  pinMode(reset,INPUT);
  pinMode(start,INPUT);
  Serial.print(12,BYTE);
  Serial.print(17,BYTE);
  Serial.print(24,BYTE);
  Serial.print(128,BYTE);
  Serial.print("Hours:");
  Serial.print(148,BYTE);
  Serial.print("Minutes:");
  time = millis();
  Serial.print(195,BYTE);
  Serial.print(time);
}
void loop(){
  Serial.print(134,BYTE);
  Serial.print(hours   );
  Serial.print(156,BYTE);
  Serial.print(mins  );
  Serial.print(188,BYTE);
  Serial.print(x);
  Serial.print(205,BYTE);
  Serial.print(analogRead(start));

  if(mins<0){  //reset to 0 if goes negative
    mins=0;
  }
  if(mins>60){
    hours = hours+1;
    mins = mins - 60;  //reset to 0 if goes over 60
  }
  if(hours<0){
    hours = 0;        //reset to 0 if goes negative
  }
  if(digitalRead(mins_up)==HIGH){
    mins_add();
    delay(500);  //add to mins if high
  }
  else{
  }

  if(digitalRead(mins_down) == HIGH){
    mins_sub();
    delay(500);  //sub from mins if high
  }
  else{
  }

  if(digitalRead(hours_up)==HIGH){
    hours_add();
    delay(500);  //add to hours if high
  }
  else{
  }

  if(digitalRead(hours_down)==HIGH){
    hours_sub();
    delay(500);   //sub from hours if down
  }
  else{
  }
  if(analogRead(start) <=100 && (hours >= 0 | mins >= 0)){
    if(i==0){
      time = millis();
      i++;
      Serial.print(195,BYTE);
      Serial.print(time);
      Serial.print(175,BYTE);
      Serial.print(i);
    }
    else{}
    etime = millis()-time;
    Serial.print(168,BYTE);
    Serial.print(etime); 
    if(etime >= 60000*x){
      mins = mins - 1; 
      x= x +1;           //check if told to start and non 0 values for mins and hours
      //keep track of elapsed time, sub from mins after 60 secs 
      Serial.print(188,BYTE);
      Serial.print(x);
    }      
      if(mins == 0 && hours != 0){
        hours = hours - 1;
        mins = 59;               //when mins = 0, sub from hours, take mins to 59
      }
      else{
      }

    if(mins <= 0 && hours <= 0){
      alarm();
    }
    else{
    }
  }        

  else {
  }
   //if(digitalRead(reset)==HIGH){
       // digitalWrite(speaker,LOW);
       // 
     // }
}
void alarm(){
  digitalWrite(speaker,HIGH);
  delayMicroseconds(half_period);
  digitalWrite(speaker,LOW);
  delayMicroseconds(half_period);
  if(digitalRead(reset) == HIGH){
    digitalWrite(speaker,LOW);  
 etime = 0;
        mins = 0;
        hours = 0;
       i = 0;
  }
}
void mins_add(){
  if(digitalRead(mins_up) == HIGH){
    mins = mins + 1;
    delay(100);
    pinMode(mins_up,OUTPUT);
    digitalWrite(mins_up,LOW);
    pinMode(mins_up,INPUT);
    delay(1000);
  }
  else{
  }
}
void mins_sub(){
  if(digitalRead(mins_down)==HIGH){
    mins = mins - 1;
    delay(100);
    pinMode(mins_down,OUTPUT);
    digitalWrite(mins_down,LOW);
    pinMode(mins_down,INPUT);
    delay(1000);
  }
  else {
  }

}
void hours_add(){
  if(digitalRead(hours_up) ==HIGH){
    hours = hours + 1;
    delay(100);
    pinMode(hours_up,OUTPUT);
    digitalWrite(hours_up,LOW);
    pinMode(hours_up,INPUT);
    delay(1000);
  }
  else {
  }
}
void hours_sub(){
  if(digitalRead(hours_down) == HIGH){
    hours= hours - 1;
    delay(100);
    pinMode(hours_down,OUTPUT);
    digitalWrite(hours_down,LOW);
    pinMode(hours_down,INPUT);
    delay(1000);
  }
  else {
  }
}

I am a newbee but a have a few questions. I might learn something.

In your code you have code blocks like the following:

void mins_add(){
  if(digitalRead(mins_up) == HIGH){
    mins = mins + 1;
    delay(100);
    pinMode(mins_up,OUTPUT);
    digitalWrite(mins_up,LOW);
    pinMode(mins_up,INPUT);
    delay(1000);
  }
  else{
  }
}

I see the adding 1 to the 'mins' variable (mins++ also works).
I can see where a small delay would be useful for debounce but why change pin modes from INPUT to OUTPUT to INPUT.

In this block of code.

void alarm(){
  digitalWrite(speaker,HIGH);
  delayMicroseconds(half_period);
  digitalWrite(speaker,LOW);
  delayMicroseconds(half_period);   <-- point A
  if(digitalRead(reset) == HIGH){   <-- point B
    digitalWrite(speaker,LOW);      <-- point C
    etime = 0;
    mins = 0;
    hours = 0;
    i = 0;
  }
}

What is the state of the 'speaker' pin at point 'A'?
Is it changed at point 'B'?
Is it possible for the 'speaker' pin to be HIGH before the code at point 'B' is executed?

Arduino 1.0 does not support:
Serial.print(12,BYTE);

You may want to change it to:
Serial.write(12);