点阵实验

点阵实验

实验现象

利用8×8点阵显示出心跳动画

理论学习

该点阵为共阳点阵,行控制LED阳极

原理图

在这里插入图片描述
在这里插入图片描述

注意:模拟I/O口不仅仅是模拟I/O的功能,同时它也具备了数字I/O口的功能,所有的I/O都有数字I/O的功能,但是模拟I/O口在这个基础之上有了模拟I/O口的功能

代码编写

#define h1 2
#define h2 7
#define h3 A5
#define h4 5
#define h5 13 
#define h6 A4
#define h7 12
#define h8 A2
#define l1 6
#define l2 11
#define l3 10
#define l4 3
#define l5 A3
#define l6 4
#define l7 8
#define l8 9
//大心脏的显示
unsigned char table1[8][8] = {
	0,0,0,0,0,0,0,0,
	0,1,1,0,0,1,1,0,
	1,1,1,1,1,1,1,1,
	1,1,1,1,1,1,1,1,
	1,1,1,1,1,1,1,1,
	0,1,1,1,1,1,1,0,
	0,0,1,1,1,1,0,0,
	0,0,0,1,1,0,0,0,
};
//小心脏的显示
unsigned char table2[8][8] = {
	0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,
	0,0,1,0,0,1,0,0,
	0,1,1,1,1,1,1,0,
	0,1,1,1,1,1,1,0,
	0,0,1,1,1,1,0,0,
	0,0,0,1,1,0,0,0,
	0,0,0,0,0,0,0,0,
};
void setup()
{
	pinMode(h1, OUTPUT);
	pinMode(h2, OUTPUT);
	pinMode(h3, OUTPUT);
	pinMode(h4, OUTPUT);
	pinMode(h5, OUTPUT);
	pinMode(h6, OUTPUT);
	pinMode(h7, OUTPUT);
	pinMode(h8, OUTPUT);
	pinMode(l1, OUTPUT);
	pinMode(l2, OUTPUT);
	pinMode(l3, OUTPUT);
	pinMode(l4, OUTPUT);
	pinMode(l5, OUTPUT);
	pinMode(l6, OUTPUT);
	pinMode(l7, OUTPUT);
	pinMode(l8, OUTPUT);
}
void display(unsigned char dat[8][8]) {
	digitalWrite(l1, LOW);             //选通第一列
	digitalWrite(h1, dat[0][0]);
	digitalWrite(h2, dat[1][0]);
	digitalWrite(h3, dat[2][0]);
	digitalWrite(h4, dat[3][0]);
	digitalWrite(h5, dat[4][0]);
	digitalWrite(h6, dat[5][0]);
	digitalWrite(h7, dat[6][0]);
	digitalWrite(h8, dat[7][0]);
	delay(1); //延时一小段时间,等待LED被点亮
	clear();  //清空显示去除余晖
	digitalWrite(l2, LOW);             //选通第二列
	digitalWrite(h1, dat[0][1]);
	digitalWrite(h2, dat[1][1]);
	digitalWrite(h3, dat[2][1]);
	digitalWrite(h4, dat[3][1]);
	digitalWrite(h5, dat[4][1]);
	digitalWrite(h6, dat[5][1]);
	digitalWrite(h7, dat[6][1]);
	digitalWrite(h8, dat[7][1]);
	delay(1);
	clear();
	digitalWrite(l3, LOW);             //选通第三列
	digitalWrite(h1, dat[0][2]);
	digitalWrite(h2, dat[1][2]);
	digitalWrite(h3, dat[2][2]);
	digitalWrite(h4, dat[3][2]);
	digitalWrite(h5, dat[4][2]);
	digitalWrite(h6, dat[5][2]);
	digitalWrite(h7, dat[6][2]);
	digitalWrite(h8, dat[7][2]);
	delay(1);
	clear();
	digitalWrite(l4, LOW);             //选通第四列
	digitalWrite(h1, dat[0][3]);
	digitalWrite(h2, dat[1][3]);
	digitalWrite(h3, dat[2][3]);
	digitalWrite(h4, dat[3][3]);
	digitalWrite(h5, dat[4][3]);
	digitalWrite(h6, dat[5][3]);
	digitalWrite(h7, dat[6][3]);
	digitalWrite(h8, dat[7][3]);
	delay(1);
	clear();
	digitalWrite(l5, LOW);             //选通第五列
	digitalWrite(h1, dat[0][4]);
	digitalWrite(h2, dat[1][4]);
	digitalWrite(h3, dat[2][4]);
	digitalWrite(h4, dat[3][4]);
	digitalWrite(h5, dat[4][4]);
	digitalWrite(h6, dat[5][4]);
	digitalWrite(h7, dat[6][4]);
	digitalWrite(h8, dat[7][4]);
	delay(1);
	clear();
	digitalWrite(l6, LOW);             //选通第六列
	digitalWrite(h1, dat[0][5]);
	digitalWrite(h2, dat[1][5]);
	digitalWrite(h3, dat[2][5]);
	digitalWrite(h4, dat[3][5]);
	digitalWrite(h5, dat[4][5]);
	digitalWrite(h6, dat[5][5]);
	digitalWrite(h7, dat[6][5]);
	digitalWrite(h8, dat[7][5]);
	delay(1);
	clear();
	digitalWrite(l7, LOW);             //选通第七列
	digitalWrite(h1, dat[0][6]);
	digitalWrite(h2, dat[1][6]);
	digitalWrite(h3, dat[2][6]);
	digitalWrite(h4, dat[3][6]);
	digitalWrite(h5, dat[4][6]);
	digitalWrite(h6, dat[5][6]);
	digitalWrite(h7, dat[6][6]);
	digitalWrite(h8, dat[7][6]);
	delay(1);
	clear();
	digitalWrite(l8, LOW);             //选通第八列
	digitalWrite(h1, dat[0][7]);
	digitalWrite(h2, dat[1][7]);
	digitalWrite(h3, dat[2][7]);
	digitalWrite(h4, dat[3][7]);
	digitalWrite(h5, dat[4][7]);
	digitalWrite(h6, dat[5][7]);
	digitalWrite(h7, dat[6][7]);
	digitalWrite(h8, dat[7][7]);
	delay(1);
	clear();
}
void clear() {
	digitalWrite(h1, LOW);
	digitalWrite(h2, LOW);
	digitalWrite(h3, LOW);
	digitalWrite(h4, LOW);
	digitalWrite(h5, LOW);
	digitalWrite(h6, LOW);
	digitalWrite(h7, LOW);
	digitalWrite(h8, LOW);
	digitalWrite(l1, HIGH);
	digitalWrite(l2, HIGH);
	digitalWrite(l3, HIGH);
	digitalWrite(l4, HIGH);
	digitalWrite(l5, HIGH);
	digitalWrite(l6, HIGH);
	digitalWrite(l7, HIGH);
	digitalWrite(l8, HIGH);
}
void loop()
{
	//显示第一副图
	for (int i = 0; i < 100; i++) {
		display(table1);
	}
	//显示第二幅图
	for (int i = 0; i < 50; i++) {
		display(table2);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面我来为您讲解一下如何使用汇编语言编写单片机点阵实验。 首先,我们需要明确点阵模块的接口,常见的点阵模块接口有16x16和8x8两种。这里以8x8点阵模块为例。 8x8点阵模块的接口一般包括16个引脚,其中8个为行控制引脚,8个为列控制引脚。控制方法为行列扫描,控制引脚的状态决定了点阵的亮灭情况。具体来说,当某一行引脚为高电平时,对应的列引脚为低电平则对应的LED亮,否则熄灭。我们可以通过控制每一行和每一列的引脚状态,来实现对点阵的控制。 接下来,我们需要使用汇编语言编写程序来控制点阵。这里以51单片机为例,其他单片机的实现方式类似。 首先,我们需要定义行列控制引脚的端口地址和相应的位。 ```assembly ;定义行控制引脚的端口地址和相应的位 row_port equ P1 r0 equ 0 r1 equ 1 r2 equ 2 r3 equ 3 r4 equ 4 r5 equ 5 r6 equ 6 r7 equ 7 ;定义列控制引脚的端口地址和相应的位 col_port equ P2 c0 equ 0 c1 equ 1 c2 equ 2 c3 equ 3 c4 equ 4 c5 equ 5 c6 equ 6 c7 equ 7 ``` 接下来,我们需要定义点阵中每个LED的状态,这里以一个笑脸为例。 ```assembly ;定义点阵中每个LED的状态 smile db 0x3C, 0x42, 0x95, 0xA1, 0xA1, 0x95, 0x42, 0x3C ``` 然后,我们需要编写主程序,通过循环控制每一行和每一列的引脚状态,来实现对点阵的控制。 ```assembly main: mov row_port, #0xFF ;行控制引脚初始化 mov col_port, #0x00 ;列控制引脚初始化 ;循环控制每一行 mov r0, #0 mov r1, #1 mov r2, #2 mov r3, #3 mov r4, #4 mov r5, #5 mov r6, #6 mov r7, #7 loop_row: ;循环控制每一列 mov c0, #0 mov c1, #1 mov c2, #2 mov c3, #3 mov c4, #4 mov c5, #5 mov c6, #6 mov c7, #7 loop_col: ;获取当前LED的状态 mov a, r0 add a, a add a, a add a, a mov dpl, a mov dph, #0 movx a, @dptr mov b, c0 rlc a jnc skip mov b, c1 skip: ;设置列控制引脚的状态 mov col_port, b djnz c7, loop_col ;列控制引脚循环结束 ;设置行控制引脚的状态 mov row_port, 0xFF clr a.0 rlc r0 mov row_port, a djnz r7, loop_row ;行控制引脚循环结束 sjmp main ;主程序循环结束 ``` 以上就是一个简单的汇编语言程序,通过控制每一行和每一列的引脚状态,来实现对点阵的控制。当然,这只是一个简单的例子,实际应用中需要根据具体需求进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_45671732

你们鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值