汕尾市人民医院
查看: 12833|回复: 9

发表几个单位片机的程序,希望有感兴趣的一起来学习!!

[复制链接]
发表于 2011-5-29 21:37:47 | 显示全部楼层 |阅读模式
8X8点阵的,本

经过发扬坚持不懈、不怕苦、不怕累的老一辈革命精神,8X24LED点阵终于成功点亮。并达到预期目标,将内容从右到左滚动显示。

电路结构:UDN2981A用于行扫描驱动,A6276SAX2用于列数据串行输出,两个可以驱动四个8X8点阵,我只用了其中三组,下次再增加一个,单片机用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);
}

//发送数据高(1)
void dat_h()
{
PORTB |= _BV(0);
clk();
}

//发送数据低(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口及数据
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中断服务程序
ISR(TIMER1_OVF_vect)
{
PORTC = 0xaa;
delay(100);
PORTC = 0x55;
delay(100);
TIFR |= _BV(TOV1);
}
//发送列数据
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;
    }
   }
}
}

楼主热帖
[文化天地] “赌”赢“相输”
[休闲生活] 这里能不能不单讲火腿肠,讲讲电子DIY之类的
[休闲生活] 郁可唯——幸福难不难
[休闲生活] Robbie Williams - Better Men
[休闲生活] 郭静&范玮琪&张韶涵 : 仨人
[休闲生活] 范玮琪——最初的梦想

 楼主| 发表于 2011-5-29 21:38:45 | 显示全部楼层
点击进入微信
/****************************************
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();
}

//写数据
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:22 | 显示全部楼层
新浪官方微博
/***********************************
LED灯调光控制
三段亮度可调,首次按由暗变亮,二次为暗
三次为亮,四次最亮,五次不断邮亮变暗。
六次按关闭

芯片用的是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关闭
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;
  }
}
}
发表于 2011-5-29 21:42:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-5-29 21:55:38 | 显示全部楼层
电子线路板??     估计坛友们看懂的不多
发表于 2011-5-29 22:17:56 | 显示全部楼层
原代码?
 楼主| 发表于 2011-5-29 23:05:13 | 显示全部楼层

RE: 发表几个单片机的程序,希望有感兴趣的一起来学习!!

whxvip 发表于 2011-5-29 21:42
我承认我没 看懂!呵呵,能不能说的浅显点!例如什么叫片机

我打错字了,应该是单片机。
 楼主| 发表于 2011-5-29 23:06:58 | 显示全部楼层
whxvip 发表于 2011-5-29 21:42
我承认我没 看懂!呵呵,能不能说的浅显点!例如什么叫片机

单片机就是我们平时所听到的什么微电脑。微电脑电饭煲、微电脑洗衣机之类的那种微电脑,
发表于 2011-5-30 10:03:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2011-5-30 23:23:23 | 显示全部楼层
whxvip 发表于 2011-5-30 10:03
呵呵,明白了,你这些是单片机里面的一些逻辑

可以这么说吧
您需要登录后才可以回帖 登录 | 市民注册

本版积分规则

快速回复 返回顶部 返回列表