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

QQ登錄

只需一步,快速開始

搜索
查看: 3505|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

江湖救急,誰幫忙把12864并口的改成串口的,拜托了!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
/***********說明*************/

/***
第一行顯示:加熱模式:強(qiáng)(P2^0=1、P2^1=0)或弱(P2^0=0、P2^1=1)(由按鍵S4切換)
第二行顯示:加熱時(shí)間還剩:                                                                        
第三行顯示:   時(shí)   分    秒
第四行顯示:加熱中或加熱結(jié)束(倒計(jì)時(shí)結(jié)束時(shí))。


按下開關(guān)S1,開始設(shè)定秒,秒編輯位閃動(dòng),
                        按下S2增加或S3減小數(shù)值;
在按下開關(guān)S1,秒確定,設(shè)定分;
再按下S1,分確定,設(shè)定小時(shí)。
再按下S1,時(shí)間確定。
再按下S1,開始倒計(jì)時(shí)并使P1^5=0。到達(dá)定時(shí)時(shí)間后P1^5=1。

12864采用:www點(diǎn)jlxlcd點(diǎn)cn/UpFile/2015922133914.pdf

sbit Rom_OUT=P1^2;
sbit Rom_IN=P1^1;
sbit Rom_SCK=P1^3;
sbit Rom_CS=P1^4;

sbit lcd_sda=P3^1;
sbit lcd_sck=P3^2;
sbit lcd_rs=P3^0;
sbit lcd_reset=P1^6;
sbit lcd_cs1=P1^7;
sbit LEDA=P3^3;

sbit s1=P3^4;//設(shè)置按鈕
sbit s2=P3^5;
sbit s3=P3^6;
sbit s4=P3^7;

參考程序如下(并口)
***/
/*****
簡(jiǎn)介:第一行顯示,距離系統(tǒng)爆炸時(shí)間
第二行顯示,還剩
第三行顯示,00時(shí),00分,00秒
第四行顯示,             周林

按下旋鈕開關(guān),開始設(shè)定秒,秒編輯位閃動(dòng)。左右旋轉(zhuǎn)設(shè)定數(shù)值,
在按下開關(guān),秒確定,設(shè)定分,分編輯位閃動(dòng)左右調(diào)數(shù)值,
再按下,分確定,小時(shí)位閃動(dòng)。左右轉(zhuǎn)調(diào)小時(shí),再按一下。時(shí)間確定,開始倒計(jì)時(shí)。到達(dá)定時(shí)時(shí)間后停止,并閃動(dòng)。

*****/

  1. #include <reg52.h>
  2. #include <intrins.h>

  3. /********************* 定義 ********************************/
  4. #define LCD_data  P0       //數(shù)據(jù)口
  5. sbit LCD_RS = P2 ^ 0; //寄存器選擇輸入
  6. sbit LCD_RW = P2 ^ 1; //液晶讀/寫控制
  7. sbit LCD_EN = P2 ^ 2; //液晶使能控制
  8. sbit LCD_PSB = P2 ^ 3; //串/并方式控制
  9. sbit LCD_RST = P2 ^ 5; //液晶復(fù)位端口

  10. sbit sset=P3^4;//設(shè)置按鈕
  11. sbit spk=P1^4;
  12. sbit sadd=P2^7;
  13. sbit sdel=P2^6;

  14. signed char second=0,minute=0,hour=0,count=0,keycount=0;
  15. signed char key=0;
  16. unsigned char code DIS1[] =
  17. {
  18.   "距離系統(tǒng)爆炸時(shí)間"
  19. };
  20. unsigned char code DIS2[] =
  21. {
  22.   "還剩:"
  23. };
  24. unsigned char code DIS31[] =
  25. {
  26.   "時(shí)"
  27. };
  28. unsigned char code DIS32[] =
  29. {
  30.   "分"
  31. };
  32. unsigned char code DIS33[] =
  33. {
  34.   "秒"
  35. };
  36. unsigned char code DIS4[] =
  37. {
  38.   "周林"
  39. };
  40. unsigned char code table2[]="0123456789";

  41. char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個(gè)字節(jié)

  42. /*********************延時(shí)子函數(shù)**************************/

  43. void delayNOP()//us延時(shí)子函數(shù)   (4.34us)
  44. {
  45.   _nop_();
  46.   _nop_();
  47.   _nop_();
  48.   _nop_();
  49. }

  50. void delayms(unsigned int ms)//ms延時(shí)子函數(shù)
  51. {
  52.   unsigned char y;
  53.   while (ms--)
  54.   {
  55.     for (y = 0; y < 114; y++)
  56.       ;
  57.   }
  58. }
  59. //******************檢查L(zhǎng)CD忙狀態(tài)**************************


  60. bit lcd_busy()//檢查L(zhǎng)CD忙狀態(tài) 1忙,0閑
  61. {
  62.   bit result;
  63.   LCD_RS = 0;
  64.   LCD_RW = 1;
  65.   LCD_EN = 1;
  66.   delayNOP();
  67.   result = (bit)(P0 &0x80);
  68.   LCD_EN = 0;
  69.   return (result);
  70. }

  71. //***********************寫指令數(shù)據(jù)***********************

  72. void lcd_wcmd(unsigned char cmd)//寫指令數(shù)據(jù)到LCD
  73. {
  74.   while (lcd_busy())
  75.   {
  76.          ;
  77.   }
  78.   LCD_RS = 0;
  79.   LCD_RW = 0;
  80.   LCD_EN = 1;
  81.   P0 = cmd;
  82.   delayNOP();
  83.   LCD_EN = 0;
  84. }

  85. void lcd_wdat(unsigned char dat)//寫顯示數(shù)據(jù)到LCD
  86. {
  87.   while (lcd_busy())
  88.     ;
  89.   LCD_RS = 1;
  90.   LCD_RW = 0;
  91.   LCD_EN = 1;
  92.   P0 = dat;
  93.   delayNOP();
  94.   LCD_EN = 0;
  95. }

  96. void writesmh(unsigned char add,unsigned char date)//顯示個(gè)位和十位數(shù)據(jù)
  97. {
  98.         unsigned char shi,ge;
  99.         shi=date/10;
  100.         ge=date%10;
  101.         lcd_wcmd(0x80+add);
  102.         delayms(5);
  103.         lcd_wdat(table2[shi]);
  104.         delayms(5);
  105.         lcd_wdat(table2[ge]);
  106.         delayms(5);
  107. }

  108. //*********************初始化設(shè)定****************************

  109. void lcd_init()
  110. {
  111.   LCD_PSB = 1; //并口方式

  112.   LCD_RST = 0; //液晶復(fù)位
  113.   delayms(5);  //液晶復(fù)位
  114.   LCD_RST = 1; //液晶復(fù)位
  115.   delayms(5);  //液晶復(fù)位

  116.   lcd_wcmd(0x34); //擴(kuò)充功能設(shè)定,擴(kuò)充指令,選8位數(shù)據(jù)
  117.   delayms(5);
  118.   lcd_wcmd(0x30); //功能設(shè)定,基本指令操作,選8位數(shù)據(jù)
  119.   delayms(5);
  120.   lcd_wcmd(0x0C); //顯示開,關(guān)光標(biāo),關(guān)光標(biāo)反白允許。
  121.   delayms(5);
  122.   lcd_wcmd(0x04); //光標(biāo)的移動(dòng)方向
  123.   delayms(5);
  124.   lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
  125.   delayms(5);

  126.         TMOD=0x01;
  127.         TH0=0x3C;
  128.         TL0=0xB0;
  129.         EA=1;
  130.         ET0=1;
  131.         TR0=0;
  132.         EX0=0; //外部中斷0允許
  133.         IT0=1; //外部中斷0為邊沿觸發(fā)方式
  134. }

  135. //*********************設(shè)定顯示位置子函數(shù)**********************

  136. void lcd_pos(unsigned char X, unsigned char Y)//設(shè)定顯示位置
  137. {
  138.   unsigned char pos;

  139.   if (X == 1)
  140.   {
  141.     X = 0x80;
  142.   }
  143.   else if (X == 2)
  144.   {
  145.     X = 0x90;
  146.   }
  147.   else if (X == 3)
  148.   {
  149.     X = 0x88;
  150.   }
  151.   else if (X == 4)
  152.   {
  153.     X = 0x98;
  154.   }
  155.   pos = X + Y; //確定顯示地址

  156.   lcd_wcmd(pos); //寫顯示地址
  157. }

  158. //*****************清屏子函數(shù)***************************

  159. void clr_screen()//清屏子函數(shù)
  160. {
  161.   lcd_wcmd(0x34); //擴(kuò)充指令操作
  162.   delayms(5);
  163.   lcd_wcmd(0x30); //基本指令操作
  164.   delayms(5);
  165.   lcd_wcmd(0x01); //清屏
  166.   delayms(5);
  167. }

  168. //******************閃爍子函數(shù)**************************
  169. void lcdflag()
  170. {
  171.   lcd_wcmd(0x08); //關(guān)閉顯示
  172.   delayms(500);
  173.   lcd_wcmd(0x0c); //開啟顯示
  174.   delayms(500);
  175.   lcd_wcmd(0x08);
  176.   delayms(500);
  177.   lcd_wcmd(0x0c);
  178.   delayms(500);
  179.   lcd_wcmd(0x08);
  180.   delayms(500);
  181.   lcd_wcmd(0x0c);
  182.   delayms(500);

  183. }
  184. //******************寫字符串子函數(shù)*************************

  185. void wr_string(unsigned char str[])//寫字符串子函數(shù)
  186. {
  187.   unsigned char num = 0;

  188.   while (str[num])
  189.   {
  190.     lcd_wdat(str[num++]); //寫數(shù)據(jù)

  191.   }
  192. }

  193. //********************按鍵設(shè)置時(shí)間*************************
  194. void keyscan()//按鍵設(shè)置時(shí)間
  195. {
  196.       
  197.         if(sset==0)
  198.         {
  199.                 delayms(10);
  200.                 if(sset==0)
  201.                 {
  202.                         EX0=1;
  203.                         keycount++;
  204.                         while(sset==0)
  205.                         {
  206.                                 ;
  207.                         }
  208.                         if(keycount==1)
  209.                         {
  210.                                 TR0=0;          //停止計(jì)時(shí)
  211.                                 key=1;
  212.                                 keycount=2;
  213.                                 lcd_wcmd(0x8e);
  214.                                 lcd_wcmd(0x0d);//秒位閃爍
  215.                               
  216.                         }
  217.                         if(keycount==2)
  218.                         {
  219.                        
  220.                                 ;
  221.                        
  222.                         }
  223.                         if(keycount==3)
  224.                         {
  225.                                 keycount=4;
  226.                                 lcd_wcmd(0x8c);
  227.                                 lcd_wcmd(0x0d);//分位閃爍
  228.                                 //lcd_wcmd(0x04);光標(biāo)左移一位
  229.                         }
  230.                         if(keycount==4)
  231.                         {
  232.                                 ;
  233.                               
  234.                               
  235.                         }
  236.                         if(keycount==5)
  237.                         {
  238.                                 keycount=6;
  239.                                 lcd_wcmd(0x8a);
  240.                                 lcd_wcmd(0x0d);//時(shí)位閃爍
  241.                        
  242.                         }
  243.                         if(keycount==6)
  244.                         {
  245.                                 ;
  246.                         }
  247.                         if(keycount==7)
  248.                         {
  249.                                 keycount=0;
  250.                               
  251.                                 lcd_wcmd(0x0c);//停止閃爍
  252.                                 TR0=1;          //開始計(jì)時(shí)
  253.                                 EX0=1;
  254.                               
  255.                         }
  256.                 }
  257.         }
  258.       
  259.         if(keycount!=0)
  260.         {
  261.                 if(keycount==2)//編輯秒
  262.                 {
  263.                         if(sadd==0)//數(shù)值加1
  264.                         {
  265.                                 delayms(10);
  266.                                 if(sadd==0)
  267.                                 {
  268.                                         second++;
  269.                                         if(second==60)
  270.                                         {
  271.                                                 second=0;
  272.                                         }
  273.                                         sadd=1;
  274.                                 }
  275.                                 writesmh(0x0e,second);
  276.                                 lcd_wcmd(0x8e);
  277.                                 lcd_wcmd(0x0d);//秒位閃爍
  278.                               
  279.                         }
  280.                         if(sdel==0)//數(shù)值減1
  281.                         {
  282.                                 delayms(10);
  283.                                 if(sdel==0)
  284.                                 {
  285.                                        
  286.                                         if(second==0)
  287.                                         {
  288.                                                 second=60;
  289.                                         }
  290.                                         second--;
  291.                                         sdel=1;
  292.                                 }
  293.                                 writesmh(0x0e,second);
  294.                                 lcd_wcmd(0x8e);
  295.                                 lcd_wcmd(0x0d);//秒位閃爍
  296.                               
  297.                         }
  298.                        
  299.                        
  300.                        
  301.                 }
  302.                 if(keycount==4)//編輯分鐘
  303.                 {
  304.                         if(sadd==0)//數(shù)值加1
  305.                         {
  306.                                 delayms(10);;
  307.                                 if(sadd==0)
  308.                                 {
  309.                                         minute++;
  310.                                         if(minute==60)
  311.                                         {
  312.                                                 minute=0;
  313.                                         }
  314.                                         sadd=1;
  315.                                 }
  316.                                 writesmh(0x0c,minute);
  317.                                 lcd_wcmd(0x8c);
  318.                                 lcd_wcmd(0x0d);//分位閃爍
  319.                         }
  320.                         if(sdel==0)//數(shù)值減1
  321.                         {
  322.                                 delayms(10);
  323.                                 if(sdel==0)
  324.                                 {
  325.                                        
  326.                                         if(minute==0)
  327.                                         {
  328.                                                 minute=60;
  329.                                         }
  330.                                         minute--;
  331.                                         sdel=1;
  332.                                 }
  333.                             writesmh(0x0c,minute);
  334.                                 lcd_wcmd(0x8c);
  335.                                 lcd_wcmd(0x0d);//分位閃爍
  336.                         }
  337.                        
  338.                        
  339.                 }
  340.                 if(keycount==6)//編輯小時(shí)
  341.                 {
  342.                         if(sadd==0)//數(shù)值加1
  343.                         {
  344.                                 delayms(10);
  345.                                 if(sadd==0)
  346.                                 {
  347.                                         hour++;
  348.                                         if(hour==24)
  349.                                         {
  350.                                                 minute=0;
  351.                                         }
  352.                                         sadd=1;
  353.                                 }
  354.                             writesmh(0x0a,hour);
  355.                                 lcd_wcmd(0x8a);
  356.                                 lcd_wcmd(0x0d);//時(shí)位閃爍
  357.                         }
  358.                         if(sdel==0)//數(shù)值減1
  359.                         {
  360.                                 delayms(10);
  361.                                 if(sdel==0)
  362.                                 {
  363.                                        
  364.                                         if(hour==0)
  365.                                         {
  366.                                                 hour=24;
  367.                                         }
  368.                                         hour--;
  369.                                         sdel=1;
  370.                                 }
  371.                                 writesmh(0x0a,hour);
  372.                                 lcd_wcmd(0x8a);
  373.                                 lcd_wcmd(0x0d);//時(shí)位閃爍
  374.                         }
  375.                        
  376.                        
  377.                 }
  378.                
  379.         }
  380. }

  381. //主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)

  382. void main()
  383. {
  384.     delayms(100); //上電,等待穩(wěn)定
  385.     lcd_init(); //初始化LCD
  386.       
  387.         lcd_pos(1, 0); //設(shè)置顯示位置為第一行
  388.     wr_string(DIS1);
  389.     lcd_pos(2, 0); //設(shè)置顯示位置為第二行
  390.     wr_string(DIS2);
  391.         lcd_pos(3, 3); //設(shè)置顯示位置為第四行
  392.     wr_string(DIS31);
  393.         lcd_pos(3, 5); //設(shè)置顯示位置為第四行
  394.     wr_string(DIS32);
  395.         lcd_pos(3, 7); //設(shè)置顯示位置為第四行
  396.     wr_string(DIS33);
  397.         lcd_pos(4, 6); //設(shè)置顯示位置為第四行
  398.     wr_string(DIS4);
  399.       
  400.         writesmh(0x0e,second);
  401.         delayms(5);
  402.         writesmh(0x0c,minute);
  403.         delayms(5);
  404.         writesmh(0x0a,hour);
  405.         delayms(5);
  406.       
  407.   while (1)
  408.   {
  409.       
  410.         keyscan();
  411.       
  412.       
  413.   }
  414. }
  415. //**********************中斷***************************

  416. void time0() interrupt 1 using 0//倒計(jì)時(shí)中斷
  417. {
  418.       
  419.         TH0=0x3C;
  420.         TL0=0xB0;
  421.         count++;
  422.         if(count==20)
  423.         {
  424.                 count=0;
  425.                 second--;
  426.                 if(second<0)
  427.                 {
  428.                         second=59;
  429.                         minute--;
  430.                         if(minute<0)
  431.                         {
  432.                                 minute=59;
  433.                                 hour--;
  434.                                 if(hour<0)
  435.                                 {
  436.                                         hour=24;
  437.                                 }
  438.                                 lcd_pos(3, 2); //設(shè)置顯示位置為第三行,第七列
  439.                                 writesmh(0x0a,hour);
  440.                         }
  441.                         lcd_pos(3, 4); //設(shè)置顯示位置為第三行,第七列
  442.                         writesmh(0x0c,minute);
  443.                 }
  444.                 lcd_pos(3, 6); //設(shè)置顯示位置為第三行,第七列
  445.                 writesmh(0x0e,second);
  446.                 if((second==0)&&(minute==0)&&(hour==0))//到點(diǎn)后響鈴
  447.                 {
  448.                         TR0=0;
  449.                         spk=0;
  450.                         second=0;
  451.                         minute=0;
  452.                         hour=0;
  453.                         lcdflag();
  454.                        
  455.                         spk=1;
  456.                        
  457.                 }
  458.         }
  459.       
  460. }

  461. void encoder(void) interrupt 0//外部中斷0 旋轉(zhuǎn)碼開關(guān)中斷程序
  462. {
  463.         if(INT1==1)
  464.         {      
  465.                 sadd=0;
  466.                 sdel=1;
  467.                
  468.         }
  469.         if(INT1==0)
  470.         {
  471.                 sdel=0;
  472.                 sadd=1;
  473.                
  474.         }
  475. }

  476. //*********************************************************
