微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 1602显示液晶问题

1602显示液晶问题

时间:10-02 整理:3721RD 点击:

  1. #include"1602.h"
  2. //LCD延时函数
  3. void LCD_delay(uint z)  
  4. {
  5.         uint x,y;
  6.         for(x=z;x>0;x--)
  7.                 for(y=110;y>0;y--);
  8. }
  9. //使能函数
  10. void LCD_en()
  11. {
  12. LCD_EN=1;
  13. LCD_delay(5);
  14. LCD_EN=0;
  15. }

  16. //指令函数
  17. void LCD_cmd(uchar cmd)
  18. {
  19.         LCD_WR=0;
  20.         LCD_RD=0;
  21.         LCD_DATA=cmd;
  22. //        LCD_delay(5);
  23.         LCD_en();
  24. }
  25. //数据函数
  26. void LCD_dat(uchar dat)
  27. {
  28.         LCD_WR=0;
  29.         LCD_RD=1;
  30.         LCD_DATA=dat;
  31. //        LCD_delay(5);
  32.         LCD_en();
  33. }


  34. //标识位检查 忙返回0,不忙返回1;
  35. bit LCD_bf()
  36. {
  37.    bit result;
  38.    LCD_WR=1;
  39.    LCD_RD=0;
  40.    LCD_EN=1;
  41.    //LCD_delay(5);
  42.    result=LCD_BF;
  43.    LCD_EN=0;
  44.    return  result;
  45. }
  46. //读数函数
  47. uchar LCD_rd()
  48. {
  49.         uchar LCD_RD_DATA;
  50.         LCD_RD=1;
  51.         LCD_WR=1;
  52.         LCD_EN=1;
  53.         LCD_delay(5);
  54.     LCD_RD_DATA=LCD_DATA;
  55.     LCD_EN=0;
  56.         return(LCD_RD_DATA);

  57. }

  58. /***************************8
  59. 输入方式 0x50指针+不移位
  60. 显示开关        0x0c开显示
  61. 光标移位        不设置
  62. 功能设置                  0x38
  63. ****************************/
  64. void LCD_init()
  65. {
  66.                
  67. while(1==LCD_bf());
  68.         LCD_cmd(0x01);  //清屏
  69. while(1==LCD_bf());
  70.         LCD_cmd(0x0c);
  71. while(1==LCD_bf());
  72.         LCD_cmd(0x38);
  73. while(1==LCD_bf());
  74.         LCD_cmd(0x06);               
  75. }
  76. //位置函数
  77. void LCD_pos(uchar x,uchar y)
  78. {
  79.         if(y==0)
  80.                 {LCD_cmd(0x80|x);}
  81.         else
  82.                 {LCD_cmd(0xc0|x);}
  83. }
  84. //整数转化为字符串函数
  85. void LCD_zh(int a,int b,int c)
  86. {
  87.         sprintf(LCD_md,"%d:%d:%d",a,b,c);       
  88. }

  89. //写字符串函数
  90. void LCD_wd_c(uchar x,uchar y,int a,int b,int c,char *md)
  91. {
  92.         LCD_init();
  93.         LCD_pos(x,y);
  94.          
  95.         LCD_zh( a, b, c);
  96.         while((* md)!='\0')
  97.         {
  98.                 while(LCD_bf());
  99.                
  100.                         LCD_dat( * md);
  101.                         ++md;
  102.                        
  103.         }       
  104. }
  105. //自定义字符 ,        add在 0x40——0x7f中 8个字符
  106. void LCD_set(uchar add,uchar num[7])
  107. {
  108.         uchar a;
  109.         while(1==LCD_bf());
  110.         LCD_cmd(add*8+0x40);
  111.         for(a=0;a<8;a++)
  112.         {
  113.                
  114.         while(1==LCD_bf());
  115.                 LCD_dat(num[a]);
  116.         }
  117. }
  118. void main()
  119. {
  120.        
  121. /*        uchar tab[]={0x00,0x1B,0x15,0x11,0x0A,0x04,0x00,0x00};
  122.         LCD_delay(1000);
  123.     LCD_init();
  124.         while(1==LCD_bf());
  125.         LCD_set(0,tab);
  126.         while(1==LCD_bf());
  127.         LCD_pos(1,1);          
  128.         while(1==LCD_bf());
  129.         LCD_dat(0x01);
  130.         while(1==LCD_bf());        */
  131.         LCD_wd_c(1,0,2,2,2,LCD_md);
  132.         while(1);
  133. }

复制代码

显示时
LCD_wd_c(1,0,2,2,2,LCD_md);
是在第一行第2个位置显示    2:2:2
但是老是出错,可能在第一行第6个位置显示   6>6>6
就是每个都加了4(比如1+4;     2+4;   :+4=>  )
但有时又会在第一行第1个位置或第一行第6个位置 显示
2:2:6或2>6>6或2:2:2
反正就是在这2个位置显示2,6,:,>这些的组合

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top