找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

矩陣鍵盤12864液晶實時時鐘程序

[復(fù)制鏈接]
ID:71407 發(fā)表于 2014-12-31 13:40 | 顯示全部樓層 |閱讀模式
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #include<intrins.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. uchar shijian[6]={0x1,0x1,0x0,0x2,0x5,0x8};
  10. uchar zi[]={"時分秒"};
  11. uchar j,key;
  12. char z,z1;
  13. uchar m,mark=0,bz=0;
  14. uint k=4000;
  15. uchar i;
  16. /* 端口定義*/
  17. sbit LCD_RS  =  P2^7;            //寄存器選擇輸入
  18. sbit LCD_RW  =  P2^6;            //液晶讀/寫控制
  19. sbit LCD_EN  =  P2^5;            //液晶使能控制
  20. sbit LCD_PSB =  P2^4;            //串/并方式控制
  21. void delay_1ms(uint x)
  22. {
  23. uint i,j;
  24. for(j=0;j<x;j++)
  25. for(i=0;i<110;i++);
  26. }  
  27. /*******************************************************************/
  28. /*                                                                 */
  29. /*寫指令數(shù)據(jù)到LCD                                                  */
  30. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  31. /*                                                                 */
  32. /*******************************************************************/
  33. void jud()
  34. {char n=0,m=0,temp;
  35. if(P1!=0xf0)
  36. {delay_1ms(15);
  37. if(P1!=0xf0)
  38. bz=1;
  39. }
  40. if(bz==1)
  41. {
  42. uchar scan[4]={0xfe,0xfd,0xfb,0xf7};
  43. uchar table[4][4]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7};
  44. uchar num[4][4]={0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15};
  45. while(n<4)
  46. {P1=scan[n];temp=P1;m=0;
  47. while(m<4)
  48. {if(temp==table[n][m])
  49. goto next;
  50. else
  51. m++;

  52. }
  53. n++;
  54. }

  55. next: key=num[n][m];
  56.   bz=1;
  57. if(key==10)
  58. mark=1;
  59. }
  60. P1=0XF0;
  61.   while(P1!=0xf0);
  62.   delay_1ms(15);
  63.   P1=0XF0;

  64. }
  65. void write_cmd(uchar cmd)
  66. {                        
  67.     LCD_RS = 0;
  68.     LCD_RW = 0;
  69.     LCD_EN = 0;
  70.     P0 = cmd;
  71. delay_1ms(5);
  72.     LCD_EN = 1;
  73. delay_1ms(5);
  74.     LCD_EN = 0;
  75. }
  76. /*******************************************************************/
  77. /*                                                                 */
  78. /*寫顯示數(shù)據(jù)到LCD                                                  */
  79. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  80. /*                                                                 */
  81. /*******************************************************************/
  82. void write_dat(uchar dat)
  83. {                        
  84.     LCD_RS = 1;
  85.     LCD_RW = 0;
  86.     LCD_EN = 0;
  87.     P0 = dat;
  88. delay_1ms(5);
  89.     LCD_EN = 1;
  90. delay_1ms(5);
  91.     LCD_EN = 0;
  92. }
  93. /*********************************************************/
  94. /*                                                       */
  95. /* 設(shè)定顯示位置                                          */
  96. /*                                                       */
  97. /*********************************************************/
  98. void lcd_pos(uchar X,uchar Y)
  99. {                        
  100.    uchar  pos;
  101.    if (X==0)
  102.      {X=0x80;}
  103.    else if (X==1)
  104.      {X=0x90;}
  105.    else if (X==2)
  106.      {X=0x88;}
  107.    else if (X==3)
  108.      {X=0x98;}
  109.    pos = X+Y ;
  110.    write_cmd(pos);     //顯示地址
  111. }

  112. /*******************************************************************/
  113. /*                                                                 */
  114. /*  LCD初始化設(shè)定                                                  */
  115. /*                                                                 */
  116. /*******************************************************************/
  117. void lcd_init()
  118. {
  119.     LCD_PSB = 1;         //并口方式
  120.     write_cmd(0x30);      //基本指令操作
  121.     delay_1ms(5);
  122.     write_cmd(0x0C);      //顯示開,關(guān)光標
  123.     delay_1ms(5);
  124.     write_cmd(0x01);      //清除LCD的顯示內(nèi)容
  125.     delay_1ms(5);
  126. }
  127. /*********************************************************/
  128. /*               */
  129. /* 主程序                     */
  130. /*                                                       */
  131. /*********************************************************/
  132. main()
  133. { uchar x;
  134. EA=1;
  135. P1=0XF0;
  136. TMOD=0X2;
  137. TH0=0X6;
  138. TL0=0X6;
  139. EA=1;ET0=1;TR0=1;
  140. i=0;

  141.     delay_1ms(10);                 //延時
  142.     lcd_init();

  143.     lcd_pos(0,1);         

  144.     write_dat(zi[0]);     
  145. write_dat(zi[1]);  
  146.     lcd_pos(0,3);            

  147. write_dat(zi[2]);  
  148. write_dat(zi[3]);   
  149. lcd_pos(0,5);            
  150. write_dat(zi[4]);     
  151. write_dat(zi[5]);
  152. while(1)
  153. {

  154. z=1;
  155. z1=0;
  156. P1=0XF0;
  157. lcd_pos(0,0);           
  158.     i = 0;
  159.     while(i<2)
  160.     {
  161. write_dat(shijian[i]+0x30);   
  162.     i++;
  163.     }

  164. lcd_pos(0,2);           
  165.     while(i<4)
  166.     {
  167. write_dat(shijian[i]+0x30);   
  168.     i++;
  169.     }


  170.   lcd_pos(0,4);           
  171.     while(i<6)
  172.     {
  173. write_dat(shijian[i]+0x30);   
  174.     i++;
  175.     }
  176.   jud();
  177. if(key==10)
  178. {TR0=0;
  179.   lcd_pos(0,0);delay_1ms(5);
  180.   write_cmd(0x0f);
  181.      delay_1ms(5);
  182.   bz=0;
  183.    while(!bz)
  184.    {jud();}
  185.    while(mark)
  186.    {jud();
  187.    if(key==12)
  188.    {z--;write_cmd(0x10);delay_1ms(5);write_cmd(0x10);delay_1ms(5);bz=0;if((2*(z-1)+(z1-1))==-3){for(x=0;x<6;x++){write_cmd(0x14);delay_1ms(5);}z=3;z1=0;}}
  189.     else if(key==13)
  190.    {z++;write_cmd(0x14);delay_1ms(5);write_cmd(0x14);delay_1ms(5);bz=0;if((2*(z-1)+(z1-1))>=5){for(x=0;x<6;x++){write_cmd(0x10);delay_1ms(5);}z=1;z1=0;}}
  191.     else if(key<=9)
  192.    {z1++;write_dat(key+48);delay_1ms(5);shijian[2*(z-1)+(z1-1)]=key;if((2*(z-1)+(z1-1)<5)&&(z1%2==0)){write_cmd(0x14);delay_1ms(5);}else if(2*(z-1)+(z1-1)>=5){for(x=0;x<5;x++){write_cmd(0x10);delay_1ms(5);}z=1;z1=0;}bz=0;}
  193.     else if(key==11)     
  194.    {write_cmd(0x0c);delay_1ms(5);mark=0;}
  195.     while(!bz)
  196.    { jud();}
  197.    }
  198.   bz=0;
  199.    TR0=1;
  200. }

  201. }

  202. }
  203. /*************************************/
  204. count0 (void) interrupt 1
  205. {
  206. k--;
  207. if(k==0x0)
  208. {++shijian[5];k=4000;
  209. if (shijian[5]==0x0a)
  210. {shijian[5]=0x0;
  211. ++shijian[4];
  212. if(shijian[4]==0x6)
  213. {shijian[4]=0x0;
  214. ++shijian[3];
  215. if (shijian[3]==0x0a)
  216. {shijian[3]=0x0;
  217. ++shijian[2];
  218. if(shijian[2]==0x6)
  219. {shijian[2]=0x0;
  220. ++shijian[1];
  221. if((shijian[0]==0x0)&&(shijian[1]==0x0a))
  222. {shijian[1]=0x0;
  223. ++shijian[0];
  224. }
  225. else if((shijian[0]==0x1)&&(shijian[1]==0x2))
  226. {shijian[1]=0x0;
  227. shijian[0]=0x0;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. }
  234. }
  235. /*******************************************/
復(fù)制代碼


回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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