数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1465|回复: 12

[C51] 小白学51单片机,LCD1602数字时钟优化

[复制链接]
发表于 2024-1-22 14:36:54 | 显示全部楼层 |阅读模式
刚看了一下早一段时间写的LCD1602数字时钟,虽然功能能实现,但代码太长了,main函数就有100行之多
对显示功能又有了新了学习,把之前的代码优化了一下,现在main只有60行,而且也更容易看懂
其它的模块都没变,只改写了main函数
先看效果

计时函数


按键函数,用于调时间日期


LCD1602函数




定时器0初始化


定时器0中断,一次50ms 计数20次就是1秒



main函数

这一部分显示那些不会变化的字符



这一部分显示日期,星期,时,分,秒






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 2024-1-22 14:47:53 | 显示全部楼层
好多年前玩过,都是下载别人的代码,还是楼主这个写得详细呀!
回复 支持 反对

使用道具 举报

发表于 2024-1-22 14:53:01 | 显示全部楼层
虽然很详细,但是我看不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-22 15:13:38 | 显示全部楼层
我修改的时候还发现一个问题
就是数组的定义
这样写不会报错


这样写也不会报错



第一行和第三行如果用了code就会报C183错误



Keil编译出现keilc error C183: unmodifiable lvalue错误




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2024-1-22 15:28:09 | 显示全部楼层
hellozwt 发表于 2024-1-22 15:13
我修改的时候还发现一个问题
就是数组的定义
这样写不会报错

百度到的,CODE放在ROM,不可更改:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-26 14:03:35 | 显示全部楼层
本帖最后由 hellozwt 于 2024-1-26 14:11 编辑

关于按键调时我又碰到一个新问题,
加没问题,减如果跨界就会有问题,
比如时减到0再减就应该是23点,
但是代码怎样实现呢,
如果代码这样写的话,实际到了1再减就是23了

if (shi==0)
shi=23;
这样也不对啊,要比0再小一才退到23啊

回复 支持 反对

使用道具 举报

发表于 2024-1-26 17:37:35 | 显示全部楼层
显示字符串建议用sprintf函数,把变量格式化输出到字符串数组,然后调用LCD的字符串显示函数
回复 支持 反对

使用道具 举报

发表于 2024-11-21 16:50:37 | 显示全部楼层
hellozwt 发表于 2024-1-26 14:03
关于按键调时我又碰到一个新问题,
加没问题,减如果跨界就会有问题,
比如时减到0再减就应该是23点,

if(shi==-1)
   shi=23;
回复 支持 反对

使用道具 举报

发表于 2024-12-26 18:27:34 | 显示全部楼层
drc 发表于 2024-11-21 16:50
if(shi==-1)
   shi=23;

这样的话,变量shi的数据类型就得是有符号变量吧?
回复 支持 反对

使用道具 举报

发表于 2024-12-26 19:38:43 | 显示全部楼层
fireflying 发表于 2024-12-26 18:27
这样的话,变量shi的数据类型就得是有符号变量吧?

不会,你定义是是什么类型就是什么类型,不过,有无符号在这里是一样的,0-1=-1(0xFF)。
回复 支持 反对

使用道具 举报

发表于 2024-12-27 09:23:04 | 显示全部楼层
mmxx2015 发表于 2024-12-26 19:38
不会,你定义是是什么类型就是什么类型,不过,有无符号在这里是一样的,0-1=-1(0xFF)。 ...

如果你定义的是无符号变量的话,它的值是没法为-1的,你这个条件岂不是永远无法满足了?
回复 支持 反对

使用道具 举报

发表于 2024-12-27 21:06:45 | 显示全部楼层
fireflying 发表于 2024-12-27 09:23
如果你定义的是无符号变量的话,它的值是没法为-1的,你这个条件岂不是永远无法满足了? ...

不是已经写清楚了吗?无论是有符号计算还是无符号计算,0-1的结果都是0xFF,与-1比较和与0xFF比较结果是一样的。
测试程序:
  1. unsigned char Unsigned_Var;        //无符号变量
  2. signed char Signed_Var;                //有符号变量

  3. void main(void)
  4. {
  5.         //初值=0
  6.         Unsigned_Var=0;
  7.         Signed_Var=0;

  8.         //无符号计算
  9.         Unsigned_Var--;
  10.         if(Unsigned_Var==(-1))
  11.         {
  12.                 Unsigned_Var=23;
  13.         }

  14.         //有符号计算
  15.         Signed_Var--;
  16.         if(Signed_Var==(-1))
  17.         {
  18.                 Signed_Var=23;
  19.         }

  20.         while(1);
  21. }
复制代码
编译汇编程序:
  1. ;         //初值=0
  2. ;         Unsigned_Var=0;
  3.                         ; SOURCE LINE # 7
  4.         CLR          A
  5.         MOV          Unsigned_Var,A
  6. ;         Signed_Var=0;
  7.                         ; SOURCE LINE # 8
  8.         MOV          Signed_Var,A
  9. ;
  10. ;         //无符号计算
  11. ;         Unsigned_Var--;
  12.                         ; SOURCE LINE # 11
  13.         DEC          Unsigned_Var
  14. ;         if(Unsigned_Var==(-1))
  15.                         ; SOURCE LINE # 12
  16.         MOV          A,Unsigned_Var
  17.         CJNE         A,#0FFH,?C0001
  18. ;         {
  19.                         ; SOURCE LINE # 13
  20. ;                 Unsigned_Var=23;
  21.                         ; SOURCE LINE # 14
  22.         MOV          Unsigned_Var,#017H
  23. ;         }
  24.                         ; SOURCE LINE # 15
  25. ?C0001:
  26. ;
  27. ;         //有符号计算
  28. ;         Signed_Var--;
  29.                         ; SOURCE LINE # 18
  30.         DEC          Signed_Var
  31. ;         if(Signed_Var==(-1))
  32.                         ; SOURCE LINE # 19
  33.         MOV          A,Signed_Var
  34.         CJNE         A,#0FFH,?C0003
  35. ;         {
  36.                         ; SOURCE LINE # 20
  37. ;                 Signed_Var=23;
  38.                         ; SOURCE LINE # 21
  39.         MOV          Signed_Var,#017H
  40. ;         }
  41.                         ; SOURCE LINE # 22
  42. ?C0003:
复制代码
模拟测试结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2024-12-28 00:34:04 来自手机浏览器 | 显示全部楼层
if(按键==加)
{
    if(shi<23)shi++;
    else shi=0;
}
if(按键==减)
{
    if(shi>0) shi--;
    else shi=23;
}

这样是不是就可以了 上面的加也用这样的方式 目的是便于理解
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-18 22:07 , Processed in 0.265200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表