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 11-09-2007, 03:59 PM   #1
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Vậy ta làm nốt bài toán sau là xong hẳn về cái nút bấm: Bài toán là ta bấm phím RB1 thì LEd1 sáng, bấm phát nữa thì nó tắt....Chương trìng như sau:

Code:
void MAIN() {
PORTB = 0; // Xoá dữ liệu cổng B
TRISB = 0xFF; // Định nghĩa cổng B là input 

PORTE = 0; 
TRISE = 0;
ADCON1 = 0xE;

Loop:
if (PORTB.F1 == 0) {                   // Kiểm tra nút ấn RB1 có bấm không? Nếu bấm thì
if (PORTE.F0 == 0)  PORTE.F0 = 1 // kiểm tra xem đèn đang tắt không? nếu đúng thì bật lên
else PORTE.F0 = 0; // nếu sai thì tắt nó đi
Delay_ms(50);  // Tạo trễ 50ms để khử hết hiện tượng rung phím
Loop1:
if (PORTB.F1 == 0) goto Loop1;   // chạy lòng vòng đợi đến khi tay người nhá hẳn nút bấm ra
}
goto Loop; // Lặp lại vòng lặp kiểm tra nút bấm

}

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:47 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-09-2007, 04:15 PM   #2
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Tiếp theo ta làm sang cái LCD nhé. Bạn nào mới làm quen với LCD mà viết bằng assembly thì chắc mất vài ngày quá. Nếu viết bằng MikroC bạn nào kém lắm cũng chỉ 30 phút là xong. Nói thế để các bạn thấy rằng viết ứng dụng mà dùng MikroC thì thôi rồi, viết nhanh và ứng dụng nhanh đi vào cuộc sống, chứ cứ tỉa tót bằng assem thì khi sản phẩm ra thị trường thì đối thủ cạnh tranh đã ra mấy phiên bản khác nhau mất roài.
Giờ ta viết chương trình để hiển thị dòng chữ Hello Picvietnam nhé. Chương trình như sau:

