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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

超牛仿真LCD顯示

[復制鏈接]
跳轉到指定樓層
樓主

仿真LCD顯示
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. // 管腳定義
  4. sbit COM0=P3^5;
  5. sbit COM1=P3^4;
  6. sbit COM2=P3^3;
  7. sbit COM3=P3^2;
  8. sbit BI_4=P3^7;
  9. sbit RTC_CLK=P3^0;
  10. sbit RTC_IO=P3^1;
  11. sbit RTC_RST=P3^7; // 復用
  12. //P3 口模式寄存器
  13. sfr P3M1=0xb1;
  14. sfr P3M0=0xb2;
  15. seg_code[10] = { ~0x03,~0x9f,~0x25,~0x0d,~0x99,~0x49,~0x41,~0x1f,~0x01,~0x09 };
  16. unsigned char ScanCoun=0; // 動態掃描顯示位數計數器
  17. unsigned char DisplayBuf[4] = { 1,2,3,4 }; //4 位數字對應的顯示暫存
  18. // 段碼緩沖區
  19. unsigned char SegBuf[4] = { 0x00,0x00,0x00,0x00 };//COM1 、COM2、COM3、COM4的段碼
  20. bit bi_4a=0; //COM0 對應的4a
  21. bit bi_4b=0; //COM1 對應的4a
  22. bit bi_4c=0; //COM2 對應的4a


  23. // 延時
  24. void dly(unsigned char x)
  25. {
  26.         unsigned char i;
  27.         for (i=0; i<x; i++);
  28. }

  29. void rtc_wr_time(unsigned char *p_wt_time)
  30. {
  31.         unsigned char i;
  32.         unsigned char tmp1;
  33.         dly(30);
  34.         RTC_RST=1;
  35.         rtc_wt_byte(0xbe); //burst 寫入時間
  36.         for (i=0; i<8; i++)
  37.         {
  38.                 tmp1=*p_wt_time++;
  39.                 rtc_wt_byte(tmp1);
  40.                
  41.         }
  42.         RTC_CLK=0;
  43.         RTC_RST=0;
  44. }


  45. void rtc_rd_time(unsigned char *p_rd_time)
  46. {
  47.         unsigned char i;
  48.         unsigned char tmp1;
  49.         dly(30);
  50.         RTC_RST=1;
  51.         rtc_wt_byte(0xbf); //burst 讀取時間
  52.         RTC_IO=1;
  53.         for (i=0; i<8; i++)
  54.         {
  55.                 tmp1=rtc_rd_byte();
  56.                 *p_rd_time++=tmp1;
  57.         }
  58.         RTC_CLK=0;
  59.         RTC_RST=0;
  60. }

  61. void ini_rtc()
  62. {
  63.         RTC_CLK=0;
  64.         RTC_RST=0;
  65.         dly(30);
  66.         
  67.         RTC_RST=1;
  68.         rtc_wt_byte(0x8e); // 寫CONTROL 寄存器
  69.         rtc_wt_byte(0x00); // 值: 去掉寫保護
  70.         RTC_RST=0; // 復位
  71.         RTC_RST=1; // 正常工作
  72.         rtc_wt_byte(0x90); // 寫TRICKLE CHARGE寄R存器
  73.         rtc_wt_byte(0xa9); // 值: 使能充電,串聯2 個二極管,串聯2k 歐姆的電阻
  74.         RTC_CLK=0;
  75.         RTC_RST=0;
  76. }



  77. // 把4 位數字的SEG放到COM1、COM2、COM3、COM4對應的段碼

  78.   //LCD 的管腳定義與LED不同,它不是一個COM對應一位數字,而是對應每個數字的一部分SEG
  79.   // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  80.   // < 1f 1a 2f 2a 3f 3a 4f 4a > -- ----
  81.   COM0
  82.   // < 1g 1b 2g 2b 2g 3b 4g 4b > -- ----
  83.   COM1
  84.   // < 1e 1c 2e 2c : 3e 3c 4e 4c > -- ----
  85.   COM2
  86.   // 1d 1h 2d 2h 3d 3h 4d -- ----
  87.   COM3

  88. /**************** 顯示代碼**************/
  89. void Seg2Seg()
  90. {
  91.         unsigned char SegXX;
  92.         SegBuf[0]=0;
  93.         SegBuf[1]=0;
  94.         SegBuf[2]=0x08;
  95.         SegBuf[3]=0;
  96.         bi_4a=0;
  97.         bi_4b=0;
  98.         bi_4c=0;
  99.         
  100.         SegXX=seg_code[DisplayBuf[0]]; // 第1 位數字
  101.         
  102.         if (SegXX&0x80) SegBuf[0]|=0x40;
  103.         if (SegXX&0x40) SegBuf[1]|=0x40;
  104.         if (SegXX&0x20) SegBuf[2]|=0x40;
  105.         if (SegXX&0x10) SegBuf[3]|=0x80;
  106.         if (SegXX&0x08) SegBuf[2]|=0x80;
  107.         if (SegXX&0x04) SegBuf[0]|=0x80;
  108.         if (SegXX&0x02) SegBuf[1]|=0x80;
  109.         if (SegXX&0x01) SegBuf[3]|=0x40;
  110.         
  111.         SegXX=seg_code[DisplayBuf[1]]; // 第2 位數字
  112.         
  113.         if (SegXX&0x80) SegBuf[0]|=0x10;
  114.         if (SegXX&0x40) SegBuf[1]|=0x10;
  115.         if (SegXX&0x20) SegBuf[2]|=0x10;
  116.         if (SegXX&0x10) SegBuf[3]|=0x20;
  117.         if (SegXX&0x08) SegBuf[2]|=0x20;
  118.         if (SegXX&0x04) SegBuf[0]|=0x20;
  119.         if (SegXX&0x02) SegBuf[1]|=0x20;
  120.         if (SegXX&0x01) SegBuf[3]|=0x10;
  121.         
  122.         SegXX=seg_code[DisplayBuf[2]]; // 第3 位數字
  123.         
  124.         if (SegXX&0x80) SegBuf[0]|=0x02;
  125.         if (SegXX&0x40) SegBuf[1]|=0x02;
  126.         if (SegXX&0x20) SegBuf[2]|=0x02;
  127.         if (SegXX&0x10) SegBuf[3]|=0x04;
  128.         if (SegXX&0x08) SegBuf[2]|=0x04;
  129.         if (SegXX&0x04) SegBuf[0]|=0x04;
  130.         if (SegXX&0x02) SegBuf[1]|=0x04;
  131.         if (SegXX&0x01) SegBuf[3]|=0x02;
  132.         
  133.         SegXX=seg_code[DisplayBuf[3]]; // 第4 位數字
  134.         
  135.         if (SegXX&0x80) bi_4a=1;
  136.         if (SegXX&0x40) bi_4b=1;
  137.         if (SegXX&0x20) bi_4c=1;
  138.         if (SegXX&0x10) SegBuf[3]|=0x01;
  139.         if (SegXX&0x08) SegBuf[2]|=0x01;
  140.         if (SegXX&0x04) SegBuf[0]|=0x01;
  141.         if (SegXX&0x02) SegBuf[1]|=0x01;
  142. }


  143. /* 一個BCD碼轉化成兩個十進制數(如: 0x79 轉化成0x07 和0x09)*/
  144. BcdToDec(unsigned char BcdValue,unsigned char *pDecValue)
  145. {
  146.         //if (BcdValue>=0x9a||(BcdValue&0x0f)>=0x0a) return 0;
  147.         *pDecValue++=(BcdValue&0xf0)>>4;
  148.         *pDecValue=BcdValue&0x0f;
  149.         //return 1;
  150. }


  151. /****************  初始化MCS51內部資源  ********************/
  152. InitInterResource()
  153. {
  154.         IE=0; // 關全部中斷
  155.         TCON=0; // 清全部中斷請求
  156.         IP=0; // 清中斷優先級
  157.         TMOD=0x01; //T0 工作方式1(16 位定時器)
  158.         TH0=0x00; //T0 定時器輔初值
  159.         TL0=0x00;
  160.         TR0=1; // 允許T0 定時
  161.         ET0=1; // 允許T0 中斷
  162.         EA=0; // 關全局中斷
  163.         RTC_RST=0;
  164. }

  165. void main()
  166. {
  167.         InitInterResource();
  168.         ini_rtc(); // 初始化DS1302
  169.         rtc_wr_time(ClockBuffer); // 寫入時間初始值
  170.         EA=1; // 開全局中斷
  171.         while(1)
  172.         {
  173.                
  174.         }  
  175. }


  176. /***************  開定時中斷 *************/
  177. //定時器0 中斷服務程序, 5ms定時器, 4 位數碼管動態顯示驅動
  178. void tmr0_p(void) interrupt 1
  179. {
  180.         TL0=0x78; // 重新定時5ms
  181.         TH0=0xec;
  182.         Seg2Seg();
  183.         P3M1=0x3c;
  184.         P3M0=0x00;
  185.         switch(ScanCoun) // 動態掃描顯示
  186.         {
  187.         case 0: //COM0 正向驅動
  188.                 P1= SegBuf[0];
  189.                 BI_4= bi_4a;
  190.                 COM0=0;
  191.                 P3M1=0x1c; // 除COM0輸出外,其余COM設為輸入
  192.                 P3M0=0x00;
  193.                 break;
  194.         case 1: //COM0 反向驅動
  195.                 P1= ~SegBuf[0];
  196.                 BI_4= ~bi_4a;
  197.                 COM0=1;
  198.                 P3M1=0x1c;
  199.                
  200.                
  201.                 P3M0=0x00;
  202.                 break;
  203.         case 2: //COM1 正向驅動
  204.                 P1= SegBuf[1];
  205.                 BI_4= bi_4b;
  206.                 COM1=0;
  207.                 P3M1=0x2c;
  208.                 P3M0=0x00;
  209.                 break;
  210.         case 3: //COM1 反向驅動
  211.                 P1= ~SegBuf[1];
  212.                 BI_4= ~bi_4b;
  213.                 COM1=1;
  214.                 P3M1=0x2c;
  215.                 P3M0=0x00;
  216.                 break;
  217.         case 4: //COM2 正向驅動
  218.                 P1= SegBuf[2];
  219.                 BI_4= bi_4c;
  220.                 COM2=0;
  221.                 P3M1=0x34;
  222.                 P3M0=0x00;
  223.                 break;
  224.         case 5: //COM2 反向驅動
  225.                 P1= ~SegBuf[2];
  226.                 BI_4= ~bi_4c;
  227.                 COM2=1;
  228.                 P3M1=0x34;
  229.                 P3M0=0x00;
  230.                 break;
  231.         case 6: //COM3 正向驅動
  232.                 P1= SegBuf[3];
  233.                 COM3=0;
  234.                 P3M1=0x38;
  235.                 P3M0=0x00;
  236.                 RTC_RST=0;
  237.                
  238.                
  239.                 rtc_rd_time(ClockBuffer); // 讀時間
  240.                 BcdToDec(ClockBuffer[0],DisplayBuf+2); // 秒送入顯示緩沖
  241.                 BcdToDec(ClockBuffer[1],DisplayBuf); // 分送入顯示緩沖
  242.                 BI_4= ~bi_4c;
  243.                 break;
  244.         case 7: //COM3 反向驅動
  245.                 P1= ~SegBuf[3];
  246.                 COM3=1;
  247.                 P3M1=0x38;
  248.                 P3M0=0x00;
  249.                 break;
  250.         }
  251.         ScanCoun++; // 下一位
  252.         if (ScanCoun>7) ScanCoun=0;
  253. }