復(fù)制代碼




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

使用道具 舉報(bào)

沙發(fā)
ID:82765 發(fā)表于 2017-8-24 15:15 來自手機(jī) | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

板凳
ID:229139 發(fā)表于 2017-8-24 15:34 | 只看該作者
我來看看
回復(fù)

使用道具 舉報(bào)

地板
ID:229138 發(fā)表于 2017-8-24 15:34 來自手機(jī) | 只看該作者
不錯(cuò)不錯(cuò),我也看看
回復(fù)

使用道具 舉報(bào)

5#
ID:229140 發(fā)表于 2017-8-24 15:41 | 只看該作者
同問????
回復(fù)

使用道具 舉報(bào)

6#
ID:82765 發(fā)表于 2017-8-24 21:53 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

7#
ID:217075 發(fā)表于 2017-8-25 07:51 | 只看該作者
新手剛學(xué),主要是時(shí)間顯示沒搞明白,多謝了
回復(fù)

使用道具 舉報(bào)

8#
ID:217075 發(fā)表于 2017-8-25 07:52 | 只看該作者
時(shí)間太緊了,還有其他產(chǎn)品要搞,實(shí)在忙不過來了
回復(fù)

使用道具 舉報(bào)

9#
ID:223788 發(fā)表于 2017-8-25 22:19 | 只看該作者
就不能再買一個(gè)串行的12864顯示屏嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:82765 發(fā)表于 2017-8-29 12:47 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表