PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 20-09-2007, 12:11 AM   #31
phamngoctan
Nhập môn đệ tử
 
Tham gia ngày: Aug 2007
Bài gửi: 1
:
Em đã đọc code của bác.Nói chung là hiểu.Nhưng có 1 vấn đề em k0 hiểu là tại sao để chống rung các bác lai cứ thích dùng delay thế nhỉ, như thế chỉ tổ tốn tài nguyên,em có 1 ý là dùng ngắt timer k0 tốt hơn hay sao ?
phamngoctan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-09-2007, 02:17 PM   #32
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Miễn là khử được rung phím là đạt yêu cầu. Còn dùng cách nào thì tùy thuộc vào thuật toán của mỗi người.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-09-2007, 10:54 AM   #33
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
Trích:
Nguyên văn bởi tinhthanthep View Post
Muốn hiển thị âm lịch thì cho sang trang màn hình tiếp theo. Sử dụng nút bấm mode để xem tiếp các thông tin khác của lịch vạn niên.
Bác có thể nói rõ hơn được không,theo em hiểu thì mình phải lưu lịch âm vao eeprom đúng không,vì không có công thức toàn học nào có thể chuyển đổi từ ngày dương sang ngày âm được,thể để lưu khoảng 10 năm thì bác làm thế nào? làm sao xác định được ngày âm tương ứng với ngày dương?
Mong hồi âm của bác!
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-09-2007, 01:43 PM   #34
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi david View Post
Bác có thể nói rõ hơn được không,theo em hiểu thì mình phải lưu lịch âm vao eeprom đúng không,vì không có công thức toàn học nào có thể chuyển đổi từ ngày dương sang ngày âm được,thể để lưu khoảng 10 năm thì bác làm thế nào? làm sao xác định được ngày âm tương ứng với ngày dương?
Mong hồi âm của bác!
Tất nhiên là phải có công thức chuyển đổi giữa ngày âm lịch Việt Nam và ngày dương lịch chứ. Bác xem ở đây, khổ nỗi code bằng java: http://www.informatik.uni-leipzig.de/~duc/amlich/

Trong khi chưa thể coding mấy cái công thức chuyển đổi loằng ngoằng này, theo cách củ chuối, ta cứ lật tờ lịch ra, đánh dấu các ngày mùng 1 âm lịch hằng tháng xem nó trùng với ngày dương lịch nào, sau đó lưu vào eeprom. 10 năm tầm cỡ 120 giá trị, ko nhiều lắm.

Bác nào hứng thú thì chuyển mã sang C chuyên nghiệp hơn.
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-09-2007, 12:00 AM   #35
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
Trích:
Nguyên văn bởi nhh View Post
Tất nhiên là phải có công thức chuyển đổi giữa ngày âm lịch Việt Nam và ngày dương lịch chứ. Bác xem ở đây, khổ nỗi code bằng java: http://www.informatik.uni-leipzig.de/~duc/amlich/

Trong khi chưa thể coding mấy cái công thức chuyển đổi loằng ngoằng này, theo cách củ chuối, ta cứ lật tờ lịch ra, đánh dấu các ngày mùng 1 âm lịch hằng tháng xem nó trùng với ngày dương lịch nào, sau đó lưu vào eeprom. 10 năm tầm cỡ 120 giá trị, ko nhiều lắm.

Bác nào hứng thú thì chuyển mã sang C chuyên nghiệp hơn.
Cách này nếu làm được thì cũng hay chứ bác. Em có ý này bác xem có được không nhé:
+)Dùng 1 biến đếm tháng dương Count,ta biết cứ qua một tháng dương thì sẽ qua một tháng âm,nên mỗi khi biến đếm tăng lên 1 thì cũng đã sang tháng âm mới, và ngày âm tương ứng với ngày mồng 1 hàng tháng ta sẽ lưu vào eeprpom
+)Khi có một ngày dương lịch ví dụ như 28/12/2007 cần xác định lịch âm ta sẽ dựa vào biết đếm(giả sử biến đếm Count= 3,lấy mốc từ tháng 1/9/2007 ) để gọi ra ngày âm lịch tương ứng với ngày 1/12/2007 là ngày 22/10 ) ta sẽ lấy : (28-1) + 22 -30 = 19 là ngày âm lich tương ứng,ở đây 30 là số ngày của tháng 10 âm lịch,hay là số ngày ứng với biến đếm = 3,điều này có nghĩa là với tập giá trị của Count từ 1 đến 120 (120 tháng ứng với 10 năm) ta cần xác định với giá trị nào Count thì tương ứng với 30,với giá trị nào của Count thì tương ứng với 29 và với giá trị nào của Count thì tương ứng với 28.Ta có thể sử dụng 1 eeprom 256 byte với 120 byte đầu ghi ngày âm,120 byte sau số ngày trong tháng ứng với giá trị biến Count
+)Bổ sung thêm là nếu (ngày dương - 1) +ngày âm (lấy ra từ eeprom) < 28 thì ngày đó là ngày âm cần tìm

