Arduino Uno驱动Nokia 5110 LCD时钟:仅单独设置秒数字体大小的技术问询
解决Nokia 5110 LCD单独设置秒数字体大小的问题
嗨,很高兴能帮你搞定这个问题!要单独把秒数的字体改成setTextSize(1),核心思路就是在打印秒数前临时切换字体大小,打印完成后再切回原来的大小。Adafruit_GFX库的字体设置是全局的,但我们可以通过在不同内容打印前后切换它来实现局部字体差异。
关键修改步骤
- 打印小时、分钟时保持
setTextSize(2)的大字体 - 定位到秒数的打印位置后,调用
display.setTextSize(1)切换到小字体 - 打印完秒数后,后续如果还有大字体内容,记得切回
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
相关产品推荐
相关产品推荐