復制代碼

祥見附件
仿LCD顯示.rar (22.39 KB, 下載次數: 66)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:469417 發表于 2020-3-26 07:13 | 只看該作者
超級棒!好東西!頂一個!
回復

使用道具 舉報

板凳
ID:471066 發表于 2020-3-31 09:40 | 只看該作者
真的很不錯,正要用呢!
回復

使用道具 舉報

地板
ID:473186 發表于 2020-3-31 09:52 | 只看該作者
很好啊,正在找這方面的東東!
回復

使用道具 舉報

5#
ID:767459 發表于 2020-9-4 17:00 | 只看該作者
樓主好好。
附件的《仿LCD顯示.DSN》,由于我沒有安有相應軟件,不能打開。有哪位好心人幫打開轉成PDF呀
回復

使用道具 舉報

6#
ID:333678 發表于 2020-9-20 19:31 | 只看該作者
很好的資料,多謝樓主的分享。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99爱视频 | 免费在线成人网 | 亚洲在线| 国产剧情一区 | 武道仙尊动漫在线观看 | 99爱视频 | 日韩精品一区二区三区视频播放 | 黄色精品 | 中文字幕国产精品 | 一区二区三区视频在线观看 | 污视频免费在线观看 | 一区二区三区四区不卡 | 国产精品一区二区在线免费观看 | 亚洲国产精品视频 | 亚洲精品成人av久久 | 亚洲综合色丁香婷婷六月图片 | 久久精品色欧美aⅴ一区二区 | 欧美精品tv | 亚洲精品久久久蜜桃网站 | 久久国产精品99久久久久久丝袜 | 99re超碰| 久久久综合久久 | 亚洲欧美激情国产综合久久久 | 久久久久国产一区二区三区 | 亚洲精品一区二区三区四区高清 | 天天操狠狠操 | 久久久国产一区二区三区四区小说 | 日韩在线播放视频 | 999精品在线观看 | 成人精品在线视频 | 综合久久综合久久 | 色成人免费网站 | а天堂中文最新一区二区三区 | 国产精品中文字幕在线观看 | 理论片午午伦夜理片影院 | 亚洲欧美一区二区三区国产精品 | 国产成人久久久 | 精品视频亚洲 | 日本不卡免费新一二三区 | 成人黄色电影在线观看 | 免费在线观看一区二区 |