Bác hiểu ý em chứ !

thay đổi nội dung bởi: david, 26-09-2007 lúc 10:27 AM.
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-09-2007, 10:40 PM   #36
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
đã bác nào chyển từ dương lịch sang âm lịch chưa,nói cho em cách trên có ổn không với !
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-10-2007, 10:15 AM   #37
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Chương trình đầy đủ đây

Code:
/* KHAI BAO BIEN **************************************************************/
unsigned short second, minute, hour, day, date, month, year;
unsigned short minute_al, hour_al, type_al, count_al;
unsigned short flag_time, delay10s_1 = 0, delay10s_2 = 0;
unsigned short mode;
char *day_txt;
/* KHOI TAO *******************************************************************/
void INIT_MAIN() {
/* Khoi tao cong A -----------------------------------------------------------*/
  TRISA = 0xFF;  // Dinh nghia cong A la Digital Input
  PORTA = 0x00;
/* Khoi tao cong B -----------------------------------------------------------*/
  TRISB = 0xFF;  // Dinh nghia cong B la Digital Input
  PORTB = 0x00;
/* Khoi tao cong C -----------------------------------------------------------*/
  TRISC   = 0x00;
  PORTC   = 0x00;
/* Khoi tao cong D -----------------------------------------------------------*/
  TRISD = 0x00;  // Dinh nghia cong D la Digital Output
  PORTD = 0x00;
/* Khoi tao cong E -----------------------------------------------------------*/
  ADCON1 = 0x0E; // Dinh nghia cong E la Digital + su dung A/D channel AN0
  TRISE  = 0x00; // Dinh nghia cong E la Output
  PORTE  = 0x00; // Xoa du lieu cu tren cong E
/* Khoi tao LCD --------------------------------------------------------------*/
  Lcd_Config(&PORTD,4,7,6,3,2,1,0);
  Lcd_Init(&PORTD);
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Cmd(Lcd_CURSOR_OFF);
/* Khoi tao truyen thong I2C -------------------------------------------------*/
  I2C_Init(100000);
/* Khoi tao DS1307 -----------------------------------------------------------*/
/* I2C_Start();
  I2C_Wr(0xD0);
  I2C_Wr(0x00); // Khoi tao cac gia tri ban dau cho cac thanh ghi thoi gian
  I2C_Wr(0x13); // chi lam 1 lan.
  I2C_Wr(0x03);
  I2C_Wr(0x02);
  I2C_Wr(0x03);
  I2C_Wr(0x05);
  I2C_Wr(0x03);
  I2C_Wr(0x03);
  I2C_Wr(0x90);
  I2C_Stop();   */
/* Khoi tao ngat ngoai va Timer0 ---------------------------------------------*/
  INTCON = 0x90; // Mo ngat toan cuc, mo ngat ngoai, xoa co ngat ngoai, xoa co ngat Timer0
  OPTION_REG = 0x87; // Chon suon len cho ngat ngoai va Timer0, bo chia ti le 1:256 cho Timer0
  TMR0 = 0x00;
/* Khoi tao cac bien luu trong EEPROM*/
  hour_al = Eeprom_Read(0x00);
  minute_al = Eeprom_Read(0x01);
  type_al = Eeprom_Read(0x02);
}
/* CHUONG TRINH CON ***********************************************************/
/* Doc du lieu RTC tu DS1307 -------------------------------------------------*/
void READ_RTC() {
  I2C_Start();
  I2C_Wr(0xD0);
  I2C_Wr(0x00);
  I2C_Repeated_Start();
  I2C_Wr(0xD1);
  second = I2C_Rd(1u);
  minute = I2C_Rd(1u);
  hour   = I2C_Rd(1u);
  day    = I2C_Rd(1u);
  date   = I2C_Rd(1u);
  month  = I2C_Rd(1u);
  year   = I2C_Rd(1u);
  I2C_Stop();
}
/* Xu ly du lieu Date RTC ----------------------------------------------------*/
void TRANSFORM_RTC() {
  switch (day) {
    case 1: day_txt = "ERO"; break;
    case 2: day_txt = "T.2"; break;
    case 3: day_txt = "T.3"; break;
    case 4: day_txt = "T.4"; break;
    case 5: day_txt = "T.5"; break;
    case 6: day_txt = "T.6"; break;
    case 7: day_txt = "T.7"; break;
    case 8: day_txt = "C.N"; break;
  }
}
/* Xu ly du lieu RTC ---------------------------------------------------------*/
void BCD(unsigned short x, unsigned short y,unsigned short var) {
unsigned short var1, var2;
  var1 = (var >> 4) + 0x30;
  LCD_Chr(x,y,var1);
  var2 = (var & 0x0F) + 0x30;
  LCD_Chr_Cp(var2);
}
/* Hien thi ra LCD -----------------------------------------------------------*/
void LCD_DISPLAY() {
  LCD_Out(1,1,day_txt);
  BCD(1,7,date);
  LCD_Chr_Cp('/');
  BCD(1,10,month);
  LCD_Out_Cp("/20");
  BCD(1,15,year);
  if (type_al == 1) Lcd_Out(2, 1,"Chuong");
  else Lcd_Out(2, 1,"      ");
  BCD(2,9,hour);
  LCD_Chr_Cp(':');
  BCD(2,12,minute);
  LCD_Chr_Cp(':');
  BCD(2,15,second);
}
/* Cap nhat thoi gian --------------------------------------------------------*/
void UPDATE_TIME() {
  READ_RTC();
  TRANSFORM_RTC();
  LCD_DISPLAY();
  PORTE.F0 = ~PORTE.F0;
}
/* Xu ly Du lieu Nhiet do tu LM335 -------------------------------------------*/
void TEMPERATURE() {
  unsigned short temp1, temp2;
  char degree[5];
  temp1 = Adc_Read(0);
  temp2 = (temp1 - 558)/2;
  ByteToStr(temp2, degree);
  LCD_Out_CP(degree);
  LCD_Chr_Cp(223);
  LCD_Chr_Cp('C');
}
/* XOA TIMER0 ----------------------------------------------------------------*/
void CLEAR_TIMER0() {
  delay10s_1 = 0;
  delay10s_2 = 0;
  TMR0 = 0;
}
/* Tinh so ngay Julius -------------------------------------------------------*/
unsigned long jdFromDate(char dd, char mm, char yy) {
  char a, m;
  unsigned y;
  unsigned long jd;
  a = (14 - mm)/12;
  y = (2000 + yy) + 4800 - a;
  m = mm + 12*a - 3;
  jd = dd + (153*m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045;
  if (jd < 2299161) jd = dd + (153*m + 2)/5 + 365*y + y/4 - 32083;
  return jd;
}
/* Tinh ngay soc -------------------------------------------------------------*/
char getNewMoonDay(unsigned long k) {
  double T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew;
  T = k/1236.85;
  T2 = T * T;
  T3 = T2 * T;
  dr = 3.1415926/180;
  Jd1 = 2415020.75933 + 29.53058868*k + 0.0001178*T2 - 0.000000155*T3;
  Jd1 = Jd1 + 0.00033*sin((166.56 + 132.87*T - 0.009173*T2)*dr);
  M = 359.2242 + 29.10535608*k - 0.0000333*T2 - 0.00000347*T3;
  Mpr = 306.0253 + 385.81691806*k + 0.0107306*T2 + 0.00001236*T3;
  F = 21.2964 + 390.67050646*k - 0.0016528*T2 - 0.00000239*T3;
  C1=(0.1734 - 0.000393*T)*sin(M*dr) + 0.0021*sin(2*dr*M);
  C1 = C1 - 0.4068*sin(Mpr*dr) + 0.0161*sin(dr*2*Mpr);
  C1 = C1 - 0.0004*sin(dr*3*Mpr);
  C1 = C1 + 0.0104*sin(dr*2*F) - 0.0051*sin(dr*(M+Mpr));
  C1 = C1 - 0.0074*sin(dr*(M-Mpr)) + 0.0004*sin(dr*(2*F+M));
  C1 = C1 - 0.0004*sin(dr*(2*F-M)) - 0.0006*sin(dr*(2*F+Mpr));
  C1 = C1 + 0.0010*sin(dr*(2*F-Mpr)) + 0.0005*sin(dr*(2*Mpr+M));
  if (T < -11) deltat = 0.001 + 0.000839*T + 0.0002261*T2 - 0.00000845*T3 - 0.000000081*T*T3;
  else deltat= -0.000278 + 0.000265*T + 0.000262*T2;
  JdNew = Jd1 + C1 - deltat;
  return (JdNew + 0.5 + 7/24);
}
/* Tinh toa do mat troi ------------------------------------------------------*/
char getSunLongitude(unsigned long jdn) {
  double T, T2, dr, M, L0, DL, L;
  T = (jdn - 2451545.5 - 7/24) / 36525;
  T2 = T*T;
  dr = 3.1415926/180;
  M = 357.52910 + 35999.05030*T - 0.0001559*T2 - 0.00000048*T*T2;
  L0 = 280.46645 + 36000.76983*T + 0.0003032*T2;
  DL = (1.914600 - 0.004817*T - 0.000014*T2)*sin(dr*M);
  DL = DL + (0.019993 - 0.000101*T)*sin(dr*2*M) + 0.000290*sin(dr*3*M);
  L = L0 + DL;
  L = L*dr;
  L = L - 3.1415926*2*(L/(3.1415926*2));
  return (L / 3.1415926 * 6);
}
/* Tim ngay bat dau thang 11 am lich -----------------------------------------*/
char getLunarMonth11(char yy) {
  unsigned long k, off, nm, sunLong;
  off = jdFromDate(31, 12, (2000 + yy)) - 2415021;
  k = (off / 29.530588853);
  nm = getNewMoonDay(k);
  sunLong = getSunLongitude(nm);
  if (sunLong >= 9) nm = getNewMoonDay(k-1);
  return nm;
}
/* Xac dinh thang nhuan ------------------------------------------------------*/
char getLeapMonthOffset(unsigned long a11) {
  unsigned long k, last, arc, i;
  char tmp;
  k = (a11 - 2415021.076998695) / 29.530588853 + 0.5;
  last = 0;
  i = 1;
  tmp = getNewMoonDay(k+i);
  arc = getSunLongitude(tmp);
  do {
	  last = arc;
	  i++;
	  arc = getSunLongitude(tmp);
  }
  while (arc != last && i < 14);
  return i-1;
}
/* Tinh am lich --------------------------------------------------------------*/
void AM_LICH() {
  unsigned long k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, lunarLeap, diff, leapMonthDiff;
  char dd, mm, yy;
  unsigned short ld, lm, ly;
  dd = Bcd2Dec(date);
  mm = Bcd2Dec(month);
  yy = Bcd2Dec(year);
  dayNumber = jdFromDate(dd, mm, (2000+yy));
  k = (dayNumber - 2415021.076998695) / 29.530588853;
  monthStart = getNewMoonDay(k+1);
  if (monthStart > dayNumber) monthStart = getNewMoonDay(k);
  a11 = getLunarMonth11(2000+yy);
  b11 = a11;
  if (a11 >= monthStart) {
  	lunarYear = 2000+yy;
	  a11 = getLunarMonth11(2000+yy-1);
  }
  else {
  	lunarYear = 2000+yy+1;
  	b11 = getLunarMonth11(2000+yy+1);
  }
  lunarDay = dayNumber-monthStart+1;
  diff = (monthStart - a11)/29;
  lunarLeap = 0;
  lunarMonth = diff+11;
  if (b11 - a11 > 365) {
	  leapMonthDiff = getLeapMonthOffset(a11);
	  if (diff >= leapMonthDiff) {
		  lunarMonth = diff + 10;
		  if (diff == leapMonthDiff) lunarLeap = 1;
	  }
  }
  if (lunarMonth > 12) lunarMonth = lunarMonth - 12;
  if (lunarMonth >= 11 && diff < 4) lunarYear -= 1;
  ld = Dec2Bcd (lunarDay);
  lm = Dec2Bcd (lunarMonth);
  BCD(1,10,ld);
  Lcd_Chr_Cp(':');
  BCD(1,13,lm);
}
/* MODE BUTTON ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Hien thi lich am ----------------------------------------------------------*/
void MODE_1() {
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Out(1, 1, "AM LICH: SORRY");
  Lcd_Out(2, 1, "Next Update");
//  AM_LICH();
  mode = 1;
  Mode_1l:
  if (PORTB.F1 == 0) goto Mode_1l;
}
/* Hien thi nhiet do moi truong ----------------------------------------------*/
void MODE_2() {
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Out(1, 1, "NHIET DO:");
  TEMPERATURE();
  mode = 2;
  Mode_2l:
  if (PORTB.F1 == 0) goto Mode_2l;
}
/* Hien thi cai dat chuong bao thuc ------------------------------------------*/
void MODE_3() {
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Out(1, 1, "CHUONG BAO THUC");
  if (type_al == 0) Lcd_Out(2, 1,"Khong su dung");
  else {
    BCD(2,6,hour_al);
    LCD_Chr_Cp(':');
    BCD(2,9,minute_al);
  }
  mode = 3;
  Mode_3l:
  if (PORTB.F1 == 0) goto Mode_3l;
}
/* Hien thi thong tin ve Version thiet ke ------------------------------------*/
void MODE_4() {
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Out(1, 3, "PIC VIET NAM");
  Lcd_Out(2, 1, "Version 1 - 2007");
  mode = 4;
  Mode_4l:
  if (PORTB.F1 == 0) goto Mode_4l;
}
/* Xu ly phim bam Mode -------------------------------------------------------*/
void MODE_BUTTON() {
  INTCON.INTE = 0;            // OFF ngat ngoai
  PORTE = 0x02;               // Bat LED 2
  MODE_1();                   // Vao man hinh MODE 1
  INTCON.T0IE = 1;            // Kich hoat Timer0 dem thoi gian tre man hinh 10s
  while (delay10s_2 < 5) {    // Quet phim MODE
    Delay_ms(200);            // Khu rung phim
    if (PORTB.F1 == 0) {
      mode++;
      CLEAR_TIMER0();
      switch (mode) {
        case 1 : MODE_1(); break;
        case 2 : MODE_2(); break;
        case 3 : MODE_3(); break;
        case 4 : MODE_4(); break;
        case 5 : goto OUT_MODE;
      }
    }
  }
  OUT_MODE:                      // Ra khoi vong quet
  PORTE = 0x00;                  // OFF LED 2
  Lcd_Cmd(Lcd_CLEAR);            // Xoa man hinh
  CLEAR_TIMER0();                // Xoa bo dem thoi gian tre man hinh
}
/* SET BUTTON ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Cap nhat du lieu cai dat --------------------------------------------------*/
void SET_DATA() {
  I2C_Start();
  I2C_Wr(0xD0);
  I2C_Wr(0x00);
  I2C_Wr(second);
  I2C_Wr(minute);
  I2C_Wr(hour);
  I2C_Wr(day);
  I2C_Wr(date);
  I2C_Wr(month);
  I2C_Wr(year);
  I2C_Stop();
  EEprom_Write(0x00, hour_al);
  EEprom_Write(0x01, minute_al);
  EEprom_Write(0x02, type_al);
}
/* Up data -------------------------------------------------------------------*/
unsigned short UP_BUTTON(unsigned short var) {
  Delay_ms(200);
  CLEAR_TIMER0();
  var = Bcd2Dec(var);
  var++;
  var = Dec2Bcd(var);
  return var;
}
/* Down data -----------------------------------------------------------------*/
unsigned short DOWN_BUTTON(unsigned short var) {
  Delay_ms(200);
  CLEAR_TIMER0();
  var = Bcd2Dec(var);
  if (var == 0) var = 101;
  else var--;
  var = Dec2Bcd(var);
  return var;
}
/* Nhap nhay underline cursor ------------------------------------------------*/
void BLINK_CURSOR() {
  Lcd_Cmd(LCD_MOVE_CURSOR_LEFT);
  Lcd_Cmd(LCD_UNDERLINE_ON);
}
/* Hieu chinh gio ------------------------------------------------------------*/
void SET_HOUR() {
  Delay_ms(200);
  hour_lb:
  if (PORTB.F2 == 0) {
    CLEAR_TIMER0();
    goto hour_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(100);
    if (PORTB.F3 == 0) hour = UP_BUTTON(hour);
    if (Bcd2Dec(hour) == 24) hour = Dec2Bcd(0);
    if (PORTB.F4 == 0) hour = DOWN_BUTTON(hour);
    if (Bcd2Dec(hour) == 101 ) hour = Dec2Bcd(23);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,5,hour);
    BLINK_CURSOR();
  }
}
/* Hieu chinh phut -----------------------------------------------------------*/
void SET_MINUTE() {
  Delay_ms(100);
  minute_lb:
  if (PORTB.F2 == 0) {
    CLEAR_TIMER0();
    goto minute_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(200);
    if (PORTB.F3 == 0) minute = UP_BUTTON(minute);
    if (Bcd2Dec(minute) == 60) minute = Dec2Bcd(0);
    if (PORTB.F4 == 0) minute = DOWN_BUTTON(minute);
    if (Bcd2Dec(minute) == 101 ) minute = Dec2Bcd(59);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,8,minute);
    BLINK_CURSOR();
  }
}
/* Hieu chinh giay -----------------------------------------------------------*/
void SET_SECOND() {
  Delay_ms(200);
  second_lb:
  if (PORTB.F2 == 0) {
    CLEAR_TIMER0();
    goto second_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(100);
    if (PORTB.F3 == 0) second = UP_BUTTON(second);
    if (Bcd2Dec(second) == 60) second = Dec2Bcd(0);
    if (PORTB.F4 == 0) second = DOWN_BUTTON(second);
    if (Bcd2Dec(second) == 101 ) second = Dec2Bcd(59);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,11,second);
    BLINK_CURSOR();
  }
}
/* Cai dat thoi gian CLOCK ---------------------------------------------------*/
void SET_1() {
  Lcd_Cmd(Lcd_CLEAR);
  LCD_Out(1,1,"Cai dat dong ho:");
  BCD(2,5,hour);
  LCD_Chr_Cp(':');
  BCD(2,8,minute);
  LCD_Chr_Cp(':');
  BCD(2,11,second);
  Delay_ms(200);
  Set_1l:
  if (PORTB.F2 == 0) goto Set_1l;
  SET_HOUR();
  SET_MINUTE();
  SET_SECOND();
}
/* Cai dat Thu (DAY) ---------------------------------------------------------*/
void SET_DAY() {
  Delay_ms(200);
  day_lb:
  if (PORTB.F2 == 0) {
    CLEAR_TIMER0();
    goto day_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(100);
    if (PORTB.F3 == 0) day = UP_BUTTON(day);
    if (Bcd2Dec(day) == 9) day = Dec2Bcd(2);
    if (PORTB.F4 == 0) day = DOWN_BUTTON(day);
    if (Bcd2Dec(day) == 1) day = Dec2Bcd(8);
    TRANSFORM_RTC();
    Lcd_Cmd(LCD_CURSOR_OFF);
    LCD_Out(2,1,day_txt);
    BLINK_CURSOR();
  }
}
/* Cai dat ngay (DATE) -------------------------------------------------------*/
void SET_DATE() {
  Delay_ms(200);
  date_lb:
  if (PORTB.F2 == 0) {
    CLEAR_TIMER0();
    goto date_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(100);
    if (PORTB.F3 == 0) date = UP_BUTTON(date);
    if (Bcd2Dec(date) == 32) date = Dec2Bcd(1);
    if (PORTB.F4 == 0) date = DOWN_BUTTON(date);
    if (Bcd2Dec(date) == 0 ) date = Dec2Bcd(31);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,7,date);
    BLINK_CURSOR();
  }
}
/* Cai dat thang (MONTH) -----------------------------------------------------*/
void SET_MONTH() {
  Delay_ms(100);
  month_lb:
  if (PORTB.F2 == 0) {
      CLEAR_TIMER0();
    goto month_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(200);
    if (PORTB.F3 == 0) month = UP_BUTTON(month);
    if (Bcd2Dec(month) == 13) month = Dec2Bcd(1);
    if (PORTB.F4 == 0) month = DOWN_BUTTON(month);
    if (Bcd2Dec(month) == 0 ) month = Dec2Bcd(12);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,10,month);
    BLINK_CURSOR();
  }
}
/* Cai dat nam (YEAR) --------------------------------------------------------*/
void SET_YEAR() {
  Delay_ms(200);
  year_lb:
  if (PORTB.F2 == 0) {
      CLEAR_TIMER0();
    goto year_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(100);
    if (PORTB.F3 == 0) year = UP_BUTTON(year);
    if (Bcd2Dec(year) == 100) year = Dec2Bcd(0);
    if (PORTB.F4 == 0) year = DOWN_BUTTON(year);
    if (Bcd2Dec(year) == 101) year = Dec2Bcd(99);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,15,year);
    BLINK_CURSOR();
  }
}
/* Cai dat lich duong CALENDAR ---------------------------------------------- */
void SET_2() {
  Lcd_Cmd(Lcd_CLEAR);
  LCD_Out(1,1,"Cai dat Lich:");
  LCD_Out(2,1,day_txt);
  BCD(2,7,date);
  LCD_Chr_Cp('/');
  BCD(2,10,month);
  LCD_Out_Cp("/20");
  BCD(2,15,year);
  Delay_ms(200);
  Set_2l:
  if (PORTB.F2 == 0) goto Set_2l;
  SET_DAY();
  SET_DATE();
  SET_MONTH();
  SET_YEAR();
}
/* Cai dat gio bao thuc ------------------------------------------------------*/
void TIME_ALARM() {
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Out(1,1,"Gio rung Chuong:");
  BCD(2,6,hour_al);
  Lcd_Out(2,8,":");
  BCD(2,9,minute_al);
  Delay_ms(200);
  Set_4l:
  if (PORTB.F2 == 0) goto Set_4l;
  Delay_ms(200);
  hour_al_lb:
  if (PORTB.F2 == 0) {
    CLEAR_TIMER0();
    goto hour_al_lb;
  }
  Delay_ms(200);
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(100);
    if (PORTB.F3 == 0) hour_al = UP_BUTTON(hour_al);
    if (Bcd2Dec(hour_al) == 24) hour_al = Dec2Bcd(0);
    if (PORTB.F4 == 0) hour_al = DOWN_BUTTON(hour_al);
    if (Bcd2Dec(hour_al) == 101 ) hour_al = Dec2Bcd(23);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,6,hour_al);
    BLINK_CURSOR();
  }
  Delay_ms(200);
  minute_al_lb:
  if (PORTB.F2 == 0) {
    CLEAR_TIMER0();
    goto minute_al_lb;
  }
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(100);
    if (PORTB.F3 == 0) minute_al = UP_BUTTON(minute_al);
    if (Bcd2Dec(minute_al) == 60) minute_al = Dec2Bcd(0);
    if (PORTB.F4 == 0) minute_al = DOWN_BUTTON(minute_al);
    if (Bcd2Dec(minute_al) == 101 ) minute_al = Dec2Bcd(59);
    Lcd_Cmd(LCD_CURSOR_OFF);
    BCD(2,9,minute_al);
    BLINK_CURSOR();
  }
}
/* Cai dat bao thuc ----------------------------------------------------------*/
void SET_3() {
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Cmd(LCD_CURSOR_OFF);
  Lcd_Out(1,1,"Cai dat Chuong:");
  Delay_ms(200);
  Set_3l:
  if (PORTB.F2 == 0) goto Set_3l;
  Delay_ms(200);
  while ((delay10s_2 < 5) && (PORTB.F2)) {
    Delay_ms(200);
    if ((PORTB.F3 == 0) || (PORTB.F4 == 0)) {
      if (type_al == 0) type_al = 1;
      else type_al =0;
      CLEAR_TIMER0();
    }
    if (type_al == 0) Lcd_Out(2, 1,"Khong");
    if (type_al == 1) Lcd_Out(2, 1,"Co   ");
  }
  if (type_al == 1) TIME_ALARM();
}
/* Xu ly nut bam Set ---------------------------------------------------------*/
void SET_BUTTON() {
  INTCON.INTE = 0;            // OFF ngat ngoai
  PORTE = 0x04;               // Bat LED 3
  INTCON.T0IE = 1;            // Kich hoat Timer0 dem thoi gian tre man hinh 30s
  SET_1();
  SET_2();
  SET_3();
  PORTE = 0x00;               // OFF LED 3
  Lcd_Cmd(Lcd_CLEAR);         // Xoa man hinh
  Lcd_Cmd(Lcd_CURSOR_OFF);    // OFF con tro man hinh
  CLEAR_TIMER0();             // Xoa bo dem thoi gian tre man hinh
  SET_DATA();                 // Cap nhat du lieu
}
/* Nhay bao chuong -----------------------------------------------------------*/
void BLINK_ALARM() {
  INTCON.INTE = 0;            // OFF ngat ngoai
  PORTE = 0x00;
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Cmd(Lcd_CURSOR_OFF);
  Lcd_Out(1,1,"Bay gio la ");
  BCD(1,12,hour_al);
  Lcd_Out(1,14,":");
  BCD(1,15,minute_al);
  LCD_Out(2,1,day_txt);
  BCD(2,7,date);
  LCD_Chr_Cp('/');
  BCD(2,10,month);
  LCD_Out_Cp("/20");
  BCD(2,15,year);
  while ((count_al < 100) && (PORTB.F1 == 1) && (PORTB.F2 == 1) && (PORTB.F3 == 1) && (PORTB.F4 == 1)) {
    Delay_ms(200);
    PORTE = ~PORTE;
    count_al++;
  }
  Lcd_Cmd(Lcd_CLEAR);
  PORTE = 0x00;
}
/* Quet phim -----------------------------------------------------------------*/
void CYCLE_BUTTON() {
  while(1) {
    INTCON.T0IE = 0;
    INTCON.INTE = 1;
    if (flag_time == 1) {
      UPDATE_TIME();
      flag_time = 0;
    }
    Delay_ms(200);
    if (PORTB.F1 == 0) MODE_BUTTON();
    if (PORTB.F2 == 0) SET_BUTTON();
    if ((hour == hour_al) && (minute == minute_al) && (second == 0x00)) BLINK_ALARM();
    count_al = 0;
  }
}
/* XU LY NGAT *****************************************************************/
void interrupt() {
  if (INTCON.T0IF) {
    delay10s_1++;
    if (delay10s_1 == 200) {
      delay10s_2++;
      delay10s_1 = 0;
    }
  INTCON.T0IF = 0;
  }
  if (INTCON.INTF) {
    flag_time = 1;
    INTCON.INTF = 0; // Xoa co ngat ngoai
  }
}
/* CHUONG TRINH CHINH *********************************************************/
void MAIN() {
  INIT_MAIN();
  CYCLE_BUTTON();
}
/* KET THUC *******************************************************************/
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-10-2007, 06:34 PM   #38
cuongngao
Nhập môn đệ tử
 
