Thông báo

Collapse
No announcement yet.

Tutorial: Led ma trận bằng hình ảnh (completed)

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nguyên văn bởi vaa_dtvn Xem bài viết
    Có ai dùng PIC ko? mình dùng 16F886 nè, mà mấy cái hiệu ứng ko biết lập trình sao, ví như muốn dịch trái hay dịch phải. Vì dùng SPI, mỗi lần xuất là xuất luôn 8bit nên ko biết sao cho nó dịch được!
    tham khảo nhé
    unsigned char i,j;
    for(i=0;i<=4;i++)//
    {
    for(j=0;j<=15;j++)
    {
    temp[(j*5+i)]=(temp[(j*5+i)]<<1)|(temp[((j*5+i)+1)]>>7);
    if(a>=73)temp[j*5+4]=0;
    }
    }

    Comment






    • code:
      giao tiep I2C (cái này mình tham khảo trên diễn đàn thôi)
      #define SCL P1_0
      #define SDA P1_1
      //=====================
      /* giao tiep i2c */

      //-------------------------
      void delay(){
      int i;
      for (i=0;i<10;i++);
      }

      void SCL_high(){
      SCL=1;
      delay();
      }

      void SCL_low(){
      SCL=0;
      delay();
      }
      //------------------------

      //=======================================

      //------------------------
      void i2c_start(){
      SDA=1;
      SCL=1;
      SDA=0;
      delay();
      SCL=0;
      SDA=1;
      }

      void i2c_stop(){
      SDA=0;
      SCL=1;
      delay();
      SDA=1;
      }
      //-------------------------


      //==========*** Ham ghi gia tri vao i2c ***================
      bit i2c_write(unsigned char dat){
      unsigned char i;
      bit outbit;
      for (i=1;i<=8;i++){
      outbit=dat&0x80;
      SDA=outbit;
      dat=dat<<1;
      SCL_high();
      SCL_low();
      }
      SDA=1; //set SDA to receive Acknowedge
      SCL_high();
      outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
      SCL_low();
      return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
      }
      //================================================== ====
      giao tiếp với DS1307
      //================================================== ==

      /* giao tiep voi IC DS1307 */

      //==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
      void rtc_write(unsigned char address, unsigned char data1){
      i2c_start();
      i2c_write(0xd0); // dia chi cua DS1307 che do ghi
      i2c_write(address); //dia chi cua thanh ghi
      /* i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
      i2c_stop();
      }

      //======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
      unsigned char rtc_read(unsigned char address){
      unsigned char data1;
      i2c_start();
      i2c_write(0xd0); //dia chi cua DS1307 che do ghi
      i2c_write(address); //dia chi thanh ghi can doc
      i2c_start(); //restart
      i2c_write(0xd1); //dia chi DS1307 che do doc
      data1=i2c_read(0);
      i2c_stop();
      /*data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
      return(data1);
      }

      //================================
      main:
      #include <at89x51.h>

      #define SCL P1_0
      #define SDA P1_1
      /* dinh nghia cac bien hien thi */
      #define LED P0 // xuat ma led
      #define DP P0_7
      /*quet led*/
      #define on 1
      #define off 0
      #define led1 P1_2 //dung de quet led
      #define led2 P1_3
      #define led3 P1_4
      #define led4 P1_5
      #define led5 P1_6
      #define led6 P1_7
      /* nut an */
      #define mode P2_0
      #define tang P2_1
      #define giam P2_2
      #define change P2_3

      /*khai bao cac bien gio phut giay*/
      unsigned char index;
      unsigned char gio,phut,giay,ngay,thang,nam;
      unsigned char gio1,gio2,phut1,phut2,giay1,giay2;
      unsigned char ngay1,ngay2,thang1,thang2,nam1,nam2;
      bit bit_mode1,bit_mode2,bit_mode3,bit_mode4,bit_tang1, bit_tang2,bit_tang3,bit_tang4;
      bit bit_giam1,bit_giam2,bit_giam3,bit_giam4,bit_change 1,bit_change2,bit_change3,bit_change4;
      unsigned int dem=0;
      #define clear_bit {bit_mode1=0; bit_mode2=0; bit_mode3=0; bit_mode4=0;}
      #define clear_bit1 {bit_tang1=0; bit_tang2=0; bit_tang3=0; bit_tang4=0; }
      #define clear_bit2 {bit_giam1=0; bit_giam2=0; bit_giam3=0; bit_giam4=0; }
      #define clear_bit3 {bit_change1=0; bit_change2=0; bit_change3=0; bit_change4=0;}

      led_code[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
      led_code1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 };


      //===================/* giao tiep i2c */================================================== =
      void delay(){
      int i;
      for (i=0;i<10;i++);
      }

      void SCL_high(){
      SCL=1;
      delay();
      }

      void SCL_low(){
      SCL=0;
      delay();
      }
      //------------------------

      //=======================================

      //------------------------
      void i2c_start(){
      SDA=1;
      SCL=1;
      SDA=0;
      delay();
      SCL=0;
      SDA=1;
      }

      void i2c_stop(){
      SDA=0;
      SCL=1;
      delay();
      SDA=1;
      }
      //--------------------------------------------------------------------------------


      //==========*** Ham ghi gia tri vao i2c ***================
      bit i2c_write(unsigned char dat){
      unsigned char i;
      bit outbit;
      for (i=1;i<=8;i++){
      outbit=dat&0x80;
      SDA=outbit;
      dat=dat<<1;
      SCL_high();
      SCL_low();
      }
      SDA=1; //set SDA to receive Acknowedge
      SCL_high();
      outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
      SCL_low();
      return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
      }
      //--------------------------------------------------------------------------------

      //=========*** Ham doc gia tri tu i2c ***=================
      unsigned char i2c_read(bit ack){
      unsigned char i,dat;
      bit inbit;

      dat=0;
      for(i=1;i<=8;i++){
      SCL_high();
      inbit=SDA;
      dat=dat<<1;
      dat=dat|inbit;
      SCL_low();
      }
      if (ack){ //set SDA=0 (ACK)
      SDA=0;
      }
      else { //set Not ACK
      SDA=1;
      }
      SCL_high();
      SCL=0;
      SDA=1; //set SDA=1 for next read
      delay();
      return(dat);
      }
      //============/* ket thuc cac ham giao tiep cho i2c */===============================




      //==========================************************ ****=============================
      //=============/* giao tiep voi IC DS1307 */=========================================
      //==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
      void rtc_write(unsigned char address, unsigned char data1){
      i2c_start();
      i2c_write(0xd0); // dia chi cua DS1307 che do ghi
      i2c_write(address); //dia chi cua thanh ghi
      i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
      i2c_stop();
      }

      //======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
      unsigned char rtc_read(unsigned char address){
      unsigned char data1;
      i2c_start();
      i2c_write(0xd0); //dia chi cua DS1307 che do ghi
      i2c_write(address); //dia chi thanh ghi can doc
      i2c_start(); //restart
      i2c_write(0xd1); //dia chi DS1307 che do doc
      data1=i2c_read(0);
      i2c_stop();
      data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
      return(data1);
      }
      //========================***********************=== ============================


      //================================================== ===================
      void delay1ms(){
      int x,y;
      for (x=0;x<10;x++){
      for (y=0;y<13;y++);{}
      }
      }
      //------------------------------------
      void chuyendoiBCD_time(){
      giay1=giay%10;
      giay2=giay/10;

      phut1=phut%10;
      phut2=phut/10;

      gio1=gio%10;
      gio2=gio/10;
      }
      //-----------------------------------
      void chuyendoiBCD_date(){
      ngay1=ngay%10;
      ngay2=ngay/10;

      thang1=thang%10;
      thang2=thang/10;

      nam1=nam%10;
      nam2=nam/10;
      }

      /*-----------tam thoi chua dung den----------------------
      void display_time(){
      //bat led1 hien thi hang don vi giay
      LED=led_code[giay1]; //xuat ma 7doan ra led
      led1=on;
      delay1ms(); //tre 1ms
      led1=off; //tat led

      LED=led_code[giay2];
      led2=on;
      delay1ms();
      led2=off;

      LED=led_code[phut1];
      led3=on;
      delay1ms();
      led3=off;

      LED=led_code[phut2];
      led4=on;
      delay1ms();
      led4=off;

      LED=led_code[gio1];
      led5=on;
      delay1ms();
      led5=off;

      LED=led_code[gio2];
      led6=on;
      delay1ms();
      led6=off;
      }
      //-----------------------------------
      void display_date(){
      LED=led_code[nam1];
      led1=on;
      delay1ms();
      led1=off;

      LED=led_code[nam2];
      led2=on;
      delay1ms();
      led2=off;

      LED=led_code[thang1];
      led3=on;
      delay1ms();
      led3=off;

      LED=led_code[thang2];
      led4=on;
      delay1ms();
      led4=off;

      LED=led_code[ngay1];
      led5=on;
      delay1ms();
      led5=off;

      LED=led_code[ngay2];
      led6=on;
      delay1ms();
      led6=off;
      }
      //-------------------------------------------------*/
      void update_time(){
      //doc thoi gian tu RTC
      giay=rtc_read(0x00); //doc giay (o dang so thap phan)
      phut=rtc_read(0x01); // doc phut
      gio = rtc_read(0x02); // doc gio
      }

      void update_date(){
      //doc ngay - thang - nam tu RTC
      ngay = rtc_read(0x04); // doc ngay` (o dang so thap phan)
      thang= rtc_read(0x05); // doc thang
      nam = rtc_read(0x06); //doc nam
      }

      void hienthi_time(){
      update_time();
      chuyendoiBCD_time();
      }

      void hienthi_date(){
      update_date();
      chuyendoiBCD_date();
      }
      void set_time(); //ham cai dat thoi gian
      void set_ngaythangnam(); //ham cai dat ngay thang nam
      void set_alarm();
      void set_gio();
      void set_phut();
      void set_ngay();
      void set_thang();
      void set_nam();

      void update_timeDS1307(); //ham update thoi gian sau khi cai dat vao DS1307
      void update_dateDS1307(); //ham update ngay thang nam sau khi cai dat vao DS1307

      //=====================
      void T0_ISR() interrupt 1
      {
      TR0=0;
      TF0=0;
      TH0=-1000/256;
      TL0=-1000%256;
      led1=led2=led3=led4=led5=led6=0;
      if(bit_change1==1){
      index++;
      if(index==1)
      {
      LED=led_code[ngay2];
      led1=1;
      }
      else if(index==2)
      {
      LED=led_code[ngay1];
      led2=1;
      }
      else if(index==3)
      {
      LED=led_code[thang2];
      led3=1;
      }
      else if(index==4)
      {
      LED=led_code[thang1];
      led4=1;
      }
      else if(index==5)
      {
      LED=led_code[nam2];
      led5=1;
      }
      else if(index==6)
      {
      LED=led_code[nam1];
      led6=1;
      index=0;
      }
      }

      else if(bit_change1==0){
      index++;
      if(index==1)
      {
      LED=led_code[gio2];
      led1=1;
      }
      else if(index==2)
      {
      LED=led_code[gio1];
      led2=1;
      }
      else if(index==3)
      {
      LED=led_code[phut2];
      led3=1;
      }
      else if(index==4)
      {
      LED=led_code[phut1];
      led4=1;
      }
      else if(index==5)
      {
      LED=led_code[giay2];
      led5=1;
      }
      else if(index==6)
      {
      LED=led_code[giay1];
      led6=1;
      index=0;
      }
      }

      TR0=1;
      }
      //==========================
      void set_timer(){
      TMOD=0x01;
      TH0=-1000/256;
      TL0=-1000%256;
      TF0=0;
      ET0=1;
      EA=1;
      TR0=1;
      }
      //************************************************** **************************
      //----------------------------------------------------------------------------
      //========================/* chuong trinh chinh */============================
      void main(void){
      unsigned char buff_giay;
      set_timer();
      index=0; P1=0xff; P2=0xff; P0=0xff;
      clear_bit; clear_bit1; clear_bit2; clear_bit3;
      buff_giay=rtc_read(0x00);
      rtc_write(0x00, 0x00); //neu dat cau lenh nay thi khi reset lai VDK thi giay se bi xoa ve 0
      rtc_write(0x07, 0x10); //chan(7) SQW/OUT enable pulse out 1Hz
      rtc_write(0x00, buff_giay);
      while(1){
      hienthi_time();
      if (change==0) { //neu nhan "change" thi chuyen sang hien thi ngay thang nam
      while(change==0){TR0=0;} //cho nha phim
      bit_change1=1;
      TR0=1;
      }

      if (mode==0) { //neu nhan "mode" lan1 thi chuyen sang cai dat thoi gian
      while(mode==0) {TR0=0;} //cho nha phim
      bit_mode1=1; //bit nho dung trong vong lap cai dat thoi gian
      set_time();
      TR0=1;
      }
      while(bit_change1==1){
      hienthi_date();
      if (change==0) { //neu nhan "change" tiep thi chuyen ve che doi hien thi thoi gian
      while(change==0){TR0=0;} //cho nha phim
      bit_change1=0;
      TR0=1;
      }

      if (mode==0) { //neu nhan "mode" thi chuyen sang che do cai dat ngay thang nam
      while(mode==0) {TR0=0;} //cho nha phim
      bit_mode3=1; //bit nho dung trong vong lap cai dat ngay thang nam
      set_ngaythangnam();
      TR0=1;
      }
      }

      }
      }
      //************************************************** *
      //---------------------------------------------------
      //************************************************** *
      void update_timeDS1307(){
      int dulieu=0;
      //update phut
      dulieu=phut1+phut2*10; //chuyen sang so BCD
      rtc_write(0x01, dulieu); //ghi du lieu vao thanh ghi phut
      //update gio
      dulieu=gio1+gio2*10; //chuyen sang so BCD
      rtc_write(0x02, dulieu); //ghi du lieu vao thanh ghi gio
      }
      //---------------------------------------------------
      void update_dateDS1307(){
      int dulieu1=0;
      //update ngay
      dulieu1=ngay1+ngay2*10; //chuyen sang BCD
      rtc_write(0x04, dulieu1); //ghi du lieu vao thanh ghi ngay
      //update thang
      dulieu1=thang1+thang2*10;
      rtc_write(0x05, dulieu1);
      //update nam
      dulieu1=nam1+nam2*10;
      rtc_write(0x06, dulieu1);
      }
      //---------------------------------------------------
      void set_time(){

      unsigned int dem1=0;

      while(bit_mode1==1) { //vong lap o lai chuong trinh cai dat time cho toi khi nhan mode tiep
      if (change==0) {
      while(change==0) {} //cho nha phim
      dem1++; }


      if (dem1%2==0) { set_phut(); }
      if (dem1%2!=0) { set_gio(); }
      update_timeDS1307(); //update lai thoi gian sau khi cai dat vao DS1307

      if (mode==0) { //neu nhan nut "mode" lan 2 thi chuyen sang cai dat hen gio
      while (mode==0){} //cho nha phim
      bit_mode1=0;
      bit_mode2=1; //bit nho dung trong vong lap cai dat alarm
      set_alarm(); //goi ham cai dat hen gio
      }


      }

      }

      //----------------------------------------------------
      void set_ngaythangnam(){
      unsigned char dem3=1;
      while(bit_mode3==1){
      if (change==0){ //neu nhan "change" thi chuyen che do ngay -> thang
      while(change==0){} //cho nha phim
      dem3++;
      }

      if (mode==0){
      while (mode==0){} //cho nha phim
      bit_mode3=0;
      }

      switch(dem3){
      case 1: set_ngay(); break;
      case 2: set_thang(); break;
      case 3: set_nam(); break;
      case 4: dem3=1; break;
      }
      update_dateDS1307();
      }

      }
      //----------------------------------------------------
      void set_gio(){
      if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
      while (tang==0){} //cho nha phim
      gio1++;
      if ((gio2==2)&(gio1==4)) { gio1=0; gio2=0; }
      if (gio1==10) { gio2++; gio1=0;}
      }
      if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
      while(giam==0){} //cho nha phim
      gio1--;
      if ((gio1==255)&(gio2==0)) {gio1=3; gio2=2; }
      if (gio1==255){gio2--; gio1=9;}
      }
      LED=led_code[phut1];
      led3=on;
      delay1ms();
      led3=off;

      LED=led_code[phut2];
      led4=on;
      delay1ms();
      led4=off;

      LED=led_code1[gio1];
      led5=on;
      delay1ms();
      led5=off;

      LED=led_code1[gio2];
      led6=on;
      delay1ms();
      led6=off;

      }
      //-----------------------------------------
      void set_phut(){
      if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
      while (tang==0){} //cho nha phim
      phut1++;
      if ((phut2==5)&(phut1==10)) { phut1=0; phut2=0; }
      if (phut1==10) { phut2++; phut1=0; }
      }
      if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
      while(giam==0){} //cho nha phim
      phut1--;
      if ((phut1==255)& (phut2==0)) { phut1=9; phut2=5; }
      if (phut1==255) { phut2--; phut1=9; }

      }

      LED=led_code1[phut1];
      led3=on;
      delay1ms();
      led3=off;

      LED=led_code1[phut2];
      led4=on;
      delay1ms();
      led4=off;

      LED=led_code[gio1];
      led5=on;
      delay1ms();
      led5=off;

      LED=led_code[gio2];
      led6=on;
      delay1ms();
      led6=off;
      }
      //------------------------------------------------------
      void set_ngay(){
      if (tang==0){
      while(tang==0){} //cho nha phim
      ngay1++;
      if ((ngay1==2)&(ngay2==3)) { ngay1=1; ngay2=0; }
      if (ngay1==10) { ngay2++; ngay1=0; }
      }
      if (giam==0){
      while(giam==0){} //cho nha phim
      ngay1--;
      if ((ngay2==0)&(ngay1==0)) { ngay1=1; ngay2=3; }
      if (ngay1==255) { ngay2--; ngay1=9; }
      }

      LED=led_code1[ngay2];
      led6=on;
      delay1ms();
      led6=off;

      LED=led_code1[ngay1];
      led5=on;
      delay1ms();
      led5=off;

      LED=led_code[thang2];
      led4=on;
      delay1ms();
      led4=off;

      LED=led_code[thang1];
      led3=on;
      delay1ms();
      led3=off;

      LED=led_code[nam2];
      led2=on;
      delay1ms();
      led2=off;

      LED=led_code[nam1];
      led1=on;
      delay1ms();
      led1=off;
      }
      //---------------------------------------------
      void set_thang(){
      if(tang==0){
      while(tang==0){} //cho nha phim
      thang1++;
      if ((thang2==1)&(thang1==3)) { thang1=1; thang2=0; }
      if (thang1==10) { thang2++; thang1=0; }
      }
      if (giam==0){
      while (giam==0) {} // cho nha phim
      thang1--;
      if ((thang2==0)&(thang1==0)) { thang1=2; thang2=1; }
      if (thang1==255) { thang2--; thang1=9; }
      }
      LED=led_code[ngay2];
      led6=on;
      delay1ms();
      led6=off;

      LED=led_code[ngay1];
      led5=on;
      delay1ms();
      led5=off;

      LED=led_code1[thang2];
      led4=on;
      delay1ms();
      led4=off;

      LED=led_code1[thang1];
      led3=on;
      delay1ms();
      led3=off;

      LED=led_code[nam2];
      led2=on;
      delay1ms();
      led2=off;

      LED=led_code[nam1];
      led1=on;
      delay1ms();
      led1=off;
      }
      //-------------------------------------------------
      void set_nam(){
      if (tang==0){
      while(tang==0){} // cho nha phim
      nam1++;
      if ((nam2==9)&(nam1==10)) { nam1=0; nam2=0; }
      if (nam1==10) { nam2++; nam1=0; }
      }
      if (giam==0){
      while(giam==0){} //cho nha phim
      nam1--;
      if ((nam2==0)&(nam1==255)) { nam1=9; nam2=9; }
      if (nam1==255) { nam2--; nam1=9; }
      }
      LED=led_code[ngay2];
      led6=on;
      delay1ms();
      led6=off;

      LED=led_code[ngay1];
      led5=on;
      delay1ms();
      led5=off;

      LED=led_code[thang2];
      led4=on;
      delay1ms();
      led4=off;

      LED=led_code[thang1];
      led3=on;
      delay1ms();
      led3=off;

      LED=led_code1[nam2];
      led2=on;
      delay1ms();
      led2=off;

      LED=led_code1[nam1];
      led1=on;
      delay1ms();
      led1=off;
      }

      Comment






      • code:
        giao tiep I2C (cái này mình tham khảo trên diễn đàn thôi)
        #define SCL P1_0
        #define SDA P1_1
        //=====================
        /* giao tiep i2c */

        //-------------------------
        void delay(){
        int i;
        for (i=0;i<10;i++);
        }

        void SCL_high(){
        SCL=1;
        delay();
        }

        void SCL_low(){
        SCL=0;
        delay();
        }
        //------------------------

        //=======================================

        //------------------------
        void i2c_start(){
        SDA=1;
        SCL=1;
        SDA=0;
        delay();
        SCL=0;
        SDA=1;
        }

        void i2c_stop(){
        SDA=0;
        SCL=1;
        delay();
        SDA=1;
        }
        //-------------------------


        //==========*** Ham ghi gia tri vao i2c ***================
        bit i2c_write(unsigned char dat){
        unsigned char i;
        bit outbit;
        for (i=1;i<=8;i++){
        outbit=dat&0x80;
        SDA=outbit;
        dat=dat<<1;
        SCL_high();
        SCL_low();
        }
        SDA=1; //set SDA to receive Acknowedge
        SCL_high();
        outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
        SCL_low();
        return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
        }
        //================================================== ====
        giao tiếp với DS1307
        //================================================== ==

        /* giao tiep voi IC DS1307 */

        //==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
        void rtc_write(unsigned char address, unsigned char data1){
        i2c_start();
        i2c_write(0xd0); // dia chi cua DS1307 che do ghi
        i2c_write(address); //dia chi cua thanh ghi
        /* i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
        i2c_stop();
        }

        //======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
        unsigned char rtc_read(unsigned char address){
        unsigned char data1;
        i2c_start();
        i2c_write(0xd0); //dia chi cua DS1307 che do ghi
        i2c_write(address); //dia chi thanh ghi can doc
        i2c_start(); //restart
        i2c_write(0xd1); //dia chi DS1307 che do doc
        data1=i2c_read(0);
        i2c_stop();
        /*data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
        return(data1);
        }

        //================================
        main:
        #include <at89x51.h>

        #define SCL P1_0
        #define SDA P1_1
        /* dinh nghia cac bien hien thi */
        #define LED P0 // xuat ma led
        #define DP P0_7
        /*quet led*/
        #define on 1
        #define off 0
        #define led1 P1_2 //dung de quet led
        #define led2 P1_3
        #define led3 P1_4
        #define led4 P1_5
        #define led5 P1_6
        #define led6 P1_7
        /* nut an */
        #define mode P2_0
        #define tang P2_1
        #define giam P2_2
        #define change P2_3

        /*khai bao cac bien gio phut giay*/
        unsigned char index;
        unsigned char gio,phut,giay,ngay,thang,nam;
        unsigned char gio1,gio2,phut1,phut2,giay1,giay2;
        unsigned char ngay1,ngay2,thang1,thang2,nam1,nam2;
        bit bit_mode1,bit_mode2,bit_mode3,bit_mode4,bit_tang1, bit_tang2,bit_tang3,bit_tang4;
        bit bit_giam1,bit_giam2,bit_giam3,bit_giam4,bit_change 1,bit_change2,bit_change3,bit_change4;
        unsigned int dem=0;
        #define clear_bit {bit_mode1=0; bit_mode2=0; bit_mode3=0; bit_mode4=0;}
        #define clear_bit1 {bit_tang1=0; bit_tang2=0; bit_tang3=0; bit_tang4=0; }
        #define clear_bit2 {bit_giam1=0; bit_giam2=0; bit_giam3=0; bit_giam4=0; }
        #define clear_bit3 {bit_change1=0; bit_change2=0; bit_change3=0; bit_change4=0;}

        led_code[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
        led_code1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 };


        //===================/* giao tiep i2c */================================================== =
        void delay(){
        int i;
        for (i=0;i<10;i++);
        }

        void SCL_high(){
        SCL=1;
        delay();
        }

        void SCL_low(){
        SCL=0;
        delay();
        }
        //------------------------

        //=======================================

        //------------------------
        void i2c_start(){
        SDA=1;
        SCL=1;
        SDA=0;
        delay();
        SCL=0;
        SDA=1;
        }

        void i2c_stop(){
        SDA=0;
        SCL=1;
        delay();
        SDA=1;
        }
        //--------------------------------------------------------------------------------


        //==========*** Ham ghi gia tri vao i2c ***================
        bit i2c_write(unsigned char dat){
        unsigned char i;
        bit outbit;
        for (i=1;i<=8;i++){
        outbit=dat&0x80;
        SDA=outbit;
        dat=dat<<1;
        SCL_high();
        SCL_low();
        }
        SDA=1; //set SDA to receive Acknowedge
        SCL_high();
        outbit=SDA; //kiem tra ACK xem slaver nhan dung chua
        SCL_low();
        return(outbit); //if outbit=1,Ack=1 :error // if outbit=0;Ack=0 :ok
        }
        //--------------------------------------------------------------------------------

        //=========*** Ham doc gia tri tu i2c ***=================
        unsigned char i2c_read(bit ack){
        unsigned char i,dat;
        bit inbit;

        dat=0;
        for(i=1;i<=8;i++){
        SCL_high();
        inbit=SDA;
        dat=dat<<1;
        dat=dat|inbit;
        SCL_low();
        }
        if (ack){ //set SDA=0 (ACK)
        SDA=0;
        }
        else { //set Not ACK
        SDA=1;
        }
        SCL_high();
        SCL=0;
        SDA=1; //set SDA=1 for next read
        delay();
        return(dat);
        }
        //============/* ket thuc cac ham giao tiep cho i2c */===============================




        //==========================************************ ****=============================
        //=============/* giao tiep voi IC DS1307 */=========================================
        //==== Ham ghi du lieu data1 toi thanh ghi dia chi address cua DS1307 ==========
        void rtc_write(unsigned char address, unsigned char data1){
        i2c_start();
        i2c_write(0xd0); // dia chi cua DS1307 che do ghi
        i2c_write(address); //dia chi cua thanh ghi
        i2c_write(((data1/10)<<4)|(data1%10)); //chuyen thanh so thap phan */
        i2c_stop();
        }

        //======= Ham doc du lieu cua DS1307 tai thanh ghi co dia chi address =========
        unsigned char rtc_read(unsigned char address){
        unsigned char data1;
        i2c_start();
        i2c_write(0xd0); //dia chi cua DS1307 che do ghi
        i2c_write(address); //dia chi thanh ghi can doc
        i2c_start(); //restart
        i2c_write(0xd1); //dia chi DS1307 che do doc
        data1=i2c_read(0);
        i2c_stop();
        data1=(data1&0x0f)+(data1>>4)*10; //chuyen thanh so thap phan */
        return(data1);
        }
        //========================***********************=== ============================


        //================================================== ===================
        void delay1ms(){
        int x,y;
        for (x=0;x<10;x++){
        for (y=0;y<13;y++);{}
        }
        }
        //------------------------------------
        void chuyendoiBCD_time(){
        giay1=giay%10;
        giay2=giay/10;

        phut1=phut%10;
        phut2=phut/10;

        gio1=gio%10;
        gio2=gio/10;
        }
        //-----------------------------------
        void chuyendoiBCD_date(){
        ngay1=ngay%10;
        ngay2=ngay/10;

        thang1=thang%10;
        thang2=thang/10;

        nam1=nam%10;
        nam2=nam/10;
        }

        /*-----------tam thoi chua dung den----------------------
        void display_time(){
        //bat led1 hien thi hang don vi giay
        LED=led_code[giay1]; //xuat ma 7doan ra led
        led1=on;
        delay1ms(); //tre 1ms
        led1=off; //tat led

        LED=led_code[giay2];
        led2=on;
        delay1ms();
        led2=off;

        LED=led_code[phut1];
        led3=on;
        delay1ms();
        led3=off;

        LED=led_code[phut2];
        led4=on;
        delay1ms();
        led4=off;

        LED=led_code[gio1];
        led5=on;
        delay1ms();
        led5=off;

        LED=led_code[gio2];
        led6=on;
        delay1ms();
        led6=off;
        }
        //-----------------------------------
        void display_date(){
        LED=led_code[nam1];
        led1=on;
        delay1ms();
        led1=off;

        LED=led_code[nam2];
        led2=on;
        delay1ms();
        led2=off;

        LED=led_code[thang1];
        led3=on;
        delay1ms();
        led3=off;

        LED=led_code[thang2];
        led4=on;
        delay1ms();
        led4=off;

        LED=led_code[ngay1];
        led5=on;
        delay1ms();
        led5=off;

        LED=led_code[ngay2];
        led6=on;
        delay1ms();
        led6=off;
        }
        //-------------------------------------------------*/
        void update_time(){
        //doc thoi gian tu RTC
        giay=rtc_read(0x00); //doc giay (o dang so thap phan)
        phut=rtc_read(0x01); // doc phut
        gio = rtc_read(0x02); // doc gio
        }

        void update_date(){
        //doc ngay - thang - nam tu RTC
        ngay = rtc_read(0x04); // doc ngay` (o dang so thap phan)
        thang= rtc_read(0x05); // doc thang
        nam = rtc_read(0x06); //doc nam
        }

        void hienthi_time(){
        update_time();
        chuyendoiBCD_time();
        }

        void hienthi_date(){
        update_date();
        chuyendoiBCD_date();
        }
        void set_time(); //ham cai dat thoi gian
        void set_ngaythangnam(); //ham cai dat ngay thang nam
        void set_alarm();
        void set_gio();
        void set_phut();
        void set_ngay();
        void set_thang();
        void set_nam();

        void update_timeDS1307(); //ham update thoi gian sau khi cai dat vao DS1307
        void update_dateDS1307(); //ham update ngay thang nam sau khi cai dat vao DS1307

        //=====================
        void T0_ISR() interrupt 1
        {
        TR0=0;
        TF0=0;
        TH0=-1000/256;
        TL0=-1000%256;
        led1=led2=led3=led4=led5=led6=0;
        if(bit_change1==1){
        index++;
        if(index==1)
        {
        LED=led_code[ngay2];
        led1=1;
        }
        else if(index==2)
        {
        LED=led_code[ngay1];
        led2=1;
        }
        else if(index==3)
        {
        LED=led_code[thang2];
        led3=1;
        }
        else if(index==4)
        {
        LED=led_code[thang1];
        led4=1;
        }
        else if(index==5)
        {
        LED=led_code[nam2];
        led5=1;
        }
        else if(index==6)
        {
        LED=led_code[nam1];
        led6=1;
        index=0;
        }
        }

        else if(bit_change1==0){
        index++;
        if(index==1)
        {
        LED=led_code[gio2];
        led1=1;
        }
        else if(index==2)
        {
        LED=led_code[gio1];
        led2=1;
        }
        else if(index==3)
        {
        LED=led_code[phut2];
        led3=1;
        }
        else if(index==4)
        {
        LED=led_code[phut1];
        led4=1;
        }
        else if(index==5)
        {
        LED=led_code[giay2];
        led5=1;
        }
        else if(index==6)
        {
        LED=led_code[giay1];
        led6=1;
        index=0;
        }
        }

        TR0=1;
        }
        //==========================
        void set_timer(){
        TMOD=0x01;
        TH0=-1000/256;
        TL0=-1000%256;
        TF0=0;
        ET0=1;
        EA=1;
        TR0=1;
        }
        //************************************************** **************************
        //----------------------------------------------------------------------------
        //========================/* chuong trinh chinh */============================
        void main(void){
        unsigned char buff_giay;
        set_timer();
        index=0; P1=0xff; P2=0xff; P0=0xff;
        clear_bit; clear_bit1; clear_bit2; clear_bit3;
        buff_giay=rtc_read(0x00);
        rtc_write(0x00, 0x00); //neu dat cau lenh nay thi khi reset lai VDK thi giay se bi xoa ve 0
        rtc_write(0x07, 0x10); //chan(7) SQW/OUT enable pulse out 1Hz
        rtc_write(0x00, buff_giay);
        while(1){
        hienthi_time();
        if (change==0) { //neu nhan "change" thi chuyen sang hien thi ngay thang nam
        while(change==0){TR0=0;} //cho nha phim
        bit_change1=1;
        TR0=1;
        }

        if (mode==0) { //neu nhan "mode" lan1 thi chuyen sang cai dat thoi gian
        while(mode==0) {TR0=0;} //cho nha phim
        bit_mode1=1; //bit nho dung trong vong lap cai dat thoi gian
        set_time();
        TR0=1;
        }
        while(bit_change1==1){
        hienthi_date();
        if (change==0) { //neu nhan "change" tiep thi chuyen ve che doi hien thi thoi gian
        while(change==0){TR0=0;} //cho nha phim
        bit_change1=0;
        TR0=1;
        }

        if (mode==0) { //neu nhan "mode" thi chuyen sang che do cai dat ngay thang nam
        while(mode==0) {TR0=0;} //cho nha phim
        bit_mode3=1; //bit nho dung trong vong lap cai dat ngay thang nam
        set_ngaythangnam();
        TR0=1;
        }
        }

        }
        }
        //************************************************** *
        //---------------------------------------------------
        //************************************************** *
        void update_timeDS1307(){
        int dulieu=0;
        //update phut
        dulieu=phut1+phut2*10; //chuyen sang so BCD
        rtc_write(0x01, dulieu); //ghi du lieu vao thanh ghi phut
        //update gio
        dulieu=gio1+gio2*10; //chuyen sang so BCD
        rtc_write(0x02, dulieu); //ghi du lieu vao thanh ghi gio
        }
        //---------------------------------------------------
        void update_dateDS1307(){
        int dulieu1=0;
        //update ngay
        dulieu1=ngay1+ngay2*10; //chuyen sang BCD
        rtc_write(0x04, dulieu1); //ghi du lieu vao thanh ghi ngay
        //update thang
        dulieu1=thang1+thang2*10;
        rtc_write(0x05, dulieu1);
        //update nam
        dulieu1=nam1+nam2*10;
        rtc_write(0x06, dulieu1);
        }
        //---------------------------------------------------
        void set_time(){

        unsigned int dem1=0;

        while(bit_mode1==1) { //vong lap o lai chuong trinh cai dat time cho toi khi nhan mode tiep
        if (change==0) {
        while(change==0) {} //cho nha phim
        dem1++; }


        if (dem1%2==0) { set_phut(); }
        if (dem1%2!=0) { set_gio(); }
        update_timeDS1307(); //update lai thoi gian sau khi cai dat vao DS1307

        if (mode==0) { //neu nhan nut "mode" lan 2 thi chuyen sang cai dat hen gio
        while (mode==0){} //cho nha phim
        bit_mode1=0;
        bit_mode2=1; //bit nho dung trong vong lap cai dat alarm
        set_alarm(); //goi ham cai dat hen gio
        }


        }

        }

        //----------------------------------------------------
        void set_ngaythangnam(){
        unsigned char dem3=1;
        while(bit_mode3==1){
        if (change==0){ //neu nhan "change" thi chuyen che do ngay -> thang
        while(change==0){} //cho nha phim
        dem3++;
        }

        if (mode==0){
        while (mode==0){} //cho nha phim
        bit_mode3=0;
        }

        switch(dem3){
        case 1: set_ngay(); break;
        case 2: set_thang(); break;
        case 3: set_nam(); break;
        case 4: dem3=1; break;
        }
        update_dateDS1307();
        }

        }
        //----------------------------------------------------
        void set_gio(){
        if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
        while (tang==0){} //cho nha phim
        gio1++;
        if ((gio2==2)&(gio1==4)) { gio1=0; gio2=0; }
        if (gio1==10) { gio2++; gio1=0;}
        }
        if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
        while(giam==0){} //cho nha phim
        gio1--;
        if ((gio1==255)&(gio2==0)) {gio1=3; gio2=2; }
        if (gio1==255){gio2--; gio1=9;}
        }
        LED=led_code[phut1];
        led3=on;
        delay1ms();
        led3=off;

        LED=led_code[phut2];
        led4=on;
        delay1ms();
        led4=off;

        LED=led_code1[gio1];
        led5=on;
        delay1ms();
        led5=off;

        LED=led_code1[gio2];
        led6=on;
        delay1ms();
        led6=off;

        }
        //-----------------------------------------
        void set_phut(){
        if (tang==0){ //neu nhan nut "tang" thi tang gia tri "gio1" len 1 don vi
        while (tang==0){} //cho nha phim
        phut1++;
        if ((phut2==5)&(phut1==10)) { phut1=0; phut2=0; }
        if (phut1==10) { phut2++; phut1=0; }
        }
        if (giam==0){ //neu nhan nut "giam" thi giam gia tri "gio1" xuong 1 don vi
        while(giam==0){} //cho nha phim
        phut1--;
        if ((phut1==255)& (phut2==0)) { phut1=9; phut2=5; }
        if (phut1==255) { phut2--; phut1=9; }

        }

        LED=led_code1[phut1];
        led3=on;
        delay1ms();
        led3=off;

        LED=led_code1[phut2];
        led4=on;
        delay1ms();
        led4=off;

        LED=led_code[gio1];
        led5=on;
        delay1ms();
        led5=off;

        LED=led_code[gio2];
        led6=on;
        delay1ms();
        led6=off;
        }
        //------------------------------------------------------
        void set_ngay(){
        if (tang==0){
        while(tang==0){} //cho nha phim
        ngay1++;
        if ((ngay1==2)&(ngay2==3)) { ngay1=1; ngay2=0; }
        if (ngay1==10) { ngay2++; ngay1=0; }
        }
        if (giam==0){
        while(giam==0){} //cho nha phim
        ngay1--;
        if ((ngay2==0)&(ngay1==0)) { ngay1=1; ngay2=3; }
        if (ngay1==255) { ngay2--; ngay1=9; }
        }

        LED=led_code1[ngay2];
        led6=on;
        delay1ms();
        led6=off;

        LED=led_code1[ngay1];
        led5=on;
        delay1ms();
        led5=off;

        LED=led_code[thang2];
        led4=on;
        delay1ms();
        led4=off;

        LED=led_code[thang1];
        led3=on;
        delay1ms();
        led3=off;

        LED=led_code[nam2];
        led2=on;
        delay1ms();
        led2=off;

        LED=led_code[nam1];
        led1=on;
        delay1ms();
        led1=off;
        }
        //---------------------------------------------
        void set_thang(){
        if(tang==0){
        while(tang==0){} //cho nha phim
        thang1++;
        if ((thang2==1)&(thang1==3)) { thang1=1; thang2=0; }
        if (thang1==10) { thang2++; thang1=0; }
        }
        if (giam==0){
        while (giam==0) {} // cho nha phim
        thang1--;
        if ((thang2==0)&(thang1==0)) { thang1=2; thang2=1; }
        if (thang1==255) { thang2--; thang1=9; }
        }
        LED=led_code[ngay2];
        led6=on;
        delay1ms();
        led6=off;

        LED=led_code[ngay1];
        led5=on;
        delay1ms();
        led5=off;

        LED=led_code1[thang2];
        led4=on;
        delay1ms();
        led4=off;

        LED=led_code1[thang1];
        led3=on;
        delay1ms();
        led3=off;

        LED=led_code[nam2];
        led2=on;
        delay1ms();
        led2=off;

        LED=led_code[nam1];
        led1=on;
        delay1ms();
        led1=off;
        }
        //-------------------------------------------------
        void set_nam(){
        if (tang==0){
        while(tang==0){} // cho nha phim
        nam1++;
        if ((nam2==9)&(nam1==10)) { nam1=0; nam2=0; }
        if (nam1==10) { nam2++; nam1=0; }
        }
        if (giam==0){
        while(giam==0){} //cho nha phim
        nam1--;
        if ((nam2==0)&(nam1==255)) { nam1=9; nam2=9; }
        if (nam1==255) { nam2--; nam1=9; }
        }
        LED=led_code[ngay2];
        led6=on;
        delay1ms();
        led6=off;

        LED=led_code[ngay1];
        led5=on;
        delay1ms();
        led5=off;

        LED=led_code[thang2];
        led4=on;
        delay1ms();
        led4=off;

        LED=led_code[thang1];
        led3=on;
        delay1ms();
        led3=off;

        LED=led_code1[nam2];
        led2=on;
        delay1ms();
        led2=off;

        LED=led_code1[nam1];
        led1=on;
        delay1ms();
        led1=off;
        }

        Comment


        • bac nào có code chạy tên sinh viên dùng 3led ma trận 8x8 sử dụng atmega16 ko? gửi cho em với huynhhd.bk@gmail.com

          Comment


          • Anh Hà hay các bạn pro trong diễn đàng giúp mình với mình định làm 1 bảng led quang báo 32 hàng 64 cột bằng 32 miếng led matrix 8x8 2 màu mình đã mô phỏng ok mọi thứ trên proteus nhưng vẫn loay hoay mãi không dám đi đặt mạch vì 1 vấn đề là khi mô phỏng mình dùng atmega16 nhưng thằng proteus chỉ cho mô phỏng chế độ chạy thạch anh nội 8M cộng thêm máy tình nhà em hơi yếu (100%CPU khi chạy mô phỏng) nên khi mô phỏng thì thấy MCU ko quét kịp cái bảng led.
            Mình thắc mắc trên thực tế mình dùng mega16 với thạch anh 16M thì có quét kịp cái bảng này ko? để quét toàn bộ cái bảng quang báo này 1 lượt thì SPI phải xuất 32x64=2048 bit data 1 lượt quét+hiển thị cho 1 màu (kinh vãi), theo em đoán thì trên thực tế với 16m thạch anh quét cũng chả kịp
            Em tính tới phương án là chia nhỏ cái bảng quang báo ra rồi điều khiển = nhiều MCU nhưng thấy kì kì vì cái bảng lớn mình xài cỡ 13-14 chân MCU hà còn thừa nhiều quá.
            Sơ lược phần cứng của em:32 miếng matrix 8x8 2màu, 74hc164 dịch data, 74hc138 hiền thị hàng, hc4052 tạo 4 chân SPI, 1 mega16 16M, mô phỏng ok trên proteus (lập trình đơn giản theo chân bác nghaiha dùng spi cứng xuất 1 lần 1 byte full data 8byte cho 1 hàng thì show nó lên sau đó tắt đi đến hàng 2)
            Tóm lại em muốn hỏi những điều sau:
            1) Cái bảng quang báo 32 hàng 64 cột của em trên thực tế có quét được = 1 mcu mega16 chạy cry16M xuất data=SPI cứng hay ko?
            2) Nếu buộc phải chia nhỏ ra dùng nhiều MCU quét cùng 1 lúc thì nên chia ra bao nhiêu modul (em tính chia 4 mỗi modul 8 hàng 64 cột vì như thế đỡ tốn ic 4052 phân kênh cho chân SPI ngược lại tốn 4 con mega16 khóc dở.)
            3) Xin các bạn góp ý về phần cứng thêm cho mình hoàn thiện
            4) Mình là sinh viên làm 1 cú lớn chơi cho vui rồi từ biệt mấy cái bóng đèn led luôn qua chơi PLC nên mong các bạn chân thành góp ý 1 cách dễ hiểu vì ngoài những IC và lập trình đơn giản mình nêu trên mình ko dùng thêm loại nào nữa cho phức tạp đâu vì thật sự mình bắt đầu thấy mệt mỏi rồi nhưng vì đây là thứ mình khởi động nên mình quyết ko từ bỏ thôi. mong cao nhân hiểu tấm lòng của mình và giúp về kiến thức
            Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
            Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

            Comment


            • có ai dùng pic 16f877a không giúp mình với mình đang làm bài tập lớn mà thấy lơ mơ quá không biết làm sao. mình cũng làm về quang báo led nè

              Comment


              • tớ mới sửa tập được code này cậu thử xem:
                code này dùng cho 4 led matrix 8x8
                cậu xem thao khảo nhé

                org 0000h
                batdau:
                mov DPTR,#maled
                lap:mov r0,#30
                main1 :
                mov r2,#24
                mov r1,#16
                mov r7,#8
                mov b ,#0
                mov r3,#7fh

                main2:
                mov a,r3
                rl a
                mov r3,a
                mov p1,a
                setb p3.3
                setb p3.2
                setb p3.3
                clr p3.0
                mov a,r2
                movc a,@a+DPTR
                mov p2,a
                inc r2
                acall delay
                cjne r3,#07fh,main2
                main3:
                mov a,r3
                rl a
                mov r3,a
                mov p1,a
                clr p3.1
                setb p3.0
                setb p3.2
                setb p3.3
                mov a,r1
                movc a,@a+DPTR
                mov p2,a
                inc r1
                acall delay
                cjne r3,#07fh,main3
                main4:
                mov a,r3
                rl a
                mov r3,a
                mov p1,a
                clr p3.2
                setb p3.0
                setb p3.1
                setb p3.3
                mov a,r7
                movc a,@a+DPTR
                mov p2,a
                inc r7
                acall delay
                cjne r3,#07fh,main4
                main5:
                mov a,r3
                rl a
                mov r3,a
                mov p1,a
                clr p3.3
                setb p3.2
                setb p3.0
                setb p3.1
                mov a,b
                movc a,@a+DPTR
                mov p2,a
                inc b
                acall delay
                cjne r3,#07fh,main5

                djnz r0,main1
                inc DPTR
                mov a,DPL
                cjne a,#168,lap
                sjmp batdau
                delay :
                push 04
                push 05
                push 06
                mov r4,#4
                n1:mov r5,#4
                n2:mov r6,#4
                n3:djnz r6,n3
                djnz r5,n2
                djnz r4,n1
                pop 06
                pop 05
                pop 04
                ret

                delay2:
                mov r4,#4
                m1:mov r5,#4
                m2:mov r6,#4
                m3:djnz r6,m3
                djnz r5,m2
                djnz r4,m1
                ret


                org 800h

                maled: db 0h, 0h, 0h, 0h, 0h, 0h ,0h, 0h
                db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
                db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
                db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h
                db 0h, 0h, 7eh, 10h, 8h, 70h, 0h,8h
                db 3eh, 48h, 20h,0h,8h,3eh,48h,20h
                db 0h ,0fch, 14h, 14h ,8h, 0h,0h, 24h
                db 0h, 40h, 0a0h, 50h, 28h, 14h,0ah, 4h
                db 0h, 7eh, 8h, 8h, 8h,7eh,0h,3ch
                db 42h,42h,42h,3ch,0h,7eh,0h, 0h
                db 3ch, 42h, 42h, 62h, 7ch,80h,0h,3eh
                db 40h, 40h, 3eh, 0h,7ch,0ah,0ah, 0ah
                db 7ch, 0h, 7eh, 4h, 8h,10h ,7eh, 0h
                db 0h, 8h, 7eh, 4ah, 4ah, 42h, 3ch, 0h
                db 7eh, 0h, 7eh,4ah, 4ah, 42h ,0h, 7eh
                db 4h, 8h, 10h, 7eh, 0h, 0h, 2h, 2h
                db 7eh, 2h, 2h,0h ,3eh, 40h ,40h, 40h
                db 3eh, 3h ,0h, 40h, 0h, 3ch ,42h, 42h
                db 24h, 0h,3ch, 42h, 42h, 3ch, 0h ,7eh
                db 4h, 8h, 4h, 7eh, 0h, 0h, 0h ,0h
                db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h



                end
                Last edited by caodangbacha; 18-04-2011, 21:39.

                Comment


                • Có ai giúp với..Làm y chang như của anh Haiha vân không được.Không biết bị gì nữa.File mô phỏng và chương trình COdevison nằm trong đó lun đó.Ai gắng giúp chỉnh sửa sai giúp mình cảm ơn rất nhiều
                  http://www.mediafire.com/?a121j5rc13ydwb0

                  Comment


                  • các bác có sơ đồ nguyên lý modul p20 3 màu không cho em xin với

                    Comment


                    • Nguyên văn bởi mr.ngoc Xem bài viết




                      code:
                      giao tiep I2C (cái này mình tham khảo trên diễn đàn thôi)

                      giao tiếp với DS1307

                      main:
                      Bác nào có file HEX của cái này cho em xin với, vì em chưa có trình về cái này lắm nhưng đang thích làm một cái lấy cảm hứng, nhưng bị lỗi khi dịch ra file HEX nhưng chưa tìm ra lỗi, mong mấy bác giúp nhé.
                      Tel:
                      Email:

                      Comment


                      • Bạn ơi, bạn giúp mình làm cái đèn học bằng Led ma trận được không? Giúp mình voi. Cảm ơn bạn nhiều nhiều!

                        Comment


                        • các bác ơi . mình có một ý kiến như thê này nhé.nhằm giúp mấy anh em chưa bít hoặc đang theo học vi điều khiển.Như thế này nhé: khi đưa một đề tài nào lên diễn đàn thì cố gắng thảo luận ở phạm vi xung quanh ve 1 con vi điều khiển thôi. mình thấy các bác thảo luận lung tung quá.nao la pic avr 89 cu loạn cả lên.vậy thì mấy anh em mới tiếp xúc thì khó có thể mà theo giỏi được.đọc một lúc la loạn cả lên.mong mấy bác xem xét ý kiến của mình ha.thanks các bá nhiều nhiều nhiều..........

                          Comment


                          • Cái này mình làm cách đây 3 năm, cũng dựa trên topic của bác nghaiha. Mình up lên diễn đàn hy vọng giúp được gì đó cho các bạn có niềm đam mê led matris của các bạn mới. Nhớ lại thủa mất ăn, mất ngủ về cái món led (ma trận, quang báo, fanled, led cube)
                            Led matris.rar
                            pass: atkev

                            Comment


                            • Nguyên văn bởi nghaiha Xem bài viết
                              Hôm nay ta bắt đầu bài 3: Thay thế hàm delay bằng ngắt Timer1. Sở dĩ ta phải dùng ngắt Timer thay cho hàm delay bởi trong khi delay thì ta sẽ không làm được gì cả. Còn sử dụng Timer thì trong thời gian chờ đợi ta có thể chuẩn bị dữ liệu, tính toán hiệu ứng cho hàng tiếp theo.
                              Em sẽ khai báo ngắt Timer1 như sau:



                              Timer1 có tần số hoạt động là 15625Hz tức là nó sẽ đếm 15625 lần trong vòng 1s. Ở đây, nó cứ đếm từ 0 đến 0x25 = 37 thì ngắt Timer1 sẽ được gọi. Như vậy ngắt Timer1 sẽ được gọi với tần số là 15625/37=422 lần/s.
                              Chúng ta phải nhớ kích hoạt ngắt nhé:



                              Chương trình ngắt Timer1 được viết như sau:


                              Như vậy mỗi khi ngắt Timer1 được gọi thì một hàng sẽ được quét. Ta có tất cả 8 hàng. Do đó tần số quét sẽ là: 422/8=53Hz. Với tần số quét này màn hình led sẽ không bị chớp.

                              Các bác có thể thấy trong vòng lặp while (1) không còn câu lệnh nào cả. Việc quét led hoàn toàn thực hiện tự động nhờ Timer1.



                              Các bác nghỉ lấy sức, qua bài 4 chúng ta sẽ học cách tạo bộ font chữ bằng chương trình Microsoft Excel như thế nào.

                              Source code của bài 3 đây:

                              http://rapidshare.com/files/134768565/bai3.doc

                              Code:
                              3. Thay delay bang ngat Timer 1
                              /*****************************************************
                              This program was produced by the
                              CodeWizardAVR V1.25.8 Standard
                              Automatic Program Generator
                              © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
                              http://www.hpinfotech.com
                              
                              Project : 
                              Version : 
                              Date    : 7/27/2008
                              Author  : Nguyen Hai Ha
                              Company : www.softviet.net                   
                              Comments: 
                              
                              
                              Chip type           : ATmega8515L
                              Program type        : Application
                              Clock frequency     : 16,000000 MHz
                              Memory model        : Small
                              External SRAM size  : 0
                              Data Stack size     : 128
                              *****************************************************/
                              
                              #include <mega8515.h>
                              #include <delay.h>
                              // SPI functions
                              #include <spi.h>
                              
                              #define SCK PORTB.7
                              #define DATA PORTB.5
                              #define SCL PORTB.3
                              
                              #define B PORTC.1;
                              #define C PORTC.2;
                              #define OE  PORTC.3;
                              unsigned char r=0;
                              void LatchData(){
                                  SCL=0;
                                  SCL=1;
                              }
                              // Timer 1 output compare A interrupt service routine
                              interrupt [TIM1_COMPA] void timer1_compa_isr(void)
                              {   if (r & 1){
                                      spi(0b10101010);
                                      spi(0b10101010);    
                                      spi(0b10101010);}
                                  else {
                                      spi(0b01010101);
                                      spi(0b01010101);    
                                      spi(0b01010101);               
                                  }
                                  LatchData();
                                  PORTC=r+8;
                                  r++;
                                  if (r==8) r=0;
                              }
                              
                              void main(void){
                                 // SPI initialization
                                  // SPI Type: Master
                                  // SPI Clock Rate: 4000,000 kHz
                                  // SPI Clock Phase: Cycle Half
                                  // SPI Clock Polarity: Low
                                  // SPI Data Order: MSB First
                                  SPCR=0x50;
                                  SPSR=0x00;
                              
                                  // Timer/Counter 1 initialization
                                  // Clock source: System Clock
                                  // Clock value: 15.625 kHz
                                  // Mode: CTC top=OCR1A
                                  // OC1A output: Discon.
                                  // OC1B output: Discon.
                                  // Noise Canceler: Off
                                  // Input Capture on Falling Edge
                                  // Timer 1 Overflow Interrupt: Off
                                  // Input Capture Interrupt: Off
                                  // Compare A Match Interrupt: On
                                  // Compare B Match Interrupt: Off
                                  TCCR1A=0x00;
                                  TCCR1B=0x0D;
                                  TCNT1H=0x00;
                                  TCNT1L=0x00;
                                  ICR1H=0x00;
                                  ICR1L=0x00;
                                  OCR1AH=0x00;
                                  OCR1AL=0x25;	// Quyet dinh toc do quet
                                  OCR1BH=0x00;
                                  OCR1BL=0x00;
                              
                              DDRB=0xFF;
                              DDRC=0xFF;
                              SCL=1;
                              // Timer(s)/Counter(s) Interrupt(s) initialization
                                  TIMSK=0x40;
                                  // Global enable interrupts
                                  #asm("sei")
                               
                                  while (1){
                                  }
                              }
                              Chúc vui vẻ!
                              ai phân tích giúp mình đoạn này chút
                              đoạn:
                              Timer1 có tần số hoạt động là 15625Hz tức là nó sẽ đếm 15625 lần trong vòng 1s. Ở đây, nó cứ đếm từ 0 đến 0x25 = 37 thì ngắt Timer1 sẽ được gọi. Như vậy ngắt Timer1 sẽ được gọi với tần số là 15625/37=422 lần/s.
                              Chúng ta phải nhớ kích hoạt ngắt nhé:

                              // Timer(s)/Counter(s) Interrupt(s) initialization
                              TIMSK=0x40;
                              // Global enable interrupts
                              #asm("sei")

                              mình dùng timer1,để TIMSK=0X40 thì led không sáng
                              chuyển thành 0x10 thì lại chạy ngon.
                              đọc cách sử dụng ngắt của avr rùi nhưng vẫn chưa ngấm lắm,các bạn nói giúp cho mình hiểu với.cảm ơn nhiều.

                              Comment


                              • Nguyên văn bởi nghaiha Xem bài viết
                                Qua bài trước các bác đã nắm được phương pháp "tạo hình" rồi. Tức là nội dung sẽ hiển thị lên bảng led thế nào do ta thiết kế. Nó có thể là kí tự, bông hoa hay bất cứ cái gì. Và công việc bây giờ là hiển thị nó lên màn hình.

                                Data của chúng ta ban đầu lưu ở trong Flash ROM. Do đó em đã khai báo
                                Code:
                                unsigned char flash XINCHAO[]={156,136,112,162,72,137,130,40,138,130,47,138,130,232,139,162,40,138,156,40,114,0,0,0};
                                Em sẽ khai báo một mảng trong RAM, mảng này sẽ là bộ nhớ màn hình. Timer 1 của chúng ta sẽ liên tục đọc mảng này và đưa ra màn hình led. Sau này ta muốn làm hiệu ứng hay bất cứ điều gì thì ta chỉ việc thay đổi cái mảng này

                                Code:
                                unsigned char DMem[24]; // Bo nho man hinh, 3 byte dau cho hang 1, 3 byte tiep theo cho hang 2 ...
                                Ban đầu em lấy âm bản của data lưu trong flash. Các bác có thể không thèm lấy âm bản và coi nó như là một hiệu ứng cũng được. Lúc đó chữ "CHAO" sẽ không sáng nhưng background của nó thì lại sáng.
                                Code:
                                    for (i=0;i<=23;i++){
                                        DMem[i]=~XINCHAO[i];
                                    }
                                Trong chương trình ngắt Timer1 ta đưa bộ nhớ màn hình ra màn hình led. Lưu ý quét mỗi hàng thì ta lấy ra 3 bytes . Em không muốn sử dụng mảng 2 chiều cho bộ nhớ màn hình là có nguyên nhân. Các bác thử đoán xem nhé.

                                Code:
                                // Timer 1 output compare A interrupt service routine
                                interrupt [TIM1_COMPA] void timer1_compa_isr(void){
                                    spi(DMem[r*3+2]); //byte thứ 2 ở hàng thứ r
                                    spi(DMem[r*3+1]); // byte thứ 1 ở hàng thứ r
                                    spi(DMem[r*3]);    // byte thứ 0 ở hàng thứ r
                                    LatchData();
                                    PORTC=r+8;         // để Enable chú 74138
                                    r++;
                                    if (r==8) r=0;
                                }
                                Vậy là xong, các bác hãy biên dịch và nạp vào AVR. Kết quả sẽ như bài viết đầu tiên của em



                                Đây là full source code của chúng ta cho đến thời điểm này

                                Code:
                                6. Hien chu CHAO (giong chuong trinh XINCHAO)
                                /*****************************************************
                                This program was produced by the
                                CodeWizardAVR V1.25.8 Standard
                                Automatic Program Generator
                                © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
                                http://www.hpinfotech.com
                                
                                Project : 
                                Version : 
                                Date    : 7/27/2008
                                Author  : Nguyen Hai Ha
                                Company : www.softviet.net                   
                                Comments: 
                                
                                
                                Chip type           : ATmega8515L
                                Program type        : Application
                                Clock frequency     : 16,000000 MHz
                                Memory model        : Small
                                External SRAM size  : 0
                                Data Stack size     : 128
                                *****************************************************/
                                
                                #include <mega8515.h>
                                #include <delay.h>
                                // SPI functions
                                #include <spi.h>
                                
                                #define SCK PORTB.7
                                #define DATA PORTB.5
                                #define SCL PORTB.3
                                
                                #define B PORTC.1;
                                #define C PORTC.2;
                                #define OE  PORTC.3;
                                char lenX=9;
                                char NoLed=3;
                                unsigned char flash XINCHAO[]={156,136,112,162,72,137,130,40,138,130,47,138,130,232,139,162,40,138,156,40,114,0,0,0};
                                unsigned char DMem[24]; // Bo nho man hinh, 3 byte dau cho hang 1, 3 byte tiep theo cho hang 2 ...
                                unsigned char r=0;
                                unsigned char i;
                                void LatchData(){
                                    SCL=0;
                                    SCL=1;
                                }
                                // Timer 1 output compare A interrupt service routine
                                interrupt [TIM1_COMPA] void timer1_compa_isr(void){
                                    spi(DMem[r*3+2]);
                                    spi(DMem[r*3+1]);
                                    spi(DMem[r*3]);
                                    LatchData();
                                    PORTC=r+8;
                                    r++;
                                    if (r==8) r=0;
                                }
                                
                                void main(void){
                                    // Timer/Counter 1 initialization
                                    // Clock source: System Clock
                                    // Clock value: 15.625 kHz
                                    // Mode: CTC top=OCR1A
                                    // OC1A output: Discon.
                                    // OC1B output: Discon.
                                    // Noise Canceler: Off
                                    // Input Capture on Falling Edge
                                    // Timer 1 Overflow Interrupt: Off
                                    // Input Capture Interrupt: Off
                                    // Compare A Match Interrupt: On
                                    // Compare B Match Interrupt: Off
                                    TCCR1A=0x00;
                                    TCCR1B=0x0D;
                                    TCNT1H=0x00;
                                    TCNT1L=0x00;
                                    ICR1H=0x00;
                                    ICR1L=0x00;
                                    OCR1AH=0x00;
                                    OCR1AL=0x25;	// Quyet dinh toc do quet
                                    OCR1BH=0x00;
                                    OCR1BL=0x00;
                                
                                DDRB=0xFF;
                                DDRC=0xFF;
                                SCL=1;
                                // Timer(s)/Counter(s) Interrupt(s) initialization
                                    TIMSK=0x40;
                                    // Global enable interrupts
                                    #asm("sei")
                                   // SPI initialization
                                    // SPI Type: Master
                                    // SPI Clock Rate: 4000,000 kHz
                                    // SPI Clock Phase: Cycle Half
                                    // SPI Clock Polarity: Low
                                    // SPI Data Order: MSB First
                                    SPCR=0x50;
                                    SPSR=0x00;
                                    for (i=0;i<=23;i++){
                                        DMem[i]=~XINCHAO[i];
                                    }
                                    while (1){
                                
                                    }
                                }
                                Bài này đã xong, các bác hãy tùy biến flash data để tạo ra các hình ảnh lạ mắt trên màn hình led nhé. Bài sau em hướng dẫn hiệu ứng làm chữ "CHAO" của ta tối dần và sáng dần. Các bác đón xem nhé.

                                BÁC NÀO GIẢI THÍCH GIÚP EM CHỖ NÀY VỚI:


                                Ban đầu em lấy âm bản của data lưu trong flash. Các bác có thể không thèm lấy âm bản và coi nó như là một hiệu ứng cũng được. Lúc đó chữ "CHAO" sẽ không sáng nhưng background của nó thì lại sáng.
                                Code:

                                for (i=0;i<=23;i++){
                                DMem[i]=~XINCHAO[i];
                                }



                                ÂM BẢN LÀ GÌ VẬY? EM KHÔNG HIỂU?
                                VỚI LẠI VIỆC XUẤT DỮ LIỆU TỪ MẢNG FONT QUA SPI,EM KHÔNG THẤY DÙNG GÌ ĐẾN 2 BIẾN NÀY SAO LẠI KHAI BÁO :
                                char lenX=9;
                                char NoLed=3;

                                EM LÀM THEO MÀ CHÂN E CỦA 138 KHÔNG SET LÊN 1.HIX.
                                em chưa hiểu cách lấy dữ liệu từ mảng ra để xuất.ai giúp em với.
                                em spi(XINCHAO[0]) thì 138 có làm việc nhưng cứ spi(...[r*3+..]) là không được,nên em chưa hiểu cách lấy dữ liệu kiểu này,
                                không biết có phải kiến thức về lập trình với mảng hay không nữa......huhu

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X