找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1944|回复: 7
打印 上一主题 下一主题
收起左侧

仿真的引脚都对应高低电平闪烁了,屏幕也亮了,但是就是不显示东西,大佬求救!

[复制链接]
跳转到指定楼层
楼主

  1. #include<reg51.h>
  2. #include"LCD1602.h"
  3. #include"DS1302.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. bit key_flag1=0,key_flag2=0;
  7. SYSTEMTIME adjusted;

  8. uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0;
  9. uchar data_alarm[7]={0};

  10. int key_scan()
  11. {
  12.   int i=0;
  13.   uint temp;
  14.   P1=0xf0;
  15.   temp=P1;
  16.   if(temp!=0xf0)
  17.   {
  18.           i=1;
  19.   }
  20.   else
  21.   {
  22.            i=0;
  23.   }
  24.   return i;
  25. }

  26. uchar key_value()
  27. {
  28.    uint m=0,n=0,temp;
  29.    uchar value;
  30.    uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'};
  31.    P1=0xfe;temp=P1;if(temp!=0xfe)m=0;
  32.    P1=0xfd;temp=P1;if(temp!=0xfd)m=1;
  33.    P1=0xfb;temp=P1;if(temp!=0xfb)m=2;
  34.    P1=0xf7;temp=P1;if(temp!=0xf7)m=3;
  35.    P1=0xef;temp=P1;if(temp!=0xef)m=0;
  36.    P1=0xdf;temp=P1;if(temp!=0xdf)m=1;
  37.    P1=0xbf;temp=P1;if(temp!=0xbf)m=2;
  38.    value=v[m][n];
  39.    return value;
  40. }
  41. void adjust(void)
  42. {
  43.    if(key_scan()&&key_flag1)
  44.    switch(key_value())
  45.    {
  46.              case'0':sec_add++;break;
  47.           case'1':min_add++;break;
  48.           case'2':hou_add++;break;
  49.           case'3':day_add++;break;
  50.           case'4':mon_add++;break;
  51.           case'5':yea_add++;break;
  52.           default:break;
  53.    }
  54.    adjusted.Second+=sec_add;
  55.    adjusted.Minute+=min_add;
  56.    adjusted.Hour+=hou_add;
  57.    adjusted.Day+=day_add;
  58.    adjusted.Month+=mon_add;
  59.    adjusted.Year+=yea_add;
  60.    if(adjusted.Second>59)
  61.    {
  62.              adjusted.Second=adjusted.Second%60;
  63.           adjusted.Minute++;
  64.    }
  65.    if(adjusted.Minute>59)
  66.    {
  67.               adjusted.Minute=adjusted.Minute%60;
  68.            adjusted.Hour++;
  69.    }
  70.    if(adjusted.Hour>23)
  71.    {
  72.              adjusted.Hour=adjusted.Hour%24;
  73.           adjusted.Day++;
  74.    }
  75.    if(adjusted.Day>31)adjusted.Day=adjusted.Day%31;
  76.    if(adjusted.Month>12)adjusted.Month=adjusted.Month%12;
  77.    if(adjusted.Year>100)adjusted.Year=adjusted.Year%100;   
  78. }

  79. void changing(void)interrupt 0 using 0
  80. {
  81.    if(key_flag1)
  82.    key_flag1=0;
  83.    if(key_flag1)
  84.    key_flag1=1;
  85. }

  86. main()
  87. {
  88.    uint i;
  89.    uchar p1[]="D;",p2[]="T:";
  90.    SYSTEMTIME T;

  91.    EA=1;
  92.    EX0=1;
  93.    IT0=1;
  94.    EA=1;
  95.    EX1=1;
  96.    IT1=1;
  97.    init1602();
  98.    Initial_DS1302();

  99.    while(1)
  100.    {
  101.              write_com(0x80);
  102.           write_string(p1,2);
  103.           write_com(0xc0);
  104.           write_string(p2,2);
  105.           DS1302_GetTime(&T);
  106.           adjusted.Second=T.Second;
  107.           adjusted.Minute=T.Minute;
  108.           adjusted.Hour=T.Hour;
  109.           adjusted.Week=T.Week;
  110.           adjusted.Day=T.Day;
  111.           adjusted.Month=T.Month;
  112.           adjusted.Year=T.Year;
  113.           for(i=0;i<9;i++)
  114.           {
  115.                    adjusted.DateString[i]=T.DateString[i];
  116.                  adjusted.TimeString[i]=T.TimeString[i];
  117.           }
  118.           adjust();
  119.           DateToStr(&adjusted);
  120.           TimeToStr(&adjusted);
  121.           write_com(0x82);
  122.           write_string(adjusted.DateString,8);
  123.           write_com(0xc2);
  124.           write_string(adjusted.TimeString,8);
  125.           delay(10);

  126.    }
  127. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-12-16 17:42 | 只看该作者
不显示的关键在write_string这个函数是否符合1602的时序,因程序未贴出,难以判断问题所在处
回复

使用道具 举报

板凳
ID:657149 发表于 2019-12-16 20:27 | 只看该作者
csmyldl 发表于 2019-12-16 17:42
不显示的关键在write_string这个函数是否符合1602的时序,因程序未贴出,难以判断问题所在处
  1. #ifndef LCD_CHAR_1602_2005_4_9
  2. #define LCD_CHAR_1602_2005_4_9
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit lcdrs=P2^0;
  6. sbit lcdrw=P2^1;
  7. sbit lcden=P2^2;

  8. void delay(uint z)
  9. {
  10.    uint x,y;
  11.    for(x=z;x>0;x--)
  12.    for(y=110;y>0;y--);
  13. }

  14. void write_com(uchar com)
  15. {
  16.    lcdrw=0;
  17.    lcden=0;
  18.    P0=com;
  19.    delay(5);
  20.    lcden=1;
  21.    delay(5);
  22.    lcden=0;
  23. }

  24. void write_data(uchar date)
  25. {
  26.    lcdrw=0;
  27.    lcdrs=1;
  28.    P0=date;
  29.    delay(5);
  30.    lcden=1;
  31.    delay(5);
  32.    lcden=0;
  33. }
  34. void init1602()
  35. {
  36.   lcdrw=0;
  37.   lcden=0;
  38.   write_com(0x3c);
  39.   write_com(0x0c);
  40.   write_com(0x06);
  41.   write_com(0x01);
  42.   write_com(0x80);
  43. }

  44. void write_string(uchar *pp,uint n)
  45. {
  46.    int i;
  47.    for(i=0;i<n;i++)
  48.    write_data(pp[i]);
  49. }

  50. #endif
复制代码
回复

使用道具 举报

地板
ID:657149 发表于 2019-12-16 20:28 | 只看该作者
csmyldl 发表于 2019-12-16 17:42
不显示的关键在write_string这个函数是否符合1602的时序,因程序未贴出,难以判断问题所在处

这个是1602的头文件函数可以帮我看看吗
回复

使用道具 举报

5#
ID:657149 发表于 2019-12-16 20:28 | 只看该作者
我马上把1602的头文件贴出来,大佬可以帮我看看吗
回复

使用道具 举报

6#
ID:657149 发表于 2019-12-16 20:29 | 只看该作者
  1. #ifndef LCD_CHAR_1602_2005_4_9
  2. #define LCD_CHAR_1602_2005_4_9
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit lcdrs=P2^0;
  6. sbit lcdrw=P2^1;
  7. sbit lcden=P2^2;

  8. void delay(uint z)
  9. {
  10.    uint x,y;
  11.    for(x=z;x>0;x--)
  12.    for(y=110;y>0;y--);
  13. }

  14. void write_com(uchar com)
  15. {
  16.    lcdrw=0;
  17.    lcden=0;
  18.    P0=com;
  19.    delay(5);
  20.    lcden=1;
  21.    delay(5);
  22.    lcden=0;
  23. }

  24. void write_data(uchar date)
  25. {
  26.    lcdrw=0;
  27.    lcdrs=1;
  28.    P0=date;
  29.    delay(5);
  30.    lcden=1;
  31.    delay(5);
  32.    lcden=0;
  33. }
  34. void init1602()
  35. {
  36.   lcdrw=0;
  37.   lcden=0;
  38.   write_com(0x3c);
  39.   write_com(0x0c);
  40.   write_com(0x06);
  41.   write_com(0x01);
  42.   write_com(0x80);
  43. }

  44. void write_string(uchar *pp,uint n)
  45. {
  46.    int i;
  47.    for(i=0;i<n;i++)
  48.    write_data(pp[i]);
  49. }

  50. #endif
复制代码
回复

使用道具 举报

7#
ID:235200 发表于 2019-12-17 01:12 | 只看该作者
adjusted.DateString[i]=T.DateString[i];
adjusted.TimeString[i]=T.TimeString[i];
这两行把从DS1302读出的时分秒年月日转存,但没有把它变为ASCII码,如显示0,要把0变为0x30,显示1要变为0x31,也即所有数字显示均需要加0x30,如果显示字母,也要对应转换为相应ASCII码值
回复

使用道具 举报

8#
ID:213173 发表于 2019-12-17 10:35 | 只看该作者
楼主这个程序好像是东拼西凑来的。模块化程序通常是一个模块对应一个.C和一个.H文件。楼主这不按正常套路把两者混在一起。还用了另类数据结构SYSTEMTIME adjusted; Keil编译器无法识别。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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