cuongngao's Avatar
 
Tham gia ngày: Oct 2007
Nơi Cư Ngụ: Hà Nội
Bài gửi: 2
:
ai có thể cho mình biết là những chú PIC nào hỗ trợ module CAN ko?mình đang làm 1 đề tài giao thức CAN mà.mình định sử dụng con 18f458 thì không có trong thư viện Protel99 SE, đang định chuyển xuống 16f877 ko biết có đc ko nữa???
__________________
Chính vì ngược gió mà cánh diều bay lên. Hoa Thạch Thảo
cuongngao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-10-2007, 09:54 PM   #39
hampic
Đệ tử 1 túi
 
hampic's Avatar
 
Tham gia ngày: Sep 2007
Bài gửi: 14
:
Trích:
Nguyên văn bởi tinhthanthep View Post
Đã gửi software và crack phiên bản 6.2.1.0 cho linhnc308.
Nếu bạn nào muốn làm cái mạch này để học con PIC16F877A thì liên hệ với mình , mình cho mượn film để đi làm mạch in cho đỡ tốn xèng. Diện tích mạch PCB là 1dm2. Mạch in 2 lớp có phủ flux và mạ bạc ở viện điện tử là 62k/dm2
Cho hỏi viện này nằm ở đâu vậy? Ở đó làm mạch 4 lớp được ko vậy bạn?
Thks!
hampic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2007, 11:33 AM   #40
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Viện điện tử: 156A quán thánh. đt: 04.7163242
Chỉ làm được mạch in đến 2 lớp
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2007, 11:35 AM   #41
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Trích:
Nguyên văn bởi cuongngao View Post
ai có thể cho mình biết là những chú PIC nào hỗ trợ module CAN ko?mình đang làm 1 đề tài giao thức CAN mà.mình định sử dụng con 18f458 thì không có trong thư viện Protel99 SE, đang định chuyển xuống 16f877 ko biết có đc ko nữa???
Oái sao lại đi xuống thế bạn ơi. Đi lên dsPIC30F6010A là có tích hợp CAN roài.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2007, 01:50 PM   #42
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Tại sao đồng chí này không sửa bài Lịch vạn niên này để tham gia cuộc thi tháng 10 nhỉ . Hay là anh tinhthanthep muốn để học bổng lại cho các bạn sinh viên . Nếu vậy sao các bạn sinh viên không thực hiện lại những gì anh tinhthanthep giới thiệu, xem như một bài thực hành để tham gia cuộc thi thiết kế PIC tháng 10 nhỉ?

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2007, 06:18 PM   #43
vandungevn
Đệ tử 5 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 116
:
Send a message via Yahoo to vandungevn
Dũng cũng đang muốn tìm hiểu thêm về lịch vạn niên để làm mà sao không thể đọc được nó kể cả trong CCS và MPLAB, bác nào biết cách để đọc được con DS1307 không, xin chân thành cảm ơn.

