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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1751|回復: 0
打印 上一主題 下一主題
收起左側

請問如何將單片機萬年歷程序修改一下使LCD1602正確顯示?

[復制鏈接]
跳轉到指定樓層
樓主
新建 DOC 文檔.doc (42.5 KB, 下載次數: 3)

請問如何將程序修改一下使LCD1602正確顯示



發現下載附件要花費黑幣,所以我把代碼發出來吧

  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   ";          //時間信息。

  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. //將日期和時間信息轉化為數字字符。
  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(); //初始化定時器0。
  28.         Set_RTC();        //寫入時鐘值(寫入時鐘初值),如果不用改時間可以不用這一項。

  29.         while(1)
  30.         {
  31.                 if(ReadRTC_Flag)
  32.                 {
  33.                         ReadRTC_Flag = 0;
  34.                         Read_RTC();
  35.         
  36.                         //日期轉換。
  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.                         //星期轉換。
  41.                         strcpy(lcd_buf1 + 13,week[l_tmpdate[5]-1]);
  42.                         //定義一個字符串char a[20],和一個字符串c[]="i am a teacher!";
  43.                         //把c復制到a中就可以這樣用:strcpy(a,c);
  44.         
  45.                         //時間轉換。
  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;           //復位端
  58. sbit RW = P2^5;           //寫數據端
  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. //延時函數
  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. //側忙,判斷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);//檢測P0最高位是否為1.
  99.         EN = 0;
  100.         return result;        //返回判斷的結果。        
  101. }

  102. //寫命令函數。
  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;         //獲得數據。
  112.         _nop_();
  113.         _nop_();
  114.         _nop_();
  115.         _nop_();
  116.         EN = 1;                 //將電平拉高。
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         _nop_();
  121.         EN = 0;                 //再拉低。
  122. }  

  123. //寫命令函數。
  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;        //獲得高四位數據。
  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;  //再獲得低四位數據。
  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};         //設定顯示的位置。
  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. //數據寫入的函數。
  166. void lcd_wdat(uchar dat)
  167. {
  168.         while(lcd_bz());
  169.         RS = 1;
  170.         RW = 0;
  171.         EN = 0;                //先處于低電平。
  172.         P0 = dat;         //獲得數據高四位。
  173.         _nop_();
  174.         _nop_();
  175.         _nop_();
  176.         _nop_();
  177.         EN = 1;
  178.         _nop_();
  179.         _nop_();          //再產生一個負脈沖。
  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;  //時鐘線
  224. sbit IO = P3^4;          //數據線
  225. sbit RST = P3^5;  //DS1302復位線

  226. bit ReadRTC_Flag; //讀DS1302的標志

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

  229. //七項數據:秒分時日月周年
  230. uchar l_tmpdate[7] = {0,0,12,19,11,5,1};
  231. //用來存放轉化好的時間數據
  232. uchar l_tmpdisplay[8];

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

  237. //函數的聲明
  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. //定時器的初始化
  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中發送一個字節數據。
  255. void Write_Ds1302_Byte(uchar temp)
  256. {
  257.         uchar i;
  258.         for(i=0;i<8;i++)  //循環8位依次寫入數據
  259.         {
  260.                 SCK = 0;
  261.                 IO = temp & 0x01;        //傳輸時從低到高
  262.                 temp>>=1;          //右移1位。
  263.                 SCK = 1;

  264.         }
  265. }

  266. //向1302中寫入數據。參數有要寫入的地址和數據
  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);        //發送地址
  276.         Write_Ds1302_Byte(dat);        //發送數據
  277.         RST = 0;
  278. }

  279. //從1302中的讀出數據
  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);         //發送地址,找到地址
  293.         for(i=0;i<8;i++)   //循環8次讀出數據
  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復位
  305.         _nop_();
  306.         _nop_();
  307. //        RST = 0;    //試驗時去掉該句沒有影響
  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;        //將讀到的數據返回
  323. }

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

  335. //設定時鐘的時間數據
  336. void Set_RTC()
  337. {
  338.         uchar i,*p,tmp;
  339.         for(i=0;i<7;i++)   //將數從BCD碼轉化出來,因為1302中用BCD碼表示數值
  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);  //清除寫入保護

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

  352.         Write_Ds1302(0x8e,0x80);  //打開寫入保護,不能再寫入
  353. }


  354. //定時器中斷函數
  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)                  //間隔一定時間讀取1302中數據,更新數碼管數據
  366.                 {
  367.                         ReadRTC_Flag = 1;         //置標志位,從而進行判斷
  368.                         num = 0;
  369.                 }
  370.         }
  371. }
復制代碼
求大佬解答。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黑人成人网 | 国产成人综合一区二区三区 | 国产精品99久久久久久宅男 | 久久最新| 亚州精品天堂中文字幕 | 超碰3| 精品国产91亚洲一区二区三区www | 91新视频| 91av视频在线免费观看 | 欧美一级一区 | 在线国产一区二区 | 自拍 亚洲 欧美 老师 丝袜 | 欧美一级久久 | 黄网免费看| 涩涩视频网站在线观看 | 中文字幕 在线观看 | 久久久久久国产精品免费免费狐狸 | 亚洲欧美中文日韩在线v日本 | 毛片在线免费 | 伊人久久麻豆 | 中文字幕综合 | 国产东北一级毛片 | 亚洲精品自在在线观看 | 欧美精选一区二区 | 国产japanhdxxxx麻豆| 日韩中文字幕 | 精品网站999www | 久久免费国产 | 成人免费看片 | 亚洲日本乱码在线观看 | 久久久久久网 | 久久免费精品 | 久久精品二区亚洲w码 | 久久亚洲一区二区 | 成人欧美一区二区三区视频xxx | 极品国产视频 | 欧美11一13sex性hd | 日韩视频中文字幕 | 99久久婷婷国产亚洲终合精品 | 成人黄色电影在线播放 | 午夜av电影|