找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2756|回复: 9
收起左侧

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

[复制链接]
ID:217075 发表于 2017-8-24 10:22 | 显示全部楼层 |阅读模式
/***********说明*************/

/***
第一行显示:加热模式:强(P2^0=1、P2^1=0)或弱(P2^0=0、P2^1=1)(由按键S4切换)
第二行显示:加热时间还剩:                                                                        
第三行显示:   时   分    秒
第四行显示:加热中或加热结束(倒计时结束时)。


按下开关S1,开始设定秒,秒编辑位闪动,
                        按下S2增加或S3减小数值;
在按下开关S1,秒确定,设定分;
再按下S1,分确定,设定小时。
再按下S1,时间确定。
再按下S1,开始倒计时并使P1^5=0。到达定时时间后P1^5=1。

12864采用:www点jlxlcd点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;//设置按钮
sbit s2=P3^5;
sbit s3=P3^6;
sbit s4=P3^7;

参考程序如下(并口)
***/
/*****
简介:第一行显示,距离系统爆炸时间
第二行显示,还剩
第三行显示,00时,00分,00秒
第四行显示,             周林

按下旋钮开关,开始设定秒,秒编辑位闪动。左右旋转设定数值,
在按下开关,秒确定,设定分,分编辑位闪动左右调数值,
再按下,分确定,小时位闪动。左右转调小时,再按一下。时间确定,开始倒计时。到达定时时间后停止,并闪动。

*****/

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

  3. /********************* 定义 ********************************/
  4. #define LCD_data  P0       //数据口
  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; //液晶复位端口

  10. sbit sset=P3^4;//设置按钮
  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.   "距离系统爆炸时间"
  19. };
  20. unsigned char code DIS2[] =
  21. {
  22.   "还剩:"
  23. };
  24. unsigned char code DIS31[] =
  25. {
  26.   "时"
  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个字节

  42. /*********************延时子函数**************************/

  43. void delayNOP()//us延时子函数   (4.34us)
  44. {
  45.   _nop_();
  46.   _nop_();
  47.   _nop_();
  48.   _nop_();
  49. }

  50. void delayms(unsigned int ms)//ms延时子函数
  51. {
  52.   unsigned char y;
  53.   while (ms--)
  54.   {
  55.     for (y = 0; y < 114; y++)
  56.       ;
  57.   }
  58. }
  59. //******************检查LCD忙状态**************************


  60. bit lcd_busy()//检查LCD忙状态 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. //***********************写指令数据***********************

  72. void lcd_wcmd(unsigned char cmd)//写指令数据到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)//写显示数据到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)//显示个位和十位数据
  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. //*********************初始化设定****************************

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

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

  116.   lcd_wcmd(0x34); //扩充功能设定,扩充指令,选8位数据
  117.   delayms(5);
  118.   lcd_wcmd(0x30); //功能设定,基本指令操作,选8位数据
  119.   delayms(5);
  120.   lcd_wcmd(0x0C); //显示开,关光标,关光标反白允许。
  121.   delayms(5);
  122.   lcd_wcmd(0x04); //光标的移动方向
  123.   delayms(5);
  124.   lcd_wcmd(0x01); //清除LCD的显示内容
  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为边沿触发方式
  134. }

  135. //*********************设定显示位置子函数**********************

  136. void lcd_pos(unsigned char X, unsigned char Y)//设定显示位置
  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. //*****************清屏子函数***************************

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

  168. //******************闪烁子函数**************************
  169. void lcdflag()
  170. {
  171.   lcd_wcmd(0x08); //关闭显示
  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. //******************写字符串子函数*************************

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

  188.   while (str[num])
  189.   {
  190.     lcd_wdat(str[num++]); //写数据

  191.   }
  192. }

  193. //********************按键设置时间*************************
  194. void keyscan()//按键设置时间
  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;          //停止计时
  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);光标左移一位
  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);//时位闪烁
  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;          //开始计时
  253.                                 EX0=1;
  254.                               
  255.                         }
  256.                 }
  257.         }
  258.       
  259.         if(keycount!=0)
  260.         {
  261.                 if(keycount==2)//编辑秒
  262.                 {
  263.                         if(sadd==0)//数值加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)//数值减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)//数值加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)//数值减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)//编辑小时
  341.                 {
  342.                         if(sadd==0)//数值加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);//时位闪烁
  357.                         }
  358.                         if(sdel==0)//数值减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);//时位闪烁
  374.                         }
  375.                        
  376.                        
  377.                 }
  378.                
  379.         }
  380. }

  381. //主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数

  382. void main()
  383. {
  384.     delayms(100); //上电,等待稳定
  385.     lcd_init(); //初始化LCD
  386.       
  387.         lcd_pos(1, 0); //设置显示位置为第一行
  388.     wr_string(DIS1);
  389.     lcd_pos(2, 0); //设置显示位置为第二行
  390.     wr_string(DIS2);
  391.         lcd_pos(3, 3); //设置显示位置为第四行
  392.     wr_string(DIS31);
  393.         lcd_pos(3, 5); //设置显示位置为第四行
  394.     wr_string(DIS32);
  395.         lcd_pos(3, 7); //设置显示位置为第四行
  396.     wr_string(DIS33);
  397.         lcd_pos(4, 6); //设置显示位置为第四行
  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//倒计时中断
  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); //设置显示位置为第三行,第七列
  439.                                 writesmh(0x0a,hour);
  440.                         }
  441.                         lcd_pos(3, 4); //设置显示位置为第三行,第七列
  442.                         writesmh(0x0c,minute);
  443.                 }
  444.                 lcd_pos(3, 6); //设置显示位置为第三行,第七列
  445.                 writesmh(0x0e,second);
  446.                 if((second==0)&&(minute==0)&&(hour==0))//到点后响铃
  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 旋转码开关中断程序
  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. //*********************************************************
复制代码




回复

使用道具 举报

ID:82765 发表于 2017-8-24 15:15 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:229139 发表于 2017-8-24 15:34 | 显示全部楼层
我来看看
回复

使用道具 举报

ID:229138 发表于 2017-8-24 15:34 来自手机 | 显示全部楼层
不错不错,我也看看
回复

使用道具 举报

ID:229140 发表于 2017-8-24 15:41 | 显示全部楼层
同问????
回复

使用道具 举报

ID:82765 发表于 2017-8-24 21:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:217075 发表于 2017-8-25 07:51 | 显示全部楼层
新手刚学,主要是时间显示没搞明白,多谢了
回复

使用道具 举报

ID:217075 发表于 2017-8-25 07:52 | 显示全部楼层
时间太紧了,还有其他产品要搞,实在忙不过来了
回复

使用道具 举报

ID:223788 发表于 2017-8-25 22:19 | 显示全部楼层
就不能再买一个串行的12864显示屏吗?
回复

使用道具 举报

ID:82765 发表于 2017-8-29 12:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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