Chinaunix首页 | 论坛 | 博客
  • 博客访问: 961788
  • 博文数量: 210
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2070
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-19 21:54
文章分类

全部博文(210)

文章存档

2020年(2)

2019年(18)

2018年(27)

2017年(5)

2016年(53)

2015年(88)

2014年(17)

分类: C/C++

2015-09-23 18:18:18


点击(此处)折叠或打开

  1. /*lcd1602
  2. 显示16*2个字母或者数字
  3. RS 数据/指令引脚,0代表指令,1代表数据
  4. RW 读/写控制引脚,0代表写,1代表读
  5. E 使能位,1打开,0关闭
  6. D0~D7 数据/地址总线,数据和指令都通过这里传输

  7. 先发指令,后发数据
  8. 1602操作过程:
  9.     1)初始化,指定1602如何显示
  10.     2)发送地址,指定数据要显示在屏幕的哪个地方
  11.     3)发数据,指定屏幕上显示什么

  12. 关于手册:时序图,指令1、2、3、4、6、8、9
  13. */
  14. #include <reg52.h>
  15. //#include <lcd_1602.h>
  16. #define uchar unsigned char
  17. sbit LCD_1602_RW=P2^1;
  18. sbit LCD_1602_RS=P2^0;
  19. sbit LCD_1602_EN=P2^5;
  20. /*****************************************************
  21. 函数功能:延时1ms
  22. (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
  23. ***************************************************/
  24. void delay_1ms()
  25. {
  26.    float i,j;    
  27.      for(i=0;i<4;i++)
  28.      for(j=0;j<33;j++)
  29.      ;        
  30.      i++;
  31. }
  32. /**************************************************
  33. 函数功能:延时10微妙
  34. 程序调用 2us + 子程序返回 2us + R7赋值 1us
  35. **************************************************/
  36.  void delay_10us()
  37.  {
  38.      unsigned int i = 100;
  39.     i--;
  40.     i--;
  41.     i--;
  42.     i--;
  43.     i--;
  44.     i--;
  45.  }

  46. //读忙标志,LCD工作速度较慢,只有它不忙的时候才可以接受单片机的指令
  47. int lcd_1602_busy()
  48. {
  49.     uchar tmp;
  50.     P0 = 0xff;
  51.     LCD_1602_RW = 1;
  52.     LCD_1602_RS = 0;

  53.     LCD_1602_EN = 1;
  54.     delay_10us();
  55.     tmp = P0;
  56.     LCD_1602_EN = 0;

  57.     //强制转换,将一个8位二进制转换成1位的
  58.     //bit是位数据
  59.     //如果1602忙,那么tmp的最高位是1
  60.     return (bit)(0x80 & tmp);

  61. }

  62. void lcd_1602_write_cmd(uchar cmd)
  63. {
  64.     //等待1602不忙
  65.       while(lcd_1602_busy());
  66.     
  67.     LCD_1602_RW = 0;
  68.     LCD_1602_RS = 0;
  69.     P0 = cmd;

  70.     LCD_1602_EN = 1;
  71.     delay_10us();
  72.     LCD_1602_EN = 0;    
  73. }

  74. void lcd_1602_write_data(uchar dat)
  75. {
  76.     while(lcd_1602_busy());

  77.     LCD_1602_RW = 0;
  78.     LCD_1602_RS = 1;
  79.     P0 = dat;

  80.     LCD_1602_EN = 1;
  81.     delay_10us();
  82.     LCD_1602_EN = 0;    
  83. }

  84. void lcd_1602_init()
  85. {
  86.     lcd_1602_write_cmd(0x01);        //指令1,发送清屏指令
  87.     lcd_1602_write_cmd(0x0c);        //指令4,打开显示开关,没有光标
  88.     lcd_1602_write_cmd(0x38);     //指令6,8位总线,双行显示,5*7点阵
  89. //    lcd_1602_write_cmd(0x05);        //指令3,光标左移,屏幕上的字左移
  90.     lcd_1602_write_cmd(0x01);        //清屏,所有的配置完成之后,需要清屏
  91.     delay_1ms();
  92. }    

  93. void lcd_1602_write_char(uchar x, uchar y, uchar dat)
  94. {
  95.     if(x == 0)
  96.     {
  97.         lcd_1602_write_cmd(0x80 + y%16);
  98.         lcd_1602_write_data(dat);    
  99.     }
  100.     else
  101.     {
  102.         lcd_1602_write_cmd(0xc0 + y%16);
  103.         lcd_1602_write_data(dat);    
  104.     }
  105. }

  106. void lcd_1602_write_string(uchar x, uchar y, uchar *string)
  107. {
  108.     int i=0;
  109.     while(i<15-y)
  110.     {
  111.         lcd_1602_write_char(x, y++, *(string++));
  112.     }
  113. }
  114. void delay()
  115. {
  116.     int i,j;
  117.     for(i=0;i<1000;i++)
  118.         for(j=0;j<100;j++);
  119. }

  120. void lcd_1602_write_left(uchar x, int len, char *string)
  121. {
  122.     int i = 0;
  123.     while(i<len)
  124.     {
  125.         delay();                    
  126.         lcd_1602_write_string(x, 15-i, string);
  127.         i++;
  128.     }
  129. }
  130. void main()             // 00001 110
  131. {
  132.     
  133.     char str[5]="";    
  134.     lcd_1602_init();
  135.     while(1)
  136.     {
  137.          lcd_1602_write_cmd(0x01);
  138.         //lcd_1602_write_string(0,2, "jjj");
  139. //    lcd_1602_write_char(1, 1, 'a');
  140.         //lcd_1602_write_left(5, 2, str);
  141.     }
  142. }



阅读(1305) | 评论(0) | 转发(0) |
0

上一篇:静态网页的复习

下一篇:C#的简单应

给主人留下些什么吧!~~