Demo8:LED点阵实验、存储器类型

实验名称:LED点阵实验   

1、LED点阵(显示一个点)
2、LED点阵(显示数字)
3、LED点阵(显示汉字)    
4、LED点阵(显示图像) 

知识点1:存储器类型

data:RAM低128字节,响应速度最快,采用直接寻址方式
idata:RAM全256字节,采用间接寻址方式,速度相对较慢
bdata:片内RAM,位寻址方式
xdata:外部扩展RAM,采用DPTR访问 (64k)
pdata:外部扩展RAM低256字节,分页寻址(一页256byte)
code:程序存储区(64k)

知识点2:已初始化的全局变量,放在code比较合理(个人感觉)

参考数据:内存的全局区
‌在单片机中,全局变量通常存储在内存的全局区(也称为静态区),具体分为.bss段和.data段。‌‌
全局变量的存储位置
‌.bss段‌:存放未初始化的全局变量和静态变量。这些变量在程序启动时由操作系统初始化,不占用可执行文件空间。
‌.data段‌:存放已经初始化的全局变量和静态变量。这些变量占用可执行文件空间,并在程序启动时由程序初始化。
全局变量的定义和初始化
‌未初始化的全局变量‌:存储在.bss段,例如int a。
‌已初始化的全局变量‌:存储在.data段,例如int b = 0。

/**************************************************************************************
实验名称:LED点阵实验
1、LED点阵(显示一个点)
2、LED点阵(显示数字)
3、LED点阵(显示汉字)	
4、LED点阵(显示图像)																			  

函数_nop_ 
是“no operation”的缩写,意为“不做任何操作”。在51单片机的汇编语言中,
nop 指令表示执行一个空指令周期,即单片机什么都不做,仅仅消耗掉一个机器周期,
程序会直接进入下一个指令。
***************************************************************************************/
#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义74HC595控制管脚
sbit rCLK=P3^4;		//存储寄存器时钟输入
sbit SRCLK=P3^5;	//移位寄存器时钟输入
sbit SER=P3^6; 		//串行数据输

//LED点阵显示行数据
code u8 gled_row[32]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//LED点阵列数据(显示数字:0)
code u8 gled_col2[32]=
{0x00,0x00,0xE0,0x07,0x10,0x08,0x08,0x10,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,
0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x08,0x10,0x10,0x08,0xE0,0x07,0x00,0x00,};
//LED点阵列数据(显示汉字:龍)
code u8 gled_col3[32]=
{0x08,0x02,0x10,0x02,0x7E,0x7E,0x24,0x02,0x18,0x7E,0xFF,0x40,0x00,0x7E,0x7E,0x02,
0x42,0x7E,0x7E,0x02,0x42,0x7E,0x7E,0x02,0x42,0x7E,0x42,0x02,0x52,0x42,0x22,0x7C,};
//LED点阵列数据(显示图像:心)
code u8 gled_col4[32]=
{0x00,0x00,0x66,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x7E,0x00,0x3C,0x00,0x18,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};


/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能		 : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输    出    	 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

/*******************************************************************************
* 函 数 名         : hc595_write_data(u8 dat)
* 函数功能		   : 向74HC595写入4个字节的数据
* 输    入         : dat1:对应74HC595(A)输出第1行-第8行
					 dat2:对应74HC595(B)输出第9行-第16行
					 dat3:对应74HC595(C)输出第1列-第8列
					 dat4:对应74HC595(D)输出第9列-第16列
* 输    出         : 无
*******************************************************************************/
void hc595_write_data(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
	u8 i=0;
	
	for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
	{
		SER=dat4>>7;//优先传输一个字节中的高位
		dat4<<=1;//将低位移动到高位
		SRCLK=0;
		_nop_();
		SRCLK=1;
		_nop_();	
	}
	
	for(i=0;i<8;i++)
	{
		SER=dat3>>7;
		dat3<<=1;
		SRCLK=0;
		_nop_();
		SRCLK=1;
		_nop_();
	}

	for(i=0;i<8;i++)
	{
		SER=dat2>>7;
		dat2<<=1;
		SRCLK=0;
		_nop_();
		SRCLK=1;
		_nop_();
	}

	for(i=0;i<8;i++)
	{
		SER=dat1>>7;
		dat1<<=1;
		SRCLK=0;
		_nop_();
		SRCLK=1;
		_nop_();
	}

	rCLK=0;
	_nop_();
	rCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出	
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	u8 i=0;

	while(1)
	{			
		for(i=0;i<16;i++)//循环16次扫描16行、列
		{
			//1、点亮第一行第一列的LED灯
			//hc595_write_data(0x01,0x00,0xfe,0xff);
			//2、显示图片
			//hc595_write_data(gled_row[i],gled_row[i+16],~gled_col2[i*2],~gled_col2[i*2+1]);
			//3、显示汉字:龍
			//hc595_write_data(gled_row[i],gled_row[i+16],~gled_col3[i*2],~gled_col3[i*2+1]);
			//4、显示图片
			hc595_write_data(gled_row[i],gled_row[i+16],~gled_col4[i*2],~gled_col4[i*2+1]);

			delay_10us(10);//延时一段时间,等待显示稳定
			hc595_write_data(0x00,0x00,0x00,0x00);//消影	
		}									
	}		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值