久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1798|回復(fù): 0
收起左側(cè)

請(qǐng)問(wèn)如何將單片機(jī)萬(wàn)年歷程序修改一下使LCD1602正確顯示?

[復(fù)制鏈接]
ID:551896 發(fā)表于 2019-11-10 17:07 | 顯示全部樓層 |閱讀模式
新建 DOC 文檔.doc (42.5 KB, 下載次數(shù): 3)
51hei圖片20191110170422.png
請(qǐng)問(wèn)如何將程序修改一下使LCD1602正確顯示



發(fā)現(xiàn)下載附件要花費(fèi)黑幣,所以我把代碼發(fā)出來(lái)吧

  1. /****************************main.c************************************/
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #include <string.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. uchar *week[] = {"sun","mon","tus","wes","thu","fri","sat"}; //周信息,周一到周日。
  8. uchar lcd_buf1[] = "00-00-00   ";          //日期信息。
  9. uchar lcd_buf2[] = "00:00:00   ";          //時(shí)間信息。

  10. extern void InitTIMER0();
  11. extern void lcd_init();
  12. extern void lcd_showstring(uchar ,uchar ,uchar *);
  13. extern uchar l_tmpdate[7];
  14. extern bit ReadRTC_Flag;
  15. extern void delay(uint i);
  16. extern void Read_RTC();                          
  17. extern void Set_RTC();

  18. //將日期和時(shí)間信息轉(zhuǎn)化為數(shù)字字符。
  19. void format_datetime(uint d,uchar * a)
  20. {
  21.         *a=(d>>4)+'0';
  22.         *(a+1)=(d&0x0f)+'0';
  23. }

  24. void main()
  25. {
  26.         lcd_init();          //LCD的初始化。
  27.         InitTIMER0(); //初始化定時(shí)器0。
  28.         Set_RTC();        //寫(xiě)入時(shí)鐘值(寫(xiě)入時(shí)鐘初值),如果不用改時(shí)間可以不用這一項(xiàng)。

  29.         while(1)
  30.         {
  31.                 if(ReadRTC_Flag)
  32.                 {
  33.                         ReadRTC_Flag = 0;
  34.                         Read_RTC();
  35.         
  36.                         //日期轉(zhuǎn)換。
  37.                         format_datetime(l_tmpdate[6],lcd_buf1+5);
  38.                         format_datetime(l_tmpdate[4],lcd_buf1+8);
  39.                         format_datetime(l_tmpdate[3],lcd_buf1+11);
  40.                         //星期轉(zhuǎn)換。
  41.                         strcpy(lcd_buf1 + 13,week[l_tmpdate[5]-1]);
  42.                         //定義一個(gè)字符串char a[20],和一個(gè)字符串c[]="i am a teacher!";
  43.                         //把c復(fù)制到a中就可以這樣用:strcpy(a,c);
  44.         
  45.                         //時(shí)間轉(zhuǎn)換。
  46.                         format_datetime(l_tmpdate[2],lcd_buf2+5);
  47.                         format_datetime(l_tmpdate[1],lcd_buf2+8);
  48.                         format_datetime(l_tmpdate[0],lcd_buf2+11);
  49.         
  50.                         lcd_showstring(0,0,lcd_buf1);                 //將lcd_buf1和lcd_buf2字符輸出。
  51.                         lcd_showstring(1,0,lcd_buf2);

  52.                 }
  53.         }
  54. }


  55. /******************************************************************1602.h**************************************************************************/
  56. typedef bit bool;

  57. sbit RS = P2^6;           //復(fù)位端
  58. sbit RW = P2^5;           //寫(xiě)數(shù)據(jù)端
  59. sbit EN = P2^7;           //使能端

  60. #define uint unsigned int
  61. #define uchar unsigned char

  62. void delay(int i);
  63. bit lcd_bz();
  64. void lcd_wcmd(int cmd);
  65. void lcd_showstring(uchar r,uchar c,uchar *str);
  66. void lcd_wdat(uchar dat);
  67. void lcd_init();

  68. /******************************************************************1602.c***************************************************************************/
  69. #include <reg51.h>
  70. #include <intrins.h>
  71. #include "1602.h"

  72. //延時(shí)函數(shù)
  73. void delay(int i)
  74. {
  75.         int j;
  76.         while(i--)
  77.         {
  78.                 for(j=0;j<250;j++)
  79.                 {
  80.                         _nop_();
  81.                         _nop_();
  82.                         _nop_();
  83.                         _nop_();
  84.                 }
  85.         }
  86. }

  87. //側(cè)忙,判斷LCD是否為忙
  88. bool lcd_bz()
  89. {
  90.         bool result;
  91.         RS = 0;
  92.         RW = 1;
  93.         EN = 1;
  94.         _nop_();
  95.         _nop_();
  96.         _nop_();
  97.         _nop_();
  98.         result = (bool)(P0 & 0x80);//檢測(cè)P0最高位是否為1.
  99.         EN = 0;
  100.         return result;        //返回判斷的結(jié)果。        
  101. }

  102. //寫(xiě)命令函數(shù)。
  103. void lcd_wcmd_8bit(int cmd)
  104. {
  105.         while(lcd_bz());
  106.         RS = 0;
  107.         RW = 0;
  108.         EN = 0;                //先為低電平。
  109.         _nop_();
  110.         _nop_();
  111.         P0 = cmd;         //獲得數(shù)據(jù)。
  112.         _nop_();
  113.         _nop_();
  114.         _nop_();
  115.         _nop_();
  116.         EN = 1;                 //將電平拉高。
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         _nop_();
  121.         EN = 0;                 //再拉低。
  122. }  

  123. //寫(xiě)命令函數(shù)。
  124. void lcd_wcmd(int cmd)
  125. {
  126.         while(lcd_bz());
  127.         RS = 0;
  128.         RW = 0;
  129.         EN = 0;           //先為低電平。
  130.         _nop_();
  131.         _nop_();
  132.         P0 = cmd;        //獲得高四位數(shù)據(jù)。
  133.         _nop_();
  134.         _nop_();
  135.         _nop_();
  136.         _nop_();
  137.         EN = 1;                //拉高。
  138.         _nop_();
  139.         _nop_();
  140.         _nop_();
  141.         _nop_();
  142.         EN = 0;                //再拉低。

  143.         P0 = (cmd & 0x0f)<<4;  //再獲得低四位數(shù)據(jù)。
  144.         _nop_();
  145.         _nop_();
  146.         _nop_();
  147.         _nop_();
  148.         EN = 1;                 //將電平拉高。
  149.         _nop_();
  150.         _nop_();
  151.         _nop_();
  152.         _nop_();
  153.         EN = 0;                  //再拉低。
  154. }


  155. void lcd_showstring(uchar r,uchar c,uchar *str)
  156. {
  157.         uchar i=0;
  158.         code uchar DDRAM[] = {0x80,0xc0};         //設(shè)定顯示的位置。
  159.         lcd_wcmd(DDRAM[r] | c);
  160.         for(i=0;str[i] && i<16;i++)
  161.                 lcd_wdat(str[i]);
  162.         for(;i<16;i++)
  163.                 lcd_wdat(' ');
  164. }

  165. //數(shù)據(jù)寫(xiě)入的函數(shù)。
  166. void lcd_wdat(uchar dat)
  167. {
  168.         while(lcd_bz());
  169.         RS = 1;
  170.         RW = 0;
  171.         EN = 0;                //先處于低電平。
  172.         P0 = dat;         //獲得數(shù)據(jù)高四位。
  173.         _nop_();
  174.         _nop_();
  175.         _nop_();
  176.         _nop_();
  177.         EN = 1;
  178.         _nop_();
  179.         _nop_();          //再產(chǎn)生一個(gè)負(fù)脈沖。
  180.         _nop_();
  181.         _nop_();
  182.         EN = 0;

  183.         RS = 1;
  184.         RW = 0;
  185.         EN = 0;
  186.         _nop_();
  187.         _nop_();
  188.         _nop_();
  189.         _nop_();
  190.         P0 = (dat & 0x0f)<<4;        //同理獲得低四位。
  191.         _nop_();
  192.         _nop_();
  193.         _nop_();
  194.         _nop_();
  195.         EN = 1;
  196.         _nop_();
  197.         _nop_();
  198.         _nop_();
  199.         _nop_();
  200.         EN = 0;
  201. }

  202. //LCD初始化。
  203. void lcd_init()
  204. {
  205.         lcd_wcmd_8bit(0x38);
  206.         delay(1);
  207.         lcd_wcmd_8bit(0x38);
  208.         delay(1);
  209.         lcd_wcmd_8bit(0x38);
  210.         delay(1);
  211.         lcd_wcmd(0x38);
  212.         delay(1);
  213.         lcd_wcmd(0x0c);
  214.         delay(1);
  215.         lcd_wcmd(0x02);
  216.         delay(1);
  217.         lcd_wcmd(0x01);
  218.         delay(1);
  219. }

  220. /****************************************************************ds1302.c****************************************************/
  221. #include <reg52.h>
  222. #include <intrins.h>

  223. sbit SCK = P3^6;  //時(shí)鐘線
  224. sbit IO = P3^4;          //數(shù)據(jù)線
  225. sbit RST = P3^5;  //DS1302復(fù)位線

  226. bit ReadRTC_Flag; //讀DS1302的標(biāo)志

  227. #define uint unsigned int
  228. #define uchar unsigned char

  229. //七項(xiàng)數(shù)據(jù):秒分時(shí)日月周年
  230. uchar l_tmpdate[7] = {0,0,12,19,11,5,1};
  231. //用來(lái)存放轉(zhuǎn)化好的時(shí)間數(shù)據(jù)
  232. uchar l_tmpdisplay[8];

  233. //7個(gè)數(shù)據(jù)的寫(xiě)地址
  234. code uchar write_rtc_add[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
  235. //7個(gè)數(shù)據(jù)的讀地址
  236. code uchar read_rtc_add[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

  237. //函數(shù)的聲明
  238. void Write_Ds1302_byte(uchar temp);
  239. void write_Ds1302(uchar add,uchar dat);
  240. uchar Read_Ds1302(uchar add);
  241. void Read_RTC();
  242. void Set_RTC();
  243. void InitTIMER0();

  244. //定時(shí)器的初始化
  245. void InitTIMER0()
  246. {
  247.         TMOD |= 0x01;
  248.         TH0 = 0xef;
  249.         TL0 = 0xf0;
  250.         ET0 = 1;
  251.         TR0 = 1;
  252.         EA = 1;
  253. }

  254. //向1302中發(fā)送一個(gè)字節(jié)數(shù)據(jù)。
  255. void Write_Ds1302_Byte(uchar temp)
  256. {
  257.         uchar i;
  258.         for(i=0;i<8;i++)  //循環(huán)8位依次寫(xiě)入數(shù)據(jù)
  259.         {
  260.                 SCK = 0;
  261.                 IO = temp & 0x01;        //傳輸時(shí)從低到高
  262.                 temp>>=1;          //右移1位。
  263.                 SCK = 1;

  264.         }
  265. }

  266. //向1302中寫(xiě)入數(shù)據(jù)。參數(shù)有要寫(xiě)入的地址和數(shù)據(jù)
  267. void Write_Ds1302(uchar add,uchar dat)
  268. {
  269.         RST = 0;
  270.         _nop_();
  271.         SCK = 0;
  272.         _nop_();
  273.         RST = 1;
  274.         _nop_();
  275.         Write_Ds1302_Byte(add);        //發(fā)送地址
  276.         Write_Ds1302_Byte(dat);        //發(fā)送數(shù)據(jù)
  277.         RST = 0;
  278. }

  279. //從1302中的讀出數(shù)據(jù)
  280. uchar Read_Ds1302(uchar add)
  281. {
  282.         uchar i,temp=0x00;
  283.         RST = 0;
  284.         _nop_();
  285.         _nop_();
  286.         SCK = 0;
  287.         _nop_();
  288.         _nop_();
  289.         RST = 1;
  290.         _nop_();
  291.         _nop_();
  292.         Write_Ds1302_Byte(add);         //發(fā)送地址,找到地址
  293.         for(i=0;i<8;i++)   //循環(huán)8次讀出數(shù)據(jù)
  294.         {
  295.                 if(IO)                //傳輸從低到高
  296.                         temp |= 0x80;
  297.                 SCK = 0;
  298.                 temp>>=1;        //右移1位
  299.                 _nop_();
  300.                 _nop_();
  301.                 _nop_();
  302.                 SCK = 1;
  303.         }
  304.         RST = 0;                        //之后為DS1302復(fù)位
  305.         _nop_();
  306.         _nop_();
  307. //        RST = 0;    //試驗(yàn)時(shí)去掉該句沒(méi)有影響
  308.         SCK = 0;
  309.         _nop_();
  310.         _nop_();
  311.         _nop_();
  312.         _nop_();
  313.         SCK = 1;
  314.         _nop_();
  315.         _nop_();
  316.         IO = 0;
  317.         _nop_();
  318.         _nop_();
  319.         IO = 1;
  320.         _nop_();
  321.         _nop_();
  322.         return temp;        //將讀到的數(shù)據(jù)返回
  323. }

  324. //從時(shí)鐘中讀取數(shù)據(jù)
  325. void Read_RTC()
  326. {
  327.         uchar i,*p;
  328.         p = read_rtc_add;  //讀日歷數(shù)據(jù)對(duì)應(yīng)的地址
  329.         for(i=0;i<7;i++)        //分7次分別將:時(shí)分秒日月周年讀出
  330.         {
  331.                 l_tmpdate[i] = Read_Ds1302(*p);
  332.                 p++;
  333.         }
  334. }

  335. //設(shè)定時(shí)鐘的時(shí)間數(shù)據(jù)
  336. void Set_RTC()
  337. {
  338.         uchar i,*p,tmp;
  339.         for(i=0;i<7;i++)   //將數(shù)從BCD碼轉(zhuǎn)化出來(lái),因?yàn)?302中用BCD碼表示數(shù)值
  340.         {
  341.                 tmp = l_tmpdate[i]/10;
  342.                 l_tmpdate[i] = l_tmpdate[i]%10;
  343.                 l_tmpdate[i] = l_tmpdate[i] + tmp*16;
  344.         }

  345.         Write_Ds1302(0x8e,0x00);  //清除寫(xiě)入保護(hù)

  346.         p = write_rtc_add;                //傳送地址
  347.         for(i=0;i<7;i++)                //將數(shù)據(jù)依次寫(xiě)入
  348.         {
  349.                 Write_Ds1302(*p,l_tmpdate[i]);
  350.                 p++;
  351.         }

  352.         Write_Ds1302(0x8e,0x80);  //打開(kāi)寫(xiě)入保護(hù),不能再寫(xiě)入
  353. }


  354. //定時(shí)器中斷函數(shù)
  355. void tim() interrupt 1 using 1
  356. {
  357.         static uchar i,num;
  358.         TH0 = 0xf5;
  359.         TL0 = 0xe0;

  360.         i++;

  361.         if(i==8)
  362.         {
  363.                 i=0;
  364.                 num++;
  365.                 if(10==num)                  //間隔一定時(shí)間讀取1302中數(shù)據(jù),更新數(shù)碼管數(shù)據(jù)
  366.                 {
  367.                         ReadRTC_Flag = 1;         //置標(biāo)志位,從而進(jìn)行判斷
  368.                         num = 0;
  369.                 }
  370.         }
  371. }
復(fù)制代碼
求大佬解答。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 人人干人人干人人干 | 国产精品揄拍一区二区久久国内亚洲精 | 国产精品成人国产乱一区 | 精品成人一区二区 | 精品欧美激情在线观看 | 中文字幕国产 | 中文字幕在线看 | 人妖videosex高潮另类 | 国产精品免费观看 | 国产一区二区三区四区 | 武道仙尊动漫在线观看 | 91观看| 在线精品一区 | 日韩免费一区 | 欧美一级片中文字幕 | 青青久在线视频 | 拍真实国产伦偷精品 | 亚洲欧美精品一区 | 欧美激情久久久 | 国产在线视频一区二区董小宛性色 | 亚洲精品乱码久久久久久按摩观 | 天天久 | 亚洲成人精品一区二区 | 亚洲免费视频一区 | 精品毛片视频 | 精品欧美视频 | 91九色婷婷 | 久久草在线视频 | 中文字幕精品一区久久久久 | 2018天天干天天操 | 成人精品鲁一区一区二区 | 国产日韩欧美激情 | 日本成人在线观看网站 | 亚洲天堂久久新 | 亚洲iv一区二区三区 | 精品国产乱码久久久久久蜜退臀 | 色偷偷噜噜噜亚洲男人 | 中文字幕日韩欧美一区二区三区 | 免费精品在线视频 | 黑人巨大精品欧美黑白配亚洲 | 国产99久久精品一区二区永久免费 |