arduino扩展IO与M74HC595B芯片的使用,挪车电话提示牌的设计
2018-01-0915:39:24
首先arduino中shiftOUT()函数的定义与说明!
shiftOut()
描述
将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。
注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。
注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。
语法
shiftOut(dataPin, clockPin, bitOrder, value)
参数
dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先或最低位优先
value: 要移位输出的数据(byte)
调用的方法为
digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
shiftOut(dataPin,clockPin,MSBFIRST,a);
/*这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是dataPin的参数,
clockPin的参数是变量a,前面我们说了这个变量会一次从1+1+到256,是个十进制数,
输入到芯片后会产生8个二进制数,达到开关的作用*/
digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
delay(); //暂停500ms让你看到效果
先将latchpin拉低做准备,写入数据之后,拉高,即可。
整体代码如下
//VCC -- 5V
//GND -- GND
//DS -- A0
//ST_CP -- A1
//SH_CP -- A2
int latchPin = A1;//ST_CP
int clockPin = A2;//SH_CP
int dataPin = A0; //DS
//这里定义了74HC595的那三个脚
//设置阴极接口
int a = ;
int b = ;
int c = ;
int d = ;
int e = ;
int f = ;
int g = ;
//设置阳极接口
int d4 = ;
int d3 = ;
int d2 = ;
int d1 = ;
//设置变量
long n = ;
int x = ;
int del = ; //此处数值对时钟进行微调 byte segs[] = { a, b, c, d, e, f, g }; byte seven_seg_digits[][] = { { ,,,,,, }, // = 0
{ ,,,,,, }, // = 1
{ ,,,,,, }, // = 2
{ ,,,,,, }, // = 3
{ ,,,,,, }, // = 4
{ ,,,,,, }, // = 5
{ ,,,,,, }, // = 6
{ ,,,,,, }, // = 7
{ ,,,,,, }, // = 8
{ ,,,,,, } // = 9
}; void setup ()
{
pinMode(,INPUT);
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
//让74HC595的三个脚都是输出状
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
}
//这个函数是显示一个数用的disNum(显示的数,显示的位,是否有小数点(1为有小数点))
void disNum(int Num_Qua, int Num_Pos)
{
int Num_Qua_B = ;
int Num_Pos_B = ;
switch (Num_Qua)
{
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case : Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
default: Num_Qua_B = ;break;
};
//这个值转换为2进制 为一个数abcdefg的需要亮的针脚。
switch (Num_Pos)
{
case :Num_Pos_B = 0xffe;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
};
//这个值转换为2进制 为当前点亮的位数。
digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
int L = Num_Qua_B; int R = Num_Pos_B;
shiftOut(dataPin,clockPin,MSBFIRST,R);
shiftOut(dataPin,clockPin,MSBFIRST,L);
digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
//上面是74HC595的输出方式 每个74HC595能接受一个8位的2进制数值来电灯 第一个74HC595再次输入一个8位的数值他会把他现在的数值传给第二个串联的74HC595。
delayMicroseconds();
}
//这个是显示数用的函数
void showNum(double number)//注意用double,int不够长了。
{
long num = number;
int ShowNumber [];
ShowNumber[] = (num/)%;
ShowNumber[]= (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[]= (num/)%;
//取得每一位的数。然后存在一个数组里。
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
//依次显示数字,因为LED的闪烁很快,所以人眼无法识别闪烁。
}
void loop()
{
if (digitalRead()==LOW ) liang();
else cong();
}
void cong()
{
showNum();//相对简单的函数调用
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
}
void liang()
{
showNum();//相对简单的函数调用
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
}
void pickDigit(int x) //定义pickDigit(x),其作用是开启dx端口
{
digitalWrite(d1, LOW);
digitalWrite(d2, LOW);
digitalWrite(d3, LOW);
digitalWrite(d4, LOW);
switch(x)
{
case :
digitalWrite(d1, HIGH);
break;
case :
digitalWrite(d2, HIGH);
break;
case :
digitalWrite(d3, HIGH);
break;
default:
digitalWrite(d4, HIGH);
break;
}
}
void clearLEDs() //清屏
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// 点亮对应数字的数码管
void lightSegments(int x) {
for (int i = ; i < ; i++) {
digitalWrite(segs[i], seven_seg_digits[x][i]);
}
}
功能与效果的实现
arduino扩展IO与M74HC595B芯片的使用,挪车电话提示牌的设计的更多相关文章
- 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
上次的nodejs操作arduino入门篇中实现了如何连接arduino.这次我们来实现通过arduino测量室内温度并在浏览器上显示出来. [所需材料] 硬件:LM35温度传感器,arduino u ...
- IM2603资料 Type-C 扩展坞电源管理芯片
用于带有集成降压转换器的 Type-C 外围应用的电源管理 IC IM2603 是一款主要用于 Type-C 外围应用的电源管理 IC. 它集成了一个带有内置高侧 MOSFET 的同步降压转换器和一个 ...
- Typec转HDMI+VGA+PD3.0+USB3.0扩展坞四合一芯片方案|CS5268替代AG9321
CS5268是一种高度集成的单芯片,适用于多个细分市场和显示应用,如拓展坞.扩展底座等. 2.CS5268参数说明 总则 USB Type-C规范1.2 HDMI规范v2.0b兼容发射机,数据速率高达 ...
- CS5268 Typec转HDMI+VGA+PD3.0四合一扩展坞转换器方案芯片
Capstone CS5268AN是一款高性能Type-C/DP1.4至HDMI2.0b和VGA转换器,设计用于将USB Type-C源或DP1.4源连接至HDMI2.0b接收器.CS5268AN集成 ...
- Arduino 各种模块篇 GPRS module 手机模块 短信 电话 上网 for texting, calling, internet
---恢复内容开始--- The GPRS shield which I tested is one which looks like this: ---恢复内容结束--- Need to be re ...
- 【STM32H7教程】第48章 STM32H7的FMC总线应用之是32路高速IO扩展
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第48章 STM32H7的FMC总线应用之是32路 ...
- Arduino小车学习与研究
信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...
- Arduino智能小车实践学习报告
Arduino智能小车实践学习报告 参与人员: 20135316 王剑桥 20135312 吴汉彦 20135319 朱锂 一. 背景了解: 单片机:将中央处理单元CPU(进行运算.控制).随机存储器 ...
- Arduino小车学习与研究博客
Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...
随机推荐
- gitlab勾住rocket chat
出于协作的要求, 需要在把gitlab的push event勾到rocket chat上面, 通知协作的其他人. BUT rocket chat提供的脚本没有具体的文件diff, so, 只好修改一下 ...
- 第二章:Python基础の快速认识基本数据类型和操作实战
本课主题 字符串和操作实战 二进制操作实战 List 列表和操作实战 Tuple 元組和操作实战 Dict 字典和操作实战 作業需求 引言 这遍文章简单介绍了 Python 字符串和集合的方法和应用, ...
- ES6小点心之通用弹窗
小点心,顾名思义,开箱即食,拿来即用. 前端业务逻辑主要分为[交互效果]和[数据展示]两方面.数据展示可使用 MVVM 框架来实现.前端的交互效果常用的也就那么几种,比如弹窗,楼层定位,倒计时,下拉刷 ...
- Kafka的特点及使用场景
Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. ...
- [转载]CentOS 7安装Gnome GUI 图形界面
原文链接:http://www.centoscn.com/image-text/config/2015/0528/5552.html 当你安装centos服务器版本的时候,系统默认是不会安装 Cent ...
- SP3精密星历简介
IGS精密星历采用sp3格式,其存储方式为ASCII文本文件,内容包括表头信息以及文件体,文件体中每隔15 min给出1个卫星的位置,有时还给出卫星的速度.它的特点就是提供卫星精确的轨道位置.采样率为 ...
- Oracle 11G Client 安装就可以用上Oracle11G啦,不用傻傻的安装2G多的Oracle啦,安装特别简单,使用起来更简单
下载地址: http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip 先将下载下来的ZIP文件解压,并运行se ...
- 51 Nod 1027 大数乘法【Java大数乱搞】
1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...
- c++(快速排序)
快速排序是编程中经常使用到的一种排序方法.可是很多朋友对快速排序有畏难情绪,认为快速排序使用到了递归,是一种非常复杂的程序,其实未必如此.只要我们使用好了方法,就可以自己实现快速排序. 首先,我们复习 ...
- Monthly update for Dynamics 365 for Operation
日期 标题, 类别 版本 描述 2017/8/22 Dyn 365 Fin and Ops, Ent ed July 2017 Plat Update 10 Category: Download ...