Thông báo

Collapse
No announcement yet.

giúp về ngắt ngoài 89c51

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • giúp về ngắt ngoài 89c51

    em vừa viết được đoạn chương trình đồng hồ số hiển thị lên Lcd mà ko chỉnh được thời gian nên bác nào biết cách chỉnh thời gian bằng 4 nút nhấn(1 nút chọn chế độ chỉnh giờ/phút/giây, 1 nút chỉnh tăng , 1 nút chỉnh giảm và 1 nút bắt đầu cũng như kết thúc chỉnh thời gian) có sử dụng ngắt ngoài và đoạn code chương trình em đây mong các bác sửa lại giúp (và chương trình trên em chỉ cần tính thời gian gần đúng nên chỉ sử dụng hàm delay thôi)
    Code:
    #include<AT89x51.h>   // Dinh kem file thu vien
     #include<string.h>
    
    #define  bat  1               // Dinh nghia gia tri bat den Led
    #define  tat  0                // Dinh nghia gia tri tat den Led
    /*==================khai bao bien==================*/
    sbit  Led1 = P1^0;  // Khai bao bi?n Led ki?u bit chan P1.0
    sbit  Led2 = P1^1;  // Khai bao bi?n Led ki?u bit chan P1.0
    /*================= Khai bao hàm==================*/
    /*------------------------------ham tre -------------------------------------*/
    unsigned char data gio1=0;
    unsigned char data gio2=0;	   
    unsigned char data phut1=0;
    unsigned char data phut2=0;	   
    unsigned char data giay1=0;
    unsigned char data giay2=0;	
    unsigned char data Time[8];	  
    sfr LCDdata = 0xA0; // cong P2, 8 bit du lieu.
    sbit BF = 0xA7; // co ban, bit DB7.
    sbit RS = P3^0; // chon thanh ghi
    sbit RW = P3^1; // doc/ghi
    sbit EN = P3^2; //cho phep chot du lieu
    /*===========cac chuong trinh con cua LCD==========*/
    /*--------------kiem tra su san sang cua LCD------------------------*/
    void wait(void)
    {
    	RS=0; //chon thanh ghi lenh
    	RW=1; //?oc tu LCD
    	LCDdata=0xff;  //gia tri 0xff
    	while(BF)   //kiem tra co ban
      		{
         	 	EN=0; //dua xung cao xuong thap ?e chot.
     	 	EN=1; //dua chan cho phep len cao
       		} 
      	}
    	/*------------------------thiet lap lenh cho LCD--------------------------*/
    void LCDcontrol(unsigned char x)
     	{
    	 	RS=0;//chon thanh ghi lenh
    	 	RW=0;//ghi len LCD.
    	 	LCDdata=x ;// gia tri x
    		EN=1;//cho phep muc cao
    	 	EN=0;//xung cao xuong thap
    	 	wait();//?oi LCD san sang.
     	 }
    	/*------------------------------Khoi tao LCD-------------------------*/
    void LCDinit(void)
    {
    		LCDcontrol(0x38);//2 dong va ma tran 5x7
    		LCDcontrol(0x0e);//bat man hinh, bat con tro
    		LCDcontrol(0x01);//xoa man hinh
    	}
    	/*-------------------------thiet lap du lieu cho LCD-----------------*/
    void LCDwrite(unsigned char c)
     	{
    		RS=1;//ghi du lieu 
    		RW=0;//ghi du lieu len LCD
    		LCDdata=c;//gia tri C
    		EN=1;//cho phep muc cao
    		EN=0;//xung cao xuong thap
    		wait();//cho
    	}
    	void LCDwrites(unsigned char *s)
     	{
    		unsigned char data lens,count;
    		lens=strlen(s);
    		for(count=0;count<lens;count++){
    			LCDwrite(*(s+count));
    		}
     	}
    
    void  delay(unsigned long  time)
    		 {
    			while(time--);
    		 }					
    	
    		/*--------------------------------ham chinh--------------------------------*/
    void main(void)
    		{			 		
    		while(1)
    		{					   				
    			while(gio1<3)
    			{		
    			    while(gio2<10)
    				{
    				    while(phut1<7)
    					{
    					    while(phut2<10)
    						{
    						   while(giay1<7)
    						   {
    						       while(giay2<10)
    							   {	
    							   	   LCDinit(); // khoi tao LCD		  							              
    						           LCDwrite(gio1+48);
    								   LCDwrite(gio2+48); 
    						           LCDwrite(':');
    						           LCDwrite(phut1+48);
    						           LCDwrite(phut2+48);
     						           LCDwrite(':');
     						           LCDwrite(giay1+48);
     						           LCDwrite(giay2+48);
    					               delay(21600);	   						           
    								   giay2++;		   
    									 																			
    								}
    								giay2=0;
    								giay1++;
    							}	
    							giay1=0;
    							giay2=0;
    							phut2++;	
    						}
    						giay1=0;
    						giay2=0;   
    						phut2=0;
    						phut1++;
    					}
    					giay1=0;
    					giay2=0;   
    					phut2=0;
    					phut1=0;
    					gio2++;		 
    				}
    				giay1=0;
    				giay2=0;   
    				phut2=0;
    				phut1=0;
    				gio2=0;
    				gio1++;
    			}
    			giay1=0;
    			giay2=0;   
    			phut2=0;
    			phut1=0;
    			gio2=0;
    			gio1=0;
    
    		}
    	}
    cám ơn nhiều

  • #2
    sử dụng ngắt ngoài bạn thêm 1 biến vào, mỗi lần ấn phím Set biến đó tăng lên 1 đơn vị sau đó đặt các lệnh tương ứng vs từng giá trị của nút đó.
    ví dụ bạn muốn ấn lần đầu nó chình giờ thì đặt if(MODE==1) // MODE là biến nhé
    {
    // các lệnh xử lý
    }
    trong các lệnh trong hàm if bạn ép con trỏ LCD về chỗ hiển thị giờ, sau đó đặt đk nếu up thì nó tăng nếu down nó giảm .
    OK bạn
    Nguyễn Huy Biên - 01649 802 694
    gmail :

    Comment

    Về tác giả

    Collapse

    quang111 Tìm hiểu thêm về quang111

    Bài viết mới nhất

    Collapse

    Đang tải...
    X