Code:
void INIT_MAIN() {
// Khoi tao cong B
  PORTB   = 0;
  TRISB   = 0xFF;
// Khoi tao cong D
  PORTD   = 0;           // Xóa dữ liệu đang tồn tại sẵn trên cổng D
  TRISD   = 0;            // Định nghĩa cổng D là digital Output
// Khoi tao cong E
  PORTE   = 0;
  TRISE   = 0;
  ADCON1  = 0xE;
// Khoi tao LCD
  Lcd_Config(&PORTD,4,7,6,3,2,1,0);     // các bạn xem sơ đồ mạch để hiểu được cách khai các tham số của hàm này
  Lcd_Cmd(Lcd_CLEAR);                // xóa màn hình 
  Lcd_Cmd(Lcd_CURSOR_OFF);         // tắt con trỏ nhấp nháy của LCD

void LCD_DISPLAY() {
  LCD_Out(1,1,"Hello");                // hiện chứ Hello bắt đầu ở dòng 1 cột 1
  LCD_Out(2,1,"Picvietnam");        // hiện chữ Picvietnam bắt đầu ở dòng 2 cột 1
}

void MAIN() {
  INIT_MAIN();
  LCD_DISPLAY();
}
Bạn nên sắp xếp các chương trình con như trên. Trong chương trình chính ta chỉ việc gọi tên các chương trình con thôi.

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:47 AM. Lý do: định dạng lại code
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, 10:15 AM   #3
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 17-07-2008, 11:56 AM   #4
tallht
Đệ tử 5 túi
 
tallht's Avatar
 
Tham gia ngày: Mar 2008
Nơi Cư Ngụ: Bình Thạnh, TPHCM
Bài gửi: 98
:
Cool ????

Trích:
Nguyên văn bởi tinhthanthep View Post
Tiếp theo ta làm sang cái LCD nhé. Bạn nào mới làm quen với LCD mà viết bằng assembly thì chắc mất vài ngày quá. Nếu viết bằng MikroC bạn nào kém lắm cũng chỉ 30 phút là xong. Nói thế để các bạn thấy rằng viết ứng dụng mà dùng MikroC thì thôi rồi, viết nhanh và ứng dụng nhanh đi vào cuộc sống, chứ cứ tỉa tót bằng assem thì khi sản phẩm ra thị trường thì đối thủ cạnh tranh đã ra mấy phiên bản khác nhau mất roài.
Giờ ta viết chương trình để hiển thị dòng chữ Hello Picvietnam nhé. Chương trình như sau:

Code:
void INIT_MAIN() {
// Khoi tao cong B
  PORTB   = 0;
  TRISB   = 0xFF;
// Khoi tao cong D
  PORTD   = 0;           // Xóa dữ liệu đang tồn tại sẵn trên cổng D
  TRISD   = 0;            // Định nghĩa cổng D là digital Output
// Khoi tao cong E
  PORTE   = 0;
  TRISE   = 0;
  ADCON1  = 0xE;
// Khoi tao LCD
  Lcd_Config(&PORTD,4,7,6,3,2,1,0);     // các bạn xem sơ đồ mạch để hiểu được cách khai các tham số của hàm này
  Lcd_Cmd(Lcd_CLEAR);                // xóa màn hình 
  Lcd_Cmd(Lcd_CURSOR_OFF);         // tắt con trỏ nhấp nháy của LCD

void LCD_DISPLAY() {
  LCD_Out(1,1,"Hello");                // hiện chứ Hello bắt đầu ở dòng 1 cột 1
  LCD_Out(2,1,"Picvietnam");        // hiện chữ Picvietnam bắt đầu ở dòng 2 cột 1
}

void MAIN() {
  INIT_MAIN();
  LCD_DISPLAY();
}
Bạn nên sắp xếp các chương trình con như trên. Trong chương trình chính ta chỉ việc gọi tên các chương trình con thôi.

bác ơi ! mình đã tìm được thư viện lệnh của LCD gòy! nhưng sao viết như bác chỉ mà nó chẳng xuất ra chữ nào hết
có file kèm theo đây:
File Kèm Theo
File Type: rar MIKRO C.rar (28.5 KB, 248 lần tải)
__________________
-------------------------------------------------------------------
Cung cấp bo mạch thực hành Arduino và các mạch sáng tạo.
Mời tham quan: https://www.facebook.com/eshop1109

Cung cấp dịch vụ order hàng từ Aliexpress
Liên hệ: https://www.facebook.com/Mua-h%E1%BB...5265931515571/
tallht vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2007, 09:43 AM   #5
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Hôm nay ta tiếp tục vào mục chính của bài toán đó là làm việc với con IC thời gian thực ds1307. Trước khi tiếp tục ta phải tìm hiểu qua về con IC này. ds1307 dùng một thạch anh 32.768kHz để tạo dao động tính thời gian, 1 pin V để nuôii khi mất nguồn nuôi ngoài. 1307 có tất cả 64 thanh ghi có địa chỉ từ 00h đến 3FH. 7 thanh ghi đầu tiên chứa dữ liệu về giây, phút, giờ, thứ, ngaỳ, tháng, năm dứoi dạng mã hóa BCD. thanh ghi thứ 8 là thanh ghi điều khiển. 56 thanh ghi còn lại là bộ nhớ RAM. ds1307 giao tiếp với thế giới bên ngoài bằng kiểu giao tiếp nối tiếp I2C. I2C dùng 2 đường truyền SCL và SDA. Ngoài ra ds1307 có chân SQW/OUT phát ra các xung có tần số 1Hz, 4.096kHz, 8.192kHz, 32.768 kHz. Ta sẽ sử dụng tần số 1Hz để cứ sau 1 s thì vi điều khiển phải cập nhật thông tin lại một lần và hiển thị lên màn hình. Vì vậy ta nối chân này của ds1307 vào chân ngắt ngoài INT của PIC16F877A. Việc hiểu thế nào là I2C các bạn sang luồng giao tiếp I2C đọc, nếu không hiểu cũng chẳng sao, với trình dịch MikroC này thì các bạn cứ việc viết theo mẫu sẵn có là ok. Tất nhiên chúng ta thường có tham vọng phải hiểu cái gì nó phải tận gốc rễ, nhưng cũng nên biêt rằng sức người có hạn không thể cho cả thế giới vào cái đầu nhỏ bé của mình được nên những gì mà thằng khác nó đã chuẩn hóa, môddun hóa rồi thì cứ việc dùng đừng lăn tăn xem cơ chế hoạt động của nó thế nào làm gì cho mất công. Cái đó để sau đi, đôi khi bạn làm xong rồi quay lại đọc những cái trước kia chưa hiểu lại thấy hiểu nhanh hơn. Thế nên các bạn cứ theo dõi chương trình nếu có chỗ nào ko hiểu phải phát biểu nhé.
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2007, 02:21 PM   #6
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
Ban đầu, ds1307 chưa có giá trị nào cả trong các thanh ghi. Vì vậy, việc đầu tiên là phải nạp một giá trị bất kỳ cho các thanh ghi. Chương trình sau sẽ thực hiện công việc này. Sau này , bạn có thể dùng 4 nút bấm để hiệu chỉnh lại thời gian cho đúng với thực tế.

Code:
void INIT_MAIN() {
// Khoi tao truyen thong I2C
  I2C_Init(100000);       // Kích hoạt môddun truyền thông i2c với tốc độ baud là 100kHz
// Khoi tao DS1307
  I2C_Start();    // điều kiện start
  I2C_Wr(0xD0); // truyền địa chỉ của ds1307 và chọn ghi dữ liệu lên ds1307
  I2C_Wr(0x00); // Truyền địa chỉ ô nhớ đầu tiên của ds1307
  I2C_Wr(0x13); // Khoi tao gia tri ban dau cho  thanh ghi giây
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi phút
  I2C_Wr(0x02); // Khoi tao gia tri ban dau cho  thanh ghi giờ
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi thứ
  I2C_Wr(0x05); // Khoi tao gia tri ban dau cho  thanh ghi ngày
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi tháng
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi năm
  I2C_Wr(0x90); // đặt cấu hình cho thanh ghi điều khiển, sử dụng xung 1Hz.
  I2C_Stop();    // Điều kiện stop
}
Chương trình chính
Code:
void MAIN() {
  INIT_MAIN();
}

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:48 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2007, 03:43 PM   #7
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
vậy là từ bây giờ con ds1307 đã bắt đầu hoạt động và tự cập nhật dữ liệu về thời gian. chỉ khi nào hết pin nó mời ngừng hoạt động. Tiếp theo ta viết một chương trình đọc dữ liệu từ ds1307 rồi xuất ra màn hình LCD. Cứ 1s thì dữ liệu được cập nhật một lần và gửi ra màn hình LCD. Chương trình sẽ như sau:

Code:
/* KHAI BAO BIEN */
unsigned short second, minute, hour, day, date, month, year, flag_time;
char *day_txt;

/* KHOI TAO */
void INIT_MAIN() {
// Khoi tao cong A
  PORTA   = 0;
  TRISA   = 0xFF;
// Khoi tao cong B
  PORTB   = 0;
  TRISB   = 0xFF;
// Khoi tao cong D
  PORTD   = 0;
  TRISD   = 0;
// Khoi tao cong E
  PORTE   = 0;
  TRISE   = 0;
  ADCON1  = 0xE;
// Khoi tao LCD
  Lcd_Config(&PORTD,4,7,6,3,2,1,0);
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Cmd(Lcd_CURSOR_OFF);
// Khoi tao truyen thong I2C
  I2C_Init(100000);
// Khoi tao ngat ngoai 
  INTCON = 0x90; // Mo ngat toan cuc, mo ngat ngoai, xoa co ngat ngoai,   OPTION_REG = 0x87; // Chon suon len cho ngat ngoai 
}

/* 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 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;
  }
}
/* HIEN THI LCD */
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);
}
void LCD_DISPLAY() {
  LCD_Out(1,1,day_txt);
  BCD(1,5,date);
  LCD_Chr_Cp('/');
  BCD(1,8,month);
  LCD_Out_Cp("/20");
  BCD(1,13,year);
  BCD(2,1,hour);
  LCD_Chr_Cp(':');
  BCD(2,4,minute);
  LCD_Chr_Cp(':');
  BCD(2,7,second);
  LCD_Out(2,10,"T=");
  BCD(2,12,temp);
  LCD_Chr_Cp(223);
  LCD_Chr_Cp('C');
}
void DISPLAY_TIME() {
  READ_RTC();
  TRANSFORM_RTC();
  LCD_DISPLAY();
  PORTE.F0 = ~PORTE.F0;
}

/* XU LY NGAT */
void interrupt() {
    flag_time = 1;
    INTCON.INTF = 0; // Xoa co ngat ngoai
}

/* CHUONG TRINH CHINH */
void MAIN() {
  INIT_MAIN();
  while(1) {
    INTCON.INTE = 1;
    if (flag_time == 1) {
      DISPLAY_TIME();
      flag_time = 0;
    }
  }
}

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:48 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-09-2007, 07:27 PM   #8
HL2
Nhập môn đệ tử
 
Tham gia ngày: Jun 2007
Bài gửi: 6
:
Tinhthanthep cho mình xin cái software và Crack với nha. Cũng tính mượn bạn film để làm board mạch nhưng chắc là khó rồi, vì mình ở HCM. Nếu cỏ thể cho mình xin file để tập làm.
Địa chỉ mail của mình: hlhluc@yahoo.com
Cám ơn bạn nhiều, những bài viết của các bạn rất hay.
HL2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-09-2007, 12:11 AM   #9
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   #10
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 27-09-2007, 10:40 PM   #11
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, 06:34 PM   #12
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 15-10-2007, 11:35 AM   #13
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, 11:33 AM   #14
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, 01:50 PM   #15
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
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:04 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