drive_1602.lst 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. C51 COMPILER V9.54 DRIVE_1602 02/17/2022 16:20:57 PAGE 1
  2. C51 COMPILER V9.54, COMPILATION OF MODULE DRIVE_1602
  3. OBJECT MODULE PLACED IN .\Objects\drive_1602.obj
  4. COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE drive_1602.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listing
  5. -s\drive_1602.lst) TABS(2) OBJECT(.\Objects\drive_1602.obj)
  6. line level source
  7. 1 #include "drive_1602.h"
  8. 2
  9. 3 #include <stdarg.h> // 标准头文件
  10. 4 #include "stdio.h"
  11. 5 #include "string.h"
  12. 6
  13. 7 #define lcddata P1
  14. 8
  15. 9 sbit rs=P2^7;
  16. 10 sbit en=P2^6;
  17. 11
  18. 12 void delay_1ms(unsigned int xms)//延时函数,有参函数
  19. 13 {
  20. 14 1 unsigned char i, j;
  21. 15 1 while(xms--)
  22. 16 1 {
  23. 17 2 _nop_();
  24. 18 2 _nop_();
  25. 19 2 _nop_();
  26. 20 2 i = 11;
  27. 21 2 j = 190;
  28. 22 2 do
  29. 23 2 {
  30. 24 3 while (--j);
  31. 25 3 } while (--i);
  32. 26 2 }
  33. 27 1 }
  34. 28 //****液晶写入指令函数****//
  35. 29 void Write_1602_com(unsigned char com)
  36. 30 {
  37. 31 1 // rw=0;
  38. 32 1 rs=0;//数据/指令选择置为指令
  39. 33 1 lcddata=com;//送入数据
  40. 34 1 delay_1ms(1);
  41. 35 1 en=1;//拉高使能端,为制造有效的下降沿做准备
  42. 36 1 delay_1ms(1);
  43. 37 1 en=0;//en由高变低,产生下降沿,液晶执行命令
  44. 38 1 }
  45. 39
  46. 40 //***液晶写入数据函数****//
  47. 41 void Write_1602_date(unsigned char date)
  48. 42 {
  49. 43 1 // rw=0;
  50. 44 1 rs=1;//数据/指令选择置为数据
  51. 45 1 lcddata=date;//送入数据
  52. 46 1 delay_1ms(1);
  53. 47 1 en=1; //en置高电平,为制造下降沿做准备
  54. 48 1 delay_1ms(1);
  55. 49 1 en=0; //en由高变低,产生下降沿,液晶执行命令
  56. 50 1 }
  57. 51
  58. 52 /************ 写字符数据函数 *****************
  59. 53 //功能:在lcd1602指定位置上显示字符;
  60. 54 //参数
  61. C51 COMPILER V9.54 DRIVE_1602 02/17/2022 16:20:57 PAGE 2
  62. 55 //p: 指向待显示数据指针
  63. 56 //x: X坐标
  64. 57 //y: Y坐标
  65. 58 //************ *********** *****************/
  66. 59 void WriteLcd1602_String(char x,char y,char *p)
  67. 60 {
  68. 61 1 char i=0;
  69. 62 1 if(y == 0)
  70. 63 1 {
  71. 64 2 Write_1602_com(0x80 + x);
  72. 65 2 }
  73. 66 1 else
  74. 67 1 {
  75. 68 2 Write_1602_com(0xC0 + x);
  76. 69 2 }
  77. 70 1 while(*p != 0)
  78. 71 1 {
  79. 72 2 Write_1602_date(*p);
  80. 73 2 p++;
  81. 74 2 }
  82. 75 1 }
  83. 76
  84. 77
  85. 78 //***液晶初始化函数****//
  86. 79 void lcd1602_init()
  87. 80 {
  88. 81 1 Write_1602_com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  89. 82 1 delay_1ms(1);
  90. 83 1 Write_1602_com(0x0c);//开显示不显示光标
  91. 84 1 delay_1ms(1);
  92. 85 1 Write_1602_com(0x06);//整屏不移动,光标自动右移
  93. 86 1 delay_1ms(1);
  94. 87 1 Write_1602_com(0x01);//清显示
  95. 88 1 delay_1ms(1);
  96. 89 1 Write_1602_com(0x80);
  97. 90 1 delay_1ms(1);
  98. 91 1
  99. 92 1 }
  100. 93 void LCD1602_Write_address(unsigned char x,unsigned char y)
  101. 94 {
  102. 95 1 x&=0x0f; //列地址限制在0-15间
  103. 96 1 y&=0x01; //行地址限制在0-1间
  104. 97 1 if(y==0) //如果是第一行
  105. 98 1 Write_1602_com(x|0x80); //将列地址写入
  106. 99 1 else //如果是第二行
  107. 100 1 Write_1602_com((x+0x40)|0x80); //将列地址写入
  108. 101 1 }
  109. 102 void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  110. 103 {
  111. 104 1 LCD1602_Write_address(x,y); //先将地址信息写入
  112. 105 1 Write_1602_date(buf); //再写入要显示的数据
  113. 106 1 }
  114. MODULE INFORMATION: STATIC OVERLAYABLE
  115. CODE SIZE = 172 ----
  116. CONSTANT SIZE = ---- ----
  117. XDATA SIZE = ---- ----
  118. PDATA SIZE = ---- ----
  119. DATA SIZE = ---- 2
  120. IDATA SIZE = ---- ----
  121. BIT SIZE = ---- ----
  122. C51 COMPILER V9.54 DRIVE_1602 02/17/2022 16:20:57 PAGE 3
  123. END OF MODULE INFORMATION.
  124. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)