Mà tui thấy ở 156A Quán thánh làm mạch cũng được đó, tui thường gửi qua email và sau đó đến lấy, giá cả cũng được đó.
__________________
Hãy chung sức vì nền Điện Tử Viêt Nam...! Sản Phẩm thương hiệu Việt "Made in Viet Nam"
Nguyen Van Dung - Nguyễn Văn Dũng. Mobile : (+84) 97 329 1368
Nick name : VanDungEvn ( Yahoo + Skype )
Tư vấn & thiết kế điện tử + Làm mạch in + Hoàn thiện sản phẩm điện tử. Mạch nạp 89-PIC-AVR.
Email: vandungevn@gmail.com Website: www.dientuphuongdung.com
Xóm Mới - Nguyên Xá - Minh Khai - Từ Liêm - Hà Nôi - Viet Nam.

thay đổi nội dung bởi: falleaf, 15-10-2007 lúc 10:01 PM.
vandungevn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-12-2007, 10:05 AM   #44
thongtr
Đệ tử 2 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 27
:
Send a message via Yahoo to thongtr
các pác chỉ cho mình với! mình đang làm với con lm335 nhưng sao nhiệt độ của nó không có ổn định tới chênh lệch nhau tới 4 độ. các bác có cách gì chỉ cho mình với! mình đang dùng con 16F877a
__________________
thongtr0601@yahoo.com!!
Giúp nhau cùng tiến bộ.....
thongtr vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-12-2007, 03:40 PM   #45
vandungevn
Đệ tử 5 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 116
:
Send a message via Yahoo to vandungevn
ban cần có mọt mạch điện trwf và nhân áp,
khi nào rỗi thì mình sẽ post lên cho nhé
Hen gặp lại sau, chúc vui.
__________________
Hãy chung sức vì nền Điện Tử Viêt Nam...! Sản Phẩm thương hiệu Việt "Made in Viet Nam"
Nguyen Van Dung - Nguyễn Văn Dũng. Mobile : (+84) 97 329 1368
Nick name : VanDungEvn ( Yahoo + Skype )
Tư vấn & thiết kế điện tử + Làm mạch in + Hoàn thiện sản phẩm điện tử. Mạch nạp 89-PIC-AVR.
Email: vandungevn@gmail.com Website: www.dientuphuongdung.com
Xóm Mới - Nguyên Xá - Minh Khai - Từ Liêm - Hà Nôi - Viet Nam.
vandungevn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 10:44 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam