资料介绍
描述
该项目涉及使用 ATmega328 设计七段显示 (SSD) I2C 驱动程序。
七段显示器通常采用十针封装。虽然八个引脚对应于八个 LED,但其余两个引脚(中间)是公共的并且内部短路。因此,当使用微控制器操作七段 LED 显示屏时,需要 8 个引脚来控制显示屏中的各个 LED,使用解码器可以将其减少到 4 个。随着越来越多的 SSD 添加到显示器中,这个数字会增加。
然而,在大多数应用中,使用单个数字七段显示器 (SSD) 可能不足以显示全部信息,因此多个 SSD 单元并联连接。为了显示不同的字符、符号或数字,每个 SSD 上显示的数据必须不同。但是,要同时驱动多个此类 SSD,控制它们所需的引脚数乘以正在使用的 SSD 数量。由于微控制器或驱动器上可用的 I/O 引脚数量有限,这将成为一个重大问题。该问题最广泛使用的解决方案是 SSD 数据的时分复用。在任何时刻,控制器或 SSD 解码器仅在单个 SSD 上运行,而不是同时在多个 SSD 上运行。这必须以足够快的速度完成以避开人类的视觉暂留,但必须足够慢以使显示屏上的 LED 有足够的时间来执行切换动作。使用通常由晶体管作为开关组成的另一个电路来选择单个 SSD。
除了在 SSD 显示屏上显示信息外,微控制器可能还需要执行其他功能,这可能需要也可能不需要使用 I/O 线。但是,这可能会影响 SSD 的显示时序,并可能导致不必要的暂停或关闭显示,直到 CPU 完成执行相应的指令集。
在将微控制器与 SSD 显示器连接的情况下,使用另一个微控制器作为驱动程序作为主微控制器的外围设备会非常有帮助。它还可以使显示系统隔离,并且可以使主微控制器自由执行其他指令。驾驶员必须注意显示系统中适当组件的时序和切换。主控制器和 I2C 驱动控制器之间的接口可以使用各种通信协议来完成,例如 SPI(串行外设接口)、UART(通用异步接收器发送器)、I2C(内部集成电路)等。其中,UART 是不可扩展,仅适用于固定的设备到设备通信,并且像 SPI 一样,不保证验证数据是否已正确发送。I2C 提供了所有这些优势,并且只需 2 条时钟 (SCL) 线和数据 (SDA) 线即可实现成本更低。I2C 还允许同一总线上的多个主机和从机,因此多个设备可以访问同一资源(SSD 显示器)。
设置:
用作主机的设备:Arduino UNO R3
用于驱动的微控制器:Atmel ATMEGA328(启动加载)
使用的编程器:FTDI R232RL(USB转串口TTL逻辑)
使用的编程平台:Arduino IDE 1.8.9
显示类型:6x1 SSD LED共阳极显示
SSD显示器与驱动的连接如下:
I2C 主设备(主控制器)从连接到其 ADC 引脚 A0 的 LDR 收集数据,并使用从地址将数据传输到 I2C 从设备(SSD 驱动器)。驱动程序在复位时在 SSD 显示屏上显示从地址。当它从主设备接收到数据时,它会一次更改数据缓冲区上的一个数字的数据,并继续将缓冲区上的数据显示到 SSD 显示器上。
LUT(查找表)将被写入主设备以获得更大的灵活性。段的数据被认为是二进制 1 表示 LED 亮,但是,使用的设备是共阳极类型的,因此,在显示之前,驱动程序将逻辑反转。主机首先发送数字位置的地址,然后是要由段显示的数据。该地址应在 1-6 范围内,如硬件中使用的那样。驱动程序拒绝此范围之外的任何地址。
编程:
从站:SSD_Driver.ino
#include //library;
int flag=1,m=0,n=0; //preset conditions;
byte arr[6]={0,0,0,0,0,0}; //initial buffer;
int segment[8]={0,1,2,3,4,5,6,7}; //segment/LED a,b,c,d,e,f,g,h;
int select[6]={13,12,11,10,9,8}; //digit number 1,2,3,4,5,6;
byte LUTmap=B11111111; //initial state – all LEDs off;
void setup() {
for(int i=0;i<=13;i++)
pinMode(i,OUTPUT); //all pins are output;
callforsegment(B00000000); flag++; //select digit 1;
callforsegment(B11111100); flag++; //display 0;
callforsegment(B00000010); flag++; //select digit 3;
callforsegment(B11110010); flag++; //display 3;
callforsegment(B00000011); flag++; //select digit 4;
callforsegment(B11111110); flag++; //display 8;
callforsegment(B00000100); flag++; //select digit 5;
callforsegment(B01101110); flag++; //display H(hex address);
Wire.begin(0x38); //i2c slave address for the driver;
Wire.onReceive(receiveEvent); //action on receiving data via i2c bus;
}
void segWrite(byte a) {
LUTmap=~a; //convert to common anode logic;
for(int i=0;i<8;i++)
//display to each segment in a digit;
digitalWrite(segment[i],bitRead(LUTmap,7-i));
}
void loop() {
for(int i=0;i<6;i++) {
digitalWrite(select[i],HIGH); //selecting one of the digits;
segWrite((byte)arr[i]); //writing data to the digit;
delay(5); //ON time;
digitalWrite(select[i],LOW); //deactivating the selected digit;
}
}
void callforsegment(int a) {
if(flag%2==1 && a<=7 && a>=0)
m=a; //first byte about digit location;
else {
n=a; //second byte about data for the digit;
flag=0;
}
arr[m]=(byte)n; //store data to the buffer space;
}
void receiveEvent(int howMany) {
while (1 < Wire.available()) //loop through all except last;
char c = Wire.read(); //receive byte as a character;
int x = Wire.read(); //receive byte as an integer;
callforsegment(x);
flag++;
}
主:ADC_master.ino
#include
#include //include library;
SSDmaster device(0x38); //address of slave driver;
void setup() {
Wire.begin();
}
void loop() {
int ldrval=analogRead(A0); //variable to store ADC data;
device.ssdDisplay(1,B00011100); //display L;
device.ssdDisplay(2,B01111010); //display D;
device.ssdDisplay(3,B00001010); //display R;
device.ssdDisplaynum(4,(byte)ldrval); //display ADC value;
delay(250); //rate of updation;
}
结果:
上电驱动显示 I2C 从地址。当与识别其从地址的适当 I2C 主设备连接时,从主设备发送的数据(在这种情况下为光强度)会打印到显示器上。
尾注:
使用 SSD_Driver 库构建所需的系统。
- 为Raspberry Pi创建七段显示驱动程序
- 七段显示器开源分享
- ATmega328 MPPT太阳能充电器
- ATmega328/168/8/48/88编程屏蔽开源
- AtMega328编程/开发板开源分享
- Atmega328 led动画或vumeter开源分享
- Atmega328时钟开源分享
- 用于测试Atmega328/Arduino Uno和Atmega1284/p的板
- 定制设计的七段显示器
- ATMEGA328/8 SMD转DIP PCB
- 基于ATmega328的Arduino的变频驱动器 4次下载
- ATMEGA328数据手册.英文版pdf 0次下载
- Arduino Uno微控制器采用的是Atmel的ATmega328
- 七段数码管显示的C51程序免费下载
- 七段显示器控制电路四位数_使用译码器驱动 148次下载
- 七段LED显示器的工作原理与驱动方法 979次阅读
- 怎么编写Framebuffer驱动程序 402次阅读
- 如何为ATmega328P刷bootloader? 6919次阅读
- bcd七段闪现译码器电路原理 1.8w次阅读
- 七段计数器电路图 5254次阅读
- digilent七段显示器简介 1663次阅读
- 七段数码管驱动方式_七段数码管怎么接 1.6w次阅读
- 七段LED数码管显示原理 4w次阅读
- 如何采用Arduino系统板进行单片机编程 6269次阅读
- 七段数码管的引脚图及数码管的使用条件和注意事项说明 3.6w次阅读
- 浅谈电脑驱动程序的工作原理 详解电脑驱动程序意义 2.9w次阅读
- 8255A驱动程序 3193次阅读
- 7段数码管显示的VHDL设计(两款设计方案) 2.1w次阅读
- Xilinx设备的驱动程序 7967次阅读
- PCI驱动程序开发实例 6701次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多