You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino Uno驱动Nokia 5110 LCD时钟:仅单独设置秒数字体大小的技术问询

解决Nokia 5110 LCD单独设置秒数字体大小的问题

嗨,很高兴能帮你搞定这个问题!要单独把秒数的字体改成setTextSize(1),核心思路就是在打印秒数前临时切换字体大小,打印完成后再切回原来的大小。Adafruit_GFX库的字体设置是全局的,但我们可以通过在不同内容打印前后切换它来实现局部字体差异。

关键修改步骤

  1. 打印小时、分钟时保持setTextSize(2)的大字体
  2. 定位到秒数的打印位置后,调用display.setTextSize(1)切换到小字体
  3. 打印完秒数后,后续如果还有大字体内容,记得切回setTextSize(2)

修改后的完整代码(已修复字体问题+部分小bug)

//程序:使用Adafruit库测试Nokia 5110显示屏
//作者:VINICIUS LOPES
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// 引脚3 - 串行时钟输出(SCLK)
// 引脚4 - 串行数据输出(DIN)
// 引脚5 - 数据/命令选择(D/C)
// 引脚6 - LCD芯片选择(CS/CE)
// 引脚7 - LCD复位(RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3,4,5,6,7);
int second,minute, hour, day, month,year; // 修正拼写:mounth -> month
unsigned long UtlTime;

void setup() {
 pinMode(2,OUTPUT);
 UtlTime=0;
 minute=30;
 hour=6;
 day=9;
 month=5; // 修正拼写
 year=21;
 Serial.begin(9600);
 display.begin();
 display.setContrast(80); // 调整显示屏对比度
 display.clearDisplay(); // 清除缓冲区和显示屏
 display.setTextSize(2); // 设置文本大小
 display.setTextColor(BLACK); // 设置文本颜色
 display.print("Date \n & \nTime ");
 display.setCursor(0,10);
 display.display();
 delay (5000);

 // 设置小时
 display.clearDisplay();
 display.setCursor(0,0);
 display.print("hour:");
 display.display();
 Serial.print("\nin between hour:");
 while(hour==0) {
 if (Serial.available() > 0) {
 hour= Serial.parseInt();
 }
 }
 display.print(hour);
 display.display();
 delay(1000);

 // 设置分钟
 display.clearDisplay();
 display.setCursor(0,0);
 display.print("minute:");
 display.display();
 Serial.print("\nin between minute:");
 while(minute==0) { // 修正逻辑:原代码误判hour==0
 if (Serial.available() > 0) {
 minute= Serial.parseInt();
 }
 }
 display.print(minute);
 display.display();
 delay(1000);

 // 设置月份
 display.clearDisplay();
 display.setCursor(0,0);
 display.print("month:");
 display.display();
 Serial.print("\nin between month:");
 while(month==0) {
 if (Serial.available() > 0) {
 month= Serial.parseInt(); // 修正逻辑:原代码误赋值给day
 }
 }
 display.print(month);
 display.display();
 delay(1000);

 // 设置日期
 display.clearDisplay();
 display.setCursor(0,0);
 display.print("day:");
 display.display();
 Serial.print("\nin between day:");
 while(day==0) {
 if (Serial.available() > 0) {
 day= Serial.parseInt();
 }
 }
 display.print(day);
 display.display();
 delay(1000);

 // 设置年份
 display.clearDisplay();
 display.setCursor(0,0);
 display.print("year:");
 display.display();
 Serial.print("\nin between year:");
 while(year==0) {
 if (Serial.available() > 0) {
 year= Serial.parseInt();
 }
 }
 display.print(year);
 display.display();
 delay(1000);
 display.clearDisplay();
}

void loop() {
 if(millis()-UtlTime<0) {
 UtlTime=millis();
 } else {
 second=int((millis()-UtlTime)/1000);
 }

 if(second>59) {
 second=0;
 minute++;
 UtlTime=millis();
 if(minute>59) {
 hour++;
 minute=0;
 if(hour>23) {
 day++;
 hour=0;
 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) {
 if(day>31) {
 day=1;
 month++;
 if(month>12) {
 year++;
 month=1;
 }
 }
 } else if(month==2) {
 if(year%400==0) {
 if(day>29) {
 day=1;
 month++;
 }
 } else if((year%4==0)&&(year%100!=0)) {
 if(day>29) {
 day=1;
 month++;
 }
 } else {
 if(day>28) {
 day=1;
 month++;
 }
 }
 } else {
 if(day>30) {
 day=1;
 month++;
 }
 }
 }
 }

 display.clearDisplay();
 // 移除原delay(1000),避免时间显示卡顿

 Serial.print(month);
 Serial.print("/");
 Serial.print(day);
 Serial.print("/");
 Serial.print(year);
 Serial.println();

 display.setCursor(0,0);
 display.setTextSize(2); // 日期保持大字体
 display.print(" ");
 display.print(month);
 display.print("/");
 display.print(day);
 display.print("/");
 display.print(year);

 // 打印时间部分
 Serial.print(hour);
 Serial.print(":");
 Serial.print(minute);
 Serial.print(":");
 Serial.print(second);
 Serial.print("\n");
 Serial.println();

 display.setCursor(0,16);
 display.setTextSize(2); // 小时和分钟用大字体
 display.print(" ");
 display.print(hour);
 display.print(":");
 display.print(minute);

 // 切换小字体打印秒数,调整光标位置确保对齐
 display.setTextSize(1);
 display.setCursor(48, 20); // 可根据实际显示效果微调坐标
 display.print(":");
 display.print(second);

 display.display();

 char tecla;
 tecla = Serial.read();
 if(tecla=='1') {
 digitalWrite(2,LOW);
 }
 if(tecla=='2') {
 digitalWrite(2, HIGH);
 }
}

额外说明

我还顺手修复了代码里的几个小问题,帮你避免后续的bug:

  • 变量名拼写错误:mounth改成了正确的month
  • 设置分钟/月份时的逻辑错误:比如设置月份时误把输入赋值给了day,设置分钟时错误判断hour==0
  • 移除了loop()里的delay(1000),否则会导致时间计算卡顿,因为我们已经用millis()来精确计时了

这样修改后,小时和分钟会保持原来的大字体,秒数则会以小字体显示,完美实现你想要的效果!

内容的提问来源于stack exchange,提问作者jubal1961

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:22:39