实验现象
按下按键,根据按下按键时间长短进行编码,按下时间较长为虚线,按下时间较短为点。在LCD1602模块实时显示解码结果。
理论学习
LCD1602主要技术参数
显示容量为16×2个字符;
芯片工作电压为4.5~5.5V;
工作电流为2.0mA(5.0V);
模块最佳工作电压为5.0V;
字符尺寸为2.95×4.35(W×H)mm。
图1 1602液晶接口引脚定义
图2 1602液晶的基本操作
实验准备
arduino主板-1
面包板-1
数据线-1
LCD1602模块-1
电位器-1
按键-1
按键帽-1(可省略)
跳线若干
连接电路
电路图
实验代码
#include <stdio.h>
#include <string.h>
#include "DS1302.h"
#include "LiquidCrystal.h"
String code = "";
int len = 0;
char ch;
char new_char;
const int but = 2;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口
unsigned long pres_len = 0, rel_time, pres_time = 0, old_time_len = 0, old_pres = 0, space = 0;
int state = 0;
int unit_delay = 250;
int min_delay = 10;
void setup()
{
pinMode(but, INPUT_PULLUP);
lcd.begin(16,2);
lcd.clear(); //清屏
delay(1000); //延时1000ms
}
char MakeString()
{
if (pres_len < (unit_delay*3) && pres_len > 50)
{
return '.'; //if button press less than 0.6sec, it is a dot
}
else if (pres_len > (unit_delay*3))
{
return '-'; //if button press more than 0.6sec, it is a dash
}
}
void Morse_decod()
{
static String morse[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "!"
};
int i = 0;
while (morse[i] != "!")
{
if (morse[i] == code)
{
lcd.print(char('A' + i));
break;
}
i++;
}
code = "";
}
void loop ()
{
label:
while (digitalRead(but) == HIGH) {}
old_pres = rel_time;
pres_time = millis();
while (digitalRead(but) == LOW) {}
rel_time = millis();
pres_len = rel_time - pres_time;
space = pres_time - old_pres;
if (pres_len > min_delay)
{
code += MakeString();
}
while ((millis() - rel_time) < (unit_delay * 3))
{
if (digitalRead(but) == LOW)
{
goto label;
}
}
Morse_decod();
delay(500); //延时0.1秒,这里也就是刷新速度。
}
实现效果
相关文章
【Arduino创意】基于蜂鸣器制作摩尔斯电码生成器