• <menu id="w4oac"><noscript id="w4oac"></noscript></menu>
    <code id="w4oac"><abbr id="w4oac"></abbr></code>
    <delect id="w4oac"></delect>
  • 汕尾市民網(wǎng)

    標(biāo)題: 發(fā)表幾個單位片機(jī)的程序,希望有感興趣的一起來學(xué)習(xí)。 [打印本頁]

    作者: 孤獨的老鼠    時間: 2011-5-29 21:37
    標(biāo)題: 發(fā)表幾個單位片機(jī)的程序,希望有感興趣的一起來學(xué)習(xí)。
    8X8點陣的,本

    經(jīng)過發(fā)揚堅持不懈、不怕苦、不怕累的老一輩革命精神,8X24LED點陣終于成功點亮。并達(dá)到預(yù)期目標(biāo),將內(nèi)容從右到左滾動顯示。

    電路結(jié)構(gòu):UDN2981A用于行掃描驅(qū)動,A6276SAX2用于列數(shù)據(jù)串行輸出,兩個可以驅(qū)動四個8X8點陣,我只用了其中三組,下次再增加一個,單片機(jī)用M8。

    程序如下:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define unchar unsigned char
    #define unint unsigned int
    #define OUT PORTD
    #define out_disable PORTB |= _BV(7)
    #define out_enable PORTB &= ~_BV(7)
    #define clk_int PORTB &= ~_BV(1)

    unchar cache[5];
    unchar column[][8]={
         {0,0,0,0,0,0},//
         {0,0,0,0,0,0},//
         {0,0,0,0,0,0},//
         {0,0,0,0,0,0},//
         {0xF0,0x88,0x88,0xF0,0x88,0x88,0x88,0x0},// R
         {0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x0},//A
         {0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x0},// B
         {0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x0},//B
         {0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x0},//I
         {0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x0},//T

         {0x0,0x0,0x0,0x60,0x60,0x20,0x40,0x0},//
         {0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x0},//I
         {0,0,0,0,0,0},//
         {0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x0},//L
         {0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0},//O
         {0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x0},//V
         {0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x0},//E
         {0,0,0,0,0,0},//
         {0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x00},//Y
         {0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0},//O
         {0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x0},//U
         {0x30,0x30,0x30,0x30,0x0,0x30,0x30,0x0},//
         {0x0,0x50,0xA8,0x88,0x50,0x20,0x0,0x0},//
         {0,0,0,0,0,0},//
         {0,0,0,0,0,0},//
         {0,0,0,0,0,0},//
         {0,0,0,0,0,0},//
         };

    unchar dig,gen,ret,scan,line,wei,a,d,b,c,x;
    unint counter,shift;
    unchar t,temp,cl;

    //時鐘脈沖
    void clk()
    {
    PORTB |= _BV(1);

    PORTB &= ~_BV(1);
    }

    //鎖存
    void len()
    {
    PORTB |= _BV(2);

    PORTB &= ~_BV(2);
    }

    //發(fā)送數(shù)據(jù)高(1)
    void dat_h()
    {
    PORTB |= _BV(0);
    clk();
    }

    //發(fā)送數(shù)據(jù)低(0)
    void dat_l()
    {
    PORTB &= ~_BV(0);
    clk();
    }

    //延時
    void delay(unint time)
    {
    unint x,y;

    for (x=time; x>0; x--)
      for (y=1000; y>0; y--);
    }


    //初始化IO口及數(shù)據(jù)
    void io_int()
    {
    DDRD = 0xff;
    DDRB = 0xff;
    DDRC = 0xff;
    clk_int;
    // out_disable;
    OUT = 0;
    PORTC =0xff;
    scan = 0x01;
    }

    //行掃描
    void scan_re()
    {
    out_disable;
    len();
    OUT = scan;
    if (scan != 0x80)
      scan <<= 1;
      else scan = 0x01;
    out_enable;
    }

    //清屏
    void clear(unchar cle)
    {
      unchar c;
    for (c = cle;c>0; c--)
    {
      dat_l();
    }
    }

    //定時器初始化
    void time1_int()
    {
    TCCR1A = 0;
    TCCR1B |= _BV(0);
    TCNT1 = 0xf82f;
    TIMSK |= _BV(TOIE1);
    SREG = 0x80;//開總中斷
    }

    //定時器1中斷服務(wù)程序
    ISR(TIMER1_OVF_vect)
    {
    PORTC = 0xaa;
    delay(100);
    PORTC = 0x55;
    delay(100);
    TIFR |= _BV(TOV1);
    }
    //發(fā)送列數(shù)據(jù)
    void send_data(unchar temp)
    {
    if ((temp&wei) == wei)
      dat_h();
    else
      dat_l();

    if (wei != 0x04)
      wei >>= 1;
      else wei = 0x80;
    }

    void display()
    {
    for (gen=0;gen<8; gen++)
    {
      dig = ret/6;
      x =ret%6;
      wei = 0x80;

      cache[0] = column[dig][gen];
      cache[1] = column[dig+1][gen];
      cache[2] = column[dig+2][gen];
      cache[3] = column[dig+3][gen];
      cache[4] = column[dig+4][gen];

      for (t=0;t<6; t++)//顯示第一個字
      {
       temp = cache[0];
       send_data(temp);
      }

      for (t=0;t<6; t++)//顯示第二個字
      {
       temp = cache[1];
       send_data(temp);
      }
      
      for (t=0;t<6; t++)//顯示第三個字
      {
       temp = cache[2];
       send_data(temp);
      }

      for (t=0;t<6; t++)//顯示第四個字
      {
       temp = cache[3];
       send_data(temp);
      }

      for (t=0;t<x; t++)//第五個字緩沖
      {
       temp = cache[4];
       send_data(temp);
      }

      scan_re();
    delay(6000);
    }
    }

    int main()
    {
    io_int();
    while (1)
    {
      display();
      counter++;
       if (counter == 20)
       {
        counter = 0;
        if (ret < 138)
         ret ++;
        else
        {
         ret = 0;
         dig = 0;
        }
       }
    }
    }
    作者: 孤獨的老鼠    時間: 2011-5-29 21:38
    /****************************************
    1602液晶頭文件
    RS => PD0
    RW => PD1
    EN => PD2

    D0-D3 NC

    D4 => PD3
    D5 => PD4
    D6 => PD5
    D7 => PD6
    ****************************************/

    #ifndef _LCD1602_H_
    #define _LCD1602_H_

    #include <avr/io.h>
    #include <util/delay.h>
    #define unchar unsigned char
    #define unint unsigned int

    //接口定義
    #define RS_COM PORTD &= ~_BV(PD0)
    #define RS_DAT PORTD |= _BV(PD0)
    #define RW_COM PORTD &= ~_BV(PD1)
    #define RW_REA PORTD |= _BV(PD1)
    #define E_HIG  PORTD |= _BV(PD2)
    #define E_LOW  PORTD &= ~_BV(PD2)
    #define DATA   PORTD
    #define word   PIND
    #define LCD_DDR DDRD

    //LCD接口方向初始化
    void lcdio_init()
    {
    LCD_DDR = 0xff;
    PORTD = 0;
    }

    //讀忙
    void busy()
    {
    RW_REA;
    RS_COM;
    E_HIG;
    LCD_DDR = 0X07;
    while((word&0x40));
    LCD_DDR = 0XFF;   
    }

    //使能信號上升沿
    void enable()
    {
    E_LOW;
    _delay_us(200);
    E_HIG;
    }

    //寫命令D
    //因為D7接的是PD6,所以才會有右移三位和左移1位。
    void write_com(unchar com)
    {
    RW_COM;
    RS_COM;
    DATA &= 0x07;
    DATA |= (com & 0xf0) >> 1;
    _delay_us(200);
    enable();

    DATA &= 0x07;
    DATA |= com <<3;
    _delay_us(200);
    enable();
    }

    //寫數(shù)據(jù)
    void write_dat(unchar dat)
    {
    RW_COM;
    RS_DAT;
    DATA &= 0x07;
    DATA |= (dat & 0xf0) >> 1;
    enable();

    DATA &= 0x07;
    DATA |= dat << 3;
    enable();
    }

    //LCD初始化
    void lcd_init()
    {
    unchar t;
    _delay_ms(50);
    for (t=3; t>0;t--)
    {
      RS_COM;
      DATA &= 0x07;
      DATA |= 0X30 >> 1;
      enable();
      _delay_ms(5);
    }

    DATA &= 0x0f;
    DATA |= 0X20;
    enable();
    _delay_ms(5);

    write_com(0x28);
    busy();
    write_com(0x08);//
    busy();
    write_com(0x01);
    busy();
    write_com(0x0c);
    }


    //寫位置,Y行,X列
    void write(unchar y,unchar x)
    {
    if (y == 1)
    {
      write_com(0x80+x-1);
    }
    else
    {
      if (y == 2)
      {
       write_com(0x80+0x40+x-1);
      }
    }
    }

    #endif
    作者: 孤獨的老鼠    時間: 2011-5-29 21:40
    /***********************************
    LED燈調(diào)光控制
    三段亮度可調(diào),首次按由暗變亮,二次為暗
    三次為亮,四次最亮,五次不斷郵亮變暗。
    六次按關(guān)閉

    芯片用的是ATtiny13A

    2011-01-26
    ***********************************/


    #include <avr/io.h>
    #include <util/delay.h>
    #define SW_NO ((PINB & 0x08) != 0x08)
    #define SW_OFF ((PINB & 0x08) == 0x08)
    #define unchar unsigned char
    #define unint unsigned int
    unchar t,key_data,c,k;

    //接口初始化
    void io_init(void)
    {
    DDRB = 0XFF;
    DDRB &= ~_BV(PB3);
    PORTB = _BV(PB3);
    }
    //PWM關(guān)閉
    void pwm_off(void)
    {
    TCCR0B = 0;
    TCCR0A = 0;
    }
    //PWM開
    void pwm_no(void)
    {
    TCCR0B = 0x0a;
    TCCR0A = 0x23;
    }
    //PWM初始化
    void pwm_init()
    {
    TCCR0B = 0x0a;
    TCCR0A = 0x23;
    OCR0A = 255;  
    TCNT0 = 0;
    pwm_off();
    }

    //LED開
    void led_no(unchar lumin)
    {
    OCR0B = lumin;
    pwm_no();   
    }
    //LED睡眠模式
    void led_sleep()
    {
    if (c<255)
    {
      led_no(c);
      _delay_ms(1);
      c ++;
    }
    else
    {
      c = 0;
    }

    }
    //LED首初打開
    void led_first()
    {
    if (c<255)
    {
      led_no(c);
      c ++;
      _delay_ms(2);
    }
    }
    //按鍵程序
    unchar key(void)
    {

    if (SW_NO)
    {
      _delay_ms(10);
      
      if (SW_NO)
      {  
       if (key_data < 6)
       {
        key_data++;
       }
       else
       {
        key_data = 0;
       }
      }

    }
    while(SW_NO);

    return key_data;
    }

    int main()
    {
    pwm_init();
    io_init();
    while(1)
    {
      switch(key())
      {
       case 0: pwm_off();
         c = 0;
         break;

       case 1: led_first();
         break;
       
       case 2: led_no(51);
         break;

       case 3: led_no(170);
         break;

       case 4: led_no(255);
         break;

       case 5: led_sleep();
         break;

       default: pwm_off();
         c = 0;
         break;
      }
    }
    }

    作者: whxvip    時間: 2011-5-29 21:42
    我承認(rèn)我沒 看懂!呵呵,能不能說的淺顯點!例如什么叫片機(jī)
    作者: 龍四    時間: 2011-5-29 21:55
    電子線路板??     估計壇友們看懂的不多
    作者: 我是護(hù)士    時間: 2011-5-29 22:17
    原代碼?
    作者: 孤獨的老鼠    時間: 2011-5-29 23:05
    標(biāo)題: RE: 發(fā)表幾個單片機(jī)的程序,希望有感興趣的一起來學(xué)習(xí)。
    whxvip 發(fā)表于 2011-5-29 21:42
    我承認(rèn)我沒 看懂!呵呵,能不能說的淺顯點!例如什么叫片機(jī)

    我打錯字了,應(yīng)該是單片機(jī)。
    作者: 孤獨的老鼠    時間: 2011-5-29 23:06
    whxvip 發(fā)表于 2011-5-29 21:42
    我承認(rèn)我沒 看懂!呵呵,能不能說的淺顯點!例如什么叫片機(jī)

    單片機(jī)就是我們平時所聽到的什么微電腦。微電腦電飯煲、微電腦洗衣機(jī)之類的那種微電腦,
    作者: whxvip    時間: 2011-5-30 10:03
    孤獨的老鼠 發(fā)表于 2011-5-29 23:06
    單片機(jī)就是我們平時所聽到的什么微電腦。微電腦電飯煲、微電腦洗衣機(jī)之類的那種微電腦,

    呵呵,明白了,你這些是單片機(jī)里面的一些邏輯
    作者: 孤獨的老鼠    時間: 2011-5-30 23:23
    whxvip 發(fā)表于 2011-5-30 10:03
    呵呵,明白了,你這些是單片機(jī)里面的一些邏輯

    可以這么說吧




    歡迎光臨 汕尾市民網(wǎng) (http://www.xproject.cn/) Powered by Discuz! X3.4
    中文欧美日韩久久,免费婬色男女乱婬视频国产,久久香蕉国产线看观看14,麻豆AV手机在线观看 亚洲国产欧美不卡在线观看 久久99九九这里只有精品2
  • <menu id="w4oac"><noscript id="w4oac"></noscript></menu>
    <code id="w4oac"><abbr id="w4oac"></abbr></code>
    <delect id="w4oac"></delect>