📄 display_led._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 + -