⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display_led._c

📁 AVR开发板例子源代码
💻 _C
字号:
//******************************************************************************
//                                                                             *
//    FileName   : 扩展板ledspi.c                ICCAVR V6.31A编译             *
//    Function   : 高档LED显示屏,滚动显示一个数组                             *
//    Date       : 2006-11-24                                                  *
//    Version    : 1.0                                                         *
//                                                                             *
//    Author     : 开关电源              hongtusy@163.com                      *
//    Company    : 电子信息技术资源网    http://www.itsn.cn                    *
//                                                                             *
/***************************描述与记事******************************************
扩展实验板的AVR程序,使用595驱动点阵汉字LED的练习。
记事:本程序旨在对汉字LED驱动的理解与演示,程序适合初学者使用。
描述:74HC595是串行输入,并行输出带锁存器的有较大驱动能力的芯片。驱动电流可达70mA。内部有移位和输出两个寄存器。
在SRCLK串行时钟上升沿,数据经SER移位进入,或经QH’输出。在RCLK上升沿,数据进入并行输出寄存器。
SRCLK’和OE’分别是复位和允许输出控制,分别接电源和地。
接线定义:PD4=数据,PD5=RCLK并行输出时钟,PD6=SRCLK串行时钟,PD7=OE,PD0=A,PD1=B,PD2=C,PD3=D
//******************************************************************************/

#include <iom8535v.h>             //头文件,使用ATmega8535单片机
#include <macros.h>               //包含一些常用的宏定义,如NOP(),SEI()等。

typedef unsigned char uchar;      //数据类型说明,无符号整型,两字节大小。
typedef unsigned int uint;        //数据类型说明,无符号字符型,单字节大小。

//使用片内1MHz晶体,可更换。

#pragma data: code     

//欢迎 ,先上后下,先左后右取码,每字32个字节 ,此表格存储在程序存储器中
const uchar buf[608]={
               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //空
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //空
               0x28,0x04,0x24,0x08,0x22,0x32,0x21,0xC2,0x26,0xC2,0x38,0x34,
               0x04,0x04,0x18,0x08,0xF0,0x30,0x17,0xC0,0x10,0x60,0x10,0x18,
			   0x14,0x0C,0x18,0x06,0x10,0x04,0x00,0x00,  //欢
			   0x02,0x02,0x82,0x04,0x73,0xF8,0x20,0x04,0x00,0x02,0x3F,0xE2,
			   0x20,0x42,0x40,0x82,0x40,0x02,0x3F,0xFA,0x20,0x02,0x20,0x42,
			   0x20,0x22,0x3F,0xC2,0x00,0x02,0x00,0x00,  //迎
               0x00,0x00,0x02,0x01,0x42,0x02,0x22,0x04,0x3A,0x18,0x13,0xE0,
			   0x02,0x00,0xFE,0x00,0x02,0x00,0x03,0xFC,0x0A,0x02,0x72,0x02,
			   0x22,0x02,0x06,0x02,0x02,0x1E,0x00,0x00,  //光
			   0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x7F,0xFE,0x02,0x00,
			   0x0C,0x00,0xF1,0xFE,0x50,0x84,0x10,0x84,0x18,0xFC,0x16,0x84,
			   0x10,0x84,0x11,0xFE,0x10,0x80,0x00,0x00,  //临
               0x00,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x10,0x40,0x10,0x40,
			   0x10,0x40,0xFF,0xFF,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,
			   0x3F,0xE0,0x10,0x00,0x00,0x00,0x00,0x00,  //中
               0x00,0x00,0x7F,0xFF,0x40,0x02,0x50,0x12,0x51,0x12,0x51,0x12,
			   0x51,0x12,0x5F,0xF2,0x51,0x12,0x51,0x92,0x51,0x72,0x50,0x12,
			   0x40,0x02,0x7F,0xFF,0x00,0x00,0x00,0x00,  //国
               0x00,0x00,0x00,0x00,0x1F,0xF0,0x12,0x20,0x12,0x20,0x12,0x20,
			   0x12,0x20,0xFF,0xFC,0x12,0x22,0x12,0x22,0x12,0x22,0x12,0x22,
			   0x1F,0xF2,0x00,0x02,0x00,0x0E,0x00,0x00,  //电
			   0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x82,
			   0x40,0x81,0x47,0xFE,0x48,0x80,0x50,0x80,0x60,0x80,0x40,0x80,
			   0x00,0x80,0x01,0x80,0x00,0x80,0x00,0x00,  //子
			   0x01,0x00,0x02,0x00,0x0C,0x00,0x3F,0xFE,0xE0,0x00,0x50,0x00,
			   0x15,0x7E,0x15,0x44,0x95,0x44,0x75,0x44,0x55,0x44,0x15,0x44,
			   0x15,0x7E,0x10,0x00,0x10,0x00,0x00,0x00,  //信
               0x00,0x00,0x00,0x04,0x00,0x1C,0x3F,0x80,0x2A,0xBC,0x2A,0x82,
			   0x6A,0x82,0xAA,0xA2,0x2A,0x9A,0x2A,0x82,0x2A,0x82,0x3F,0x8E,
			   0x00,0x00,0x00,0x10,0x00,0x0C,0x00,0x00,  //息
               0x10,0x80,0x10,0x82,0x11,0x01,0xFF,0xFE,0x12,0x00,0x14,0x02,
			   0x00,0x02,0x13,0x04,0x12,0xC8,0x12,0x30,0xFE,0x30,0x12,0x48,
			   0x13,0x84,0x12,0x06,0x10,0x04,0x00,0x00,  //技
               0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x20,0x08,0x40,0x09,0x80,
			   0x0A,0x00,0xFF,0xFE,0x0A,0x00,0x09,0x00,0x48,0x80,0x28,0x60,
			   0x08,0x30,0x08,0x18,0x08,0x10,0x00,0x00,  //术
               0x08,0x00,0x8F,0x01,0x68,0x01,0x11,0xFA,0x09,0x02,0x13,0x04,
			   0x23,0x08,0xE5,0x70,0x25,0x08,0x39,0x08,0x25,0x04,0x33,0xF6,
			   0x32,0x03,0x21,0x02,0x01,0x00,0x00,0x00,  //资
               0x08,0x20,0x84,0x3F,0x60,0xC0,0x07,0x02,0x00,0x0C,0x7F,0xF0,
			   0x40,0x04,0x4F,0x88,0x5A,0xB2,0x6A,0x81,0x4A,0xFE,0x4A,0x80,
			   0x4A,0xA0,0x4F,0x90,0x40,0x0C,0x00,0x00,  //源
               0x00,0x00,0x7F,0xFE,0x40,0x10,0x48,0x20,0x44,0xC0,0x43,0x00,
			   0x44,0xC0,0x58,0x30,0x44,0x20,0x42,0x40,0x41,0x80,0x4E,0x64,
			   0x44,0x06,0x7F,0xFC,0x00,0x00,0x00,0x00,  //网
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //空
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
			   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //空
			   };
#pragma data: data
/************************************************
函 数 名:    DelaymS()
功    能:    毫秒级延时函数
输入参数:     延迟时间/系统晶体
输出参数:    做相应的延迟处理
描    述:    /
***********************************************/
void DelaymS (uint i)           //延时函数,参数i为延时时间
{
    uchar j;                    //双重延时
	for (;i!=0;i--)
	{
	    for (j=30;j!=0;j--);
	}
}
/************************************************
函 数 名:    Init_port()
功    能:    单片机初始化函数
输入参数:     /
输出参数:    /
描    述:    相关口方向的设置等
***********************************************/
void Init_Port(void)
{
	DDRD = 0xff;                      //PD口为推挽1输出
	PORTD = 0x00;                     //PD口初始值为0
}
/************************************************
函 数 名:    InputByte()
功    能:    串行写入32bit数据(一行)的函数
输入参数:     lie_qishi(起始的列) ,hang_no(需要送第几行)
输出参数:    /
描    述:    DATA=PD4为数据端,SRCLK=PD6为时钟端,bit7在先,时钟上升沿写入。
***********************************************/
void InputByte (uint lie_qishi,uchar hang_no) 
{
    uchar i,mid;
	for(i=32;i>0;i--)
	{
	   mid = buf[lie_qishi +i+i] & hang_no;  //操作的是hang_no位。
	   if(mid==0)
	   PORTD |= (1<<PD4);             //数据端输出0,共阳LED,所以取反码
	   else 
	   PORTD &= ~(1<<PD4);            //否则输出1
	   PORTD |= (1<<PD6);             //时钟置高,产生下降沿。
	   NOP();
	   PORTD &= ~(1<<PD6);            //时钟置低
	 }
}
/************************************************
函 数 名:    switch_hang ()
功    能:    选行操作,控制138的输入
输入参数:     /
输出参数:    /
描    述:    /
***********************************************/
void switch_hang (uchar hang)   //选行操作
{
   uchar byTemp; 
   byTemp = PORTD & 0xF0;
   if (hang < 8)
   {
   	  PORTD = byTemp + 0x08 + hang;  //D=1
   }
   else
   {
      PORTD = byTemp + hang - 0x08;  //D=0
   }
}
/************************************************
函 数 名:    Display()
功    能:    动态扫描LED显示函数
输入参数:     /
输出参数:    /
描    述:    共16行,每行连续送4个字节的数据,两个字节为第2个汉字,后两个为第1个汉字。
***********************************************/
void Display (uint mov_no)               //动态显示函数
{
    uchar i;
	for(i=0;i<8;i++)    //上面8行
	{
	   PORTD |= (1<<PD7);      //OE=1,关闭输出,消隐
	   switch_hang (i);        //选行操作
	   
	   InputByte ((mov_no+mov_no),(0b10000000>>i));  //起始列和需要送显示的行
	   
	   PORTD |= (1<<PD5);             //RCLK=1,并行输出锁存器
	   NOP();
	   PORTD &= ~(1<<PD5);            //RCLK=0
	   //DelaymS(1);	         //消隐的时间,调节亮度用
	   PORTD &= ~(1<<PD7);      //OE=0,数据输出
	   DelaymS(2);	            //行显示的时间
	}
	for(i=0;i<8;i++)    //下面8行
	{
	   PORTD |= (1<<PD7);      //OE=1,关闭输出,消隐
	   switch_hang (i+7);        //选行操作
	   
	   InputByte ((mov_no+mov_no+1),(0b10000000>>i));  //起始列和需要送显示的行
	   
	   PORTD |= (1<<PD5);             //RCLK=1,并行输出锁存器
	   NOP();
	   PORTD &= ~(1<<PD5);            //RCLK=0
	   //DelaymS(1);	         //消隐的时间,调节亮度用
	   PORTD &= ~(1<<PD7);      //OE=0,数据输出
	   DelaymS(2);	            //行显示的时间
	}
}
//*****************主程序**********************************
void main (void)
{
     uint i;
	 uchar j;
	 DelaymS(100);	 
     Init_Port();      //初始化
	 
	 while (1)
	 
	 for (i=0;i<272;i++)
	 {
		  for (j=0;j<7;j++)         //移动的速度
		  Display (i);               //动态显示函数
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -