找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机+lcd12864显示ds1302程序出现乱码,卡好几天了

查看数: 6920 | 评论数: 10 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-1-16 09:30

正文摘要:

单片机源码: #include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit lcd_rs=P3^4; sbit lcd_rw=P3^5; sbit lcd_e=P3^6; sbit lcd_psb=P3^7; sbit ds1 ...

回复

ID:434977 发表于 2019-1-18 16:05
xingxing123w 发表于 2019-1-17 11:06
IIC通讯最好要进行ASK 超时处理,可以仿真一下确定一下具体问题,看看读取的数据不正确,还是显示部分有问 ...

我刚接触,不会仿真......
ID:434977 发表于 2019-1-18 16:03
shuisheng 发表于 2019-1-16 15:01
字符占的位子不对,你将带问号的地方敲一下空格(英文输入情况下的空格),再输入数字看看。正常情况输入汉字 ...

我看了一下,显示函数没问题,我怀疑,会不会是ds1302原件没有工作的原因,但我不知道怎么检测ds1302是否工作了。
ID:434977 发表于 2019-1-18 16:02
ahshmj 发表于 2019-1-17 04:20
你仔细看看Jason_Jay 给你的程序,关键是 addr & 0x01      
,将地址的二进制码的末位变成“1”,就是80 ...

我读的地址,是在读的函数里把写的地址每个后面都加1,这样应该也是可以的吧?
ID:434977 发表于 2019-1-18 15:54
ahshmj 发表于 2019-1-16 15:13
ds1302写和读不是一个地址。81、83、85、......91是读,80、82、84、........90是写。

我读函数里面,地址都加了一,这样就只定义写的地址就行了,读的地址可以在读函数里更改
ID:66761 发表于 2019-1-17 11:06
IIC通讯最好要进行ASK 超时处理,可以仿真一下确定一下具体问题,看看读取的数据不正确,还是显示部分有问题,
ID:7485 发表于 2019-1-17 04:20
你仔细看看Jason_Jay 给你的程序,关键是 addr & 0x01      
,将地址的二进制码的末位变成“1”,就是80变成 81, 82变成 83……,这才是“读”的地址!
ID:386762 发表于 2019-1-16 15:57
你的写入程序有点问题:写入地址之后直接写入数据,你的时序导致数据没有写入,读出数据都为0X7F.


可以参考以下DS1302程序
  1. //---DS1302写入和读取时分秒的地址命令---////---秒分时日月周年 最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  2. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
  3. //---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---////---存储顺序是秒分时日月周年,存储格式是用BCD码---//
  4. uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};
  5. /********************************************************************************
  6. 函 数 名         : Ds1302Write
  7. * 函数功能         : 向DS1302命令(地址+数据)
  8. * 输    入         : addr,dat
  9. * 输    出         : 无
  10. *******************************************************************************/
  11. void Ds1302Write(uchar addr, uchar dat)
  12. {   
  13. uchar n;   
  14. RST = 0;   
  15. _nop_();   
  16. SCLK = 0;
  17. //先将SCLK置低电平。
  18.    _nop_();   
  19. RST = 1;
  20. //然后将RST(CE)置高电平。   
  21. _nop_();   
  22. for (n=0; n<8; n++)
  23. //开始传送八位地址命令   
  24. {        
  25. DSIO = addr & 0x01;//数据从低位开始传送        
  26. addr >>= 1;        
  27. SCLK = 1;//数据在上升沿时,DS1302读取数据      
  28. _nop_();      
  29. SCLK = 0;        
  30. _nop_();   
  31. }   
  32. for (n=0; n<8; n++)//写入8位数据   
  33. {        
  34. DSIO = dat & 0x01;        
  35. dat >>= 1;      
  36. SCLK = 1;//数据在上升沿时,DS1302读取数据        
  37. _nop_();        
  38. SCLK = 0;        
  39. _nop_();      
  40. }               
  41. RST = 0;//传送数据结束    _
  42. nop_();}
  43. /********************************************************************************
  44. 函 数 名         : Ds1302Read
  45. * 函数功能         : 读取一个地址的数据
  46. * 输    入         : addr
  47. * 输    出         : dat
  48. *******************************************************************************/
  49. uchar Ds1302Read(uchar addr)
  50. {   
  51. uchar n,dat,dat1;   
  52. RST = 0;   
  53. _nop_();   
  54. SCLK = 0;//先将SCLK置低电平。   
  55. _nop_();   
  56. RST = 1;//然后将RST(CE)置高电平。   
  57. _nop_();   
  58. for(n=0; n<8; n++)//开始传送八位地址命令   
  59. {        
  60. DSIO = addr & 0x01;//数据从低位开始传送        
  61. addr >>= 1;        
  62. SCLK = 1;//数据在上升沿时,DS1302读取数据        
  63. _nop_();        
  64. SCLK = 0;//DS1302下降沿时,放置数据        
  65. _nop_();   
  66. }   
  67. _nop_();   
  68. for(n=0; n<8; n++)//读取8位数据   
  69. {        
  70. dat1 = DSIO;//从最低位开始接收        
  71. dat = (dat>>1) | (dat1<<7);        
  72. SCLK = 1;        
  73. _nop_();        
  74. SCLK = 0;//DS1302下降沿时,放置数据        
  75. _nop_();   
  76. }   
  77. RST = 0;   
  78. _nop_();    //以下为DS1302复位的稳定时间,必须的。   
  79. SCLK = 1;   
  80. _nop_();   
  81. DSIO = 0;   
  82. _nop_();   
  83. DSIO = 1;   
  84. _nop_();   
  85. return dat;
  86. }
  87. /*******************************************************************************
  88. * 函 数 名         : Ds1302Init
  89. * 函数功能         : 初始化DS1302.
  90. * 输    入         : 无
  91. * 输    出         : 无
  92. *******************************************************************************/
  93. void Ds1302Init()
  94. {   
  95. uchar n;   
  96. Ds1302Write(0x8E,0X00);      //禁止写保护,就是关闭写保护功能   
  97. for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年   
  98. {        
  99. Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);     
  100. }   
  101. Ds1302Write(0x8E,0x80);      //打开写保护功能}
  102. /*******************************************************************************
  103. * 函 数 名         : Ds1302ReadTime
  104. * 函数功能         : 读取时钟信息
  105. * 输    入         : 无
  106. * 输    出         : 无
  107. *******************************************************************************/
  108. void Ds1302ReadTime()
  109. {   
  110. uchar n;   
  111. for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年   
  112. {        
  113. TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);   
  114. }      
  115.   }
复制代码


评分

参与人数 1黑币 +15 收起 理由
凌净清河 + 15 赞一个!

查看全部评分

ID:7485 发表于 2019-1-16 15:13
ds1302写和读不是一个地址。81、83、85、......91是读,80、82、84、........90是写。
ID:454000 发表于 2019-1-16 15:01
字符占的位子不对,你将带问号的地方敲一下空格(英文输入情况下的空格),再输入数字看看。正常情况输入汉字没问题,但输数字与英文就会这样。要想正常显示,要重新写一个字符显示函数。坛子里面有一篇<<12864液晶数字任意显示器>>的文章,里面有写好的函数,可以试一下

评分

参与人数 3黑币 +62 收起 理由
钻牛尖滴刘尖尖 + 15
Sawardeakar + 35
yoxi + 12 回帖助人的奖励!

查看全部评分

ID:434977 发表于 2019-1-16 13:37
哪位大佬指点一下,十分感谢,卡好几天了

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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