找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1486|回复: 12
打印 上一主题 下一主题
收起左侧

请问为啥我的这个液晶屏不显示呢 求大神解答

[复制链接]
跳转到指定楼层
楼主

  1. //包含的头文件
  2. #include<REG51.H>                                                                                                                                                  
  3. #include<math.h>
  4. #include<INTRINS.H>
  5. #include<string.h>
  6. //定义宏定义
  7. #define CIRCLE 100
  8. #define uchar unsigned char
  9. #define uint   unsigned int;

  10. struct PID {  
  11. unsigned int SetPoint; // 设定目标 Desired Value  
  12. unsigned int Proportion; // 比例常数 Proportional Const  
  13. unsigned int Integral; // 积分常数 Integral Const  
  14. unsigned int Derivative; // 微分常数 Derivative Const  
  15. unsigned int LastError; // Error[-1]  
  16. unsigned int PrevError; // Error[-2]  
  17. unsigned int SumError; // Sums of Errors  
  18. };  
  19. struct PID spid; // PID Control Structure  
  20. unsigned int rout; // PID Response (Output)  
  21. unsigned int rin; // PID Feedback (Input)  
  22. typedef unsigned char BYTE;
  23. typedef unsigned int WORD;
  24. typedef bit BOOL ;

  25. sbit key1=P3^2;   //定义按键位置
  26. sbit key2=P3^3;
  27. sbit key3=P3^4;

  28. sbit rs = P1^0;
  29. sbit rw = P1^1;
  30. sbit ep = P1^2;
  31. sbit pwm=P1^5; //PWM输出端设置为P1.5输出
  32. sbit DQ=P1^3;//ds18b20 信号引脚即DQ
  33. sfr dataled=0x80;//显示数据端口 即P2口为段选码输入口
  34. uchar temp;//温度变量
  35. unsigned char set_temper=30;  
  36. unsigned char high_time;
  37. unsigned int s;   
  38. uchar flag_get,count,num,counter; //温度读取标志位、中断次数变量t0中断次数以读取温度值, t1中断次数以控制周期和PWM的占空比
  39. char const table[]={100,80,70,60,50,40,30,20,0};//高电平时间查表
  40. uchar
  41. code
  42. tab[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0x60,0x25,0x3C,0x23,0x34,
  43. 0x74,0xF7,0xFF};//,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳led显示段码115段码表
  44. uchar  shi,ge,danwei,dang,dang_dis;  // 定义温度十位、个位、摄氏度单位、及档位变量名称,及显示档位的查表变量

  45. void delay1(uchar MS);// 延时函数
  46. unsigned char ReadTemperature(void);//读温度子函数
  47. void Init_DS18B20(void);// DS18B20初始化
  48. unsigned char ReadOneChar(void);//读字节子函数
  49. void WriteOneChar(unsigned char dat);//写字节子函数
  50. void delay(unsigned int i);//延时
  51. //void del(unsigned int);
  52. void drive_moto();//由P1低四位输出控制信号
  53. void initial();
  54. unsigned int TempBuffer[5];
  55. BYTE code dis1[] = {"Temperature:"};
  56. BYTE code dis2[] = {"Set_Temper:"};
  57. BYTE code dis3[] = {"0123456789"};
  58. BYTE code dis4[] = 0xdf;
  59. BYTE code dis5[] = {"C"};
  60. //定义函数
  61. void delay2(BYTE ms)
  62. {  
  63. BYTE i;
  64. while(ms--)
  65. {
  66.   for(i = 0; i< 250; i++)
  67.   {
  68.    _nop_();
  69.    _nop_();
  70.    _nop_();
  71.    _nop_();
  72.   }
  73. }
  74. }
  75. // 测试LCD忙碌状态  
  76. BOOL lcd_bz()
  77. {      
  78. BOOL result;
  79. rs = 0;
  80. rw = 1;
  81. ep = 1;
  82. _nop_();
  83. _nop_();
  84. _nop_();
  85. _nop_();
  86. result = (BOOL)(P0 & 0x80);
  87. ep = 0;
  88. return result;  
  89. }
  90. // 写入指令数据到LCD  
  91. void lcd_wcmd(BYTE cmd)
  92. {      
  93. while(lcd_bz());
  94. rs = 0;
  95. rw = 0;
  96. ep = 0;
  97. _nop_();
  98. _nop_();  
  99. P0 = cmd;
  100. _nop_();
  101. _nop_();
  102. _nop_();
  103. _nop_();
  104. ep = 1;
  105. _nop_();
  106. _nop_();
  107. _nop_();
  108. _nop_();
  109. ep = 0;   
  110. }

  111. //设定显示位置
  112. void lcd_pos(BYTE pos)
  113. {      
  114. lcd_wcmd(pos | 0x80);
  115. }
  116. //写入字符显示数据到LCD
  117. void lcd_wdat(BYTE dat)  
  118. {      
  119. while(lcd_bz());
  120. rs = 1;
  121. rw = 0;
  122. ep = 0;
  123. P0 = dat;
  124. _nop_();
  125. _nop_();
  126. _nop_();
  127. _nop_();
  128. ep = 1;
  129. _nop_();
  130. _nop_();
  131. _nop_();
  132. _nop_();
  133. ep = 0;  
  134. }

  135. //LCD初始化设定  
  136. void lcd_init()
  137. {      
  138. lcd_wcmd(0x38);   //
  139. delay2(1);
  140. lcd_wcmd(0x0c);   //
  141. delay2(1);
  142. lcd_wcmd(0x06);   //
  143. delay2(1);
  144. lcd_wcmd(0x01);   //清除LCD的显示内容
  145. delay2(1);
  146. }

  147. //初始化相应的寄存器
  148. void initial()
  149. {
  150. EA=1;
  151. TMOD=0x11;//定时器设置皆工作在16定时计数器模式
  152. TH0=0xef;//T0赋初值
  153. TL0=0xf0;
  154. TH1=(65536-1000)/256;//T1赋初值
  155. TL1=(65536-1000)%256;
  156. ET1=1;
  157. ET0=1;
  158. TR0=1;
  159. TR1=1;
  160. P2=0xff;   
  161. count=0;
  162. counter=0;//pwm占空比控制变量
  163. //IP=0x08; //T1优先级高于T0 ,后来证明此语句是多余的因为当加入此句后反/////而PWM调速和温度检测都变得有点不稳定
  164. }
  165. //延时函数
  166. void delay(unsigned int i)
  167. {
  168. while(i--);  
  169. }

  170. //18b20初始化函数检测总线上是否有从属器件DS的存在若存在则通讯成功
  171. void Init_DS18B20(void)
  172. {
  173. unsigned char x=0;
  174. DQ = 1;    //DQ复位
  175. delay(8);  //稍做延时
  176. DQ = 0;    //单片机将DQ拉低
  177. delay(80); //延时 大于 480us
  178. DQ = 1;    //拉高总线
  179. delay(10);
  180. x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败因为DQ复位成功的回答信号即存在信号是低电平
  181. delay(5);
  182. }

  183. //读一个字节ROM
  184. unsigned char ReadOneChar(void)
  185. {
  186. unsigned char i=0;
  187. unsigned char dat = 0;
  188. for (i=8;i>0;i--)
  189. {
  190.   DQ = 0; // 给脉冲信号
  191.   dat>>=1;
  192.   DQ = 1; // 给脉冲信号
  193.   if(DQ)
  194.    dat|=0x80;//
  195.   delay(5);
  196. }
  197. return(dat);
  198. }

  199. //写一个字节
  200. void WriteOneChar(unsigned char dat)
  201. {
  202. unsigned char i=0;
  203. for (i=8; i>0; i--)
  204. {
  205.   DQ = 0;
  206.   DQ = dat&0x01;
  207.   delay(5);
  208.   DQ = 1;
  209.   dat>>=1;
  210. }
  211. delay(5);
  212. }
  213. //读取温度
  214. unsigned char ReadTemperature(void)
  215. {
  216. unsigned char a=0;
  217. unsigned char b=0;
  218. unsigned char t=0;

  219. Init_DS18B20();// 复位
  220. WriteOneChar(0xCC); // 跳过读序号列号的操作
  221. WriteOneChar(0x44); // 启动温度转换
  222. delay(100);
  223. Init_DS18B20();  //每次操作前都要进行复位
  224. WriteOneChar(0xCC); //跳过读序号列号的操作  
  225. WriteOneChar(0xBE); //读取温度寄存器等共可读9个寄存器 前两个就是温度
  226. a=ReadOneChar();
  227. b=ReadOneChar();
  228. s=(unsigned int)(a&0x0f);  
  229. b<<=4;//取高字节的第四位因为高四位为符号位1111为负0000为正
  230. b+=(a&0xf0)>>4;//忽略小数位取a的高四位与b的相加就是此时所测得到整数温度值
  231. t=b;
  232. return(t);//返回温度值给这个函数
  233. }

  234. //显示函数
  235. void printf()
  236. {
  237. BYTE i;
  238. delay2(10);
  239. lcd_pos(0x00);    // 设置显示位置为第一行的第5个字符
  240. i = 0;
  241. while(dis1[i] != '\0')
  242. {      
  243.   lcd_wdat(dis1[i]);
  244.   i++;
  245. }
  246. lcd_pos(0x40);   // 设置显示位置为第二行第二个字符
  247. i = 0;
  248. while(dis2[i] != '\0')
  249. {
  250.   lcd_wdat(dis2[i]); // 显示字符
  251.   i++;
  252. }
  253. TempBuffer[0]=temp/10;  //十位
  254. TempBuffer[1]=temp%10;  //个位
  255. lcd_pos(0x0c);  
  256. lcd_wdat(dis3[TempBuffer[0]]); //测试温度十位
  257. lcd_pos(0x0d);  
  258. lcd_wdat(dis3[TempBuffer[1]]); //测试温度个位
  259. lcd_pos(0x0e);
  260. lcd_wdat(dis4[0]);  
  261. lcd_pos(0x0f);
  262. lcd_wdat(dis5[0]);

  263. TempBuffer[2]=set_temper/10;  //十位
  264. TempBuffer[3]=set_temper%10;  //个位
  265. lcd_pos(0x4c);  
  266. lcd_wdat(dis3[TempBuffer[2]]); //设置温度十位
  267. lcd_pos(0x4d);  
  268. lcd_wdat(dis3[TempBuffer[3]]); //设置温度个位
  269. lcd_pos(0x4e);
  270. lcd_wdat(dis4[0]);  
  271. lcd_pos(0x4f);
  272. lcd_wdat(dis5[0]);
  273. }

  274. //键盘输入函数
  275. void keyscan()
  276. {
  277.          if(key1==0)
  278.          {
  279.           delay(200);
  280.           if(key1==0)
  281.           {
  282.            set_temper++;
  283.           }
  284.          }
  285.          
  286.          if(key2==0)
  287.          {
  288.           delay(200);
  289.           if(key2==0)
  290.           {
  291.            set_temper--;
  292.           }
  293.          }


  294. //         //开始按键
  295. // if(key3==0)
  296. // {
  297. //          delay(300);
  298. //         if(key3==0)
  299. //         {
  300. //                        TR1=1;        
  301. //         }
  302. // }

  303. }

  304. //T1定时中断服务程序  
  305. void into(void) interrupt 3  
  306. {   

  307.     TH1=(65536-1000)/256;//初值重装
  308.     TL1=(65536-1000)%256;
  309. counter++;
  310.   if(counter>CIRCLE)  
  311. {
  312.   counter=0;////限定周期为T=100X0.01ms=10ms
  313. }  
  314. if(counter<=high_time)//取得查表参数以调节pwm的占空比
  315. pwm=1;//PWM高电平
  316. else   
  317. pwm=0;
  318. }


  319. //设定占空比函数
  320. void compare_temper()  
  321. {
  322. char shi=0,ge=0;
  323. if(set_temper>temp)  
  324. {  
  325. //当设置温度与实际温度大于10度时
  326.           if(set_temper-temp>=10)
  327.           {
  328.           //进入死循环
  329.                           while(1)
  330.                           {
  331.                            TR1=0;      //关闭定时器   从而关闭PWM波
  332.                            pwm=0;           //输出低电平
  333.                            temp=ReadTemperature();        //读取温度传感器的值
  334.                            shi=temp/10;                 //分离出十位
  335.                            ge=temp%10;                 //分离出个位
  336.                            lcd_pos(0x0c);         //设置显示位置
  337.                            lcd_wdat(0x30+shi);          //在指定位置显示十位
  338.                            lcd_pos(0x0d);                 //设置显示位置
  339.                            lcd_wdat(0x30+ge);            //在指定位置显示各位

  340.                            if(set_temper-temp<10)         //如果温度差值低于10度
  341.                                            {
  342.                                         TR1=1; //打开定时器  开pwm波
  343.                                            break;         //跳出循环
  344.                                         }
  345.                            }   
  346.                   }  
  347.                   else
  348.                   {
  349.                   //打开定时器
  350.                   TR1=1;
  351.                   //根据差值调整PWM波
  352.                    if (set_temper-temp==9)  
  353.                     high_time=10;
  354.                    if (set_temper-temp==8)  
  355.                     high_time=20;
  356.                    if (set_temper-temp==7)  
  357.                     high_time=30;
  358.                    if (set_temper-temp==6)  
  359.                     high_time=40;
  360.                    if (set_temper-temp==5)  
  361.                     high_time=50;
  362.                    if (set_temper-temp==4)  
  363.                     high_time=60;
  364.                    if (set_temper-temp==3)  
  365.                     high_time=70;
  366.                    if (set_temper-temp==2)  
  367.                     high_time=80;
  368.                    if (set_temper-temp==1)  
  369.                     high_time=90;
  370.                   }  
  371.         }  
  372. else if(set_temper<temp)
  373. {
  374. //关闭定时器
  375.    pwm=1;
  376.    TR1=0;  
  377. }   
  378. }
  379. main()
  380. {
  381. initial();// 初始化个变量及定时器的初值开中断等
  382. lcd_init();    // 初始化LCD  
  383. while(1)
  384. {
  385. //比较函数
  386.   compare_temper();
  387. //输出函数  
  388.   printf();
  389.   //读取温度函数
  390.   temp=ReadTemperature();
  391.   //键盘扫描函数
  392.   keyscan();      
  393. }
  394. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:739545 发表于 2021-6-15 13:54 | 只看该作者
到网上找一段驱动,仿真的驱动有好多种,针对不同的1602,然后根据代码寻找相同的LCD画进去就可以了,注意pin脚定义
回复

使用道具 举报

板凳
ID:844772 发表于 2021-6-15 14:59 | 只看该作者
真看了一下,也没看出问题啊,要不你主程序加句话: lcd_pos(0x01);   lcd_wdat('A'); 看看能否显示个A出来?
回复

使用道具 举报

地板
ID:480510 发表于 2021-6-15 15:03 | 只看该作者
晶振电容没接地。
回复

使用道具 举报

5#
ID:917567 发表于 2021-6-15 16:36 | 只看该作者
glinfei 发表于 2021-6-15 14:59
真看了一下,也没看出问题啊,要不你主程序加句话: lcd_pos(0x01);   lcd_wdat('A'); 看看能否显示个A出来 ...

请问在哪句后面加呀
回复

使用道具 举报

6#
ID:917567 发表于 2021-6-15 16:57 | 只看该作者
ByanouQ 发表于 2021-6-15 15:03
晶振电容没接地。

c1 c2 接地么
回复

使用道具 举报

7#
ID:480510 发表于 2021-6-15 17:23 | 只看该作者

好久没用proteus仿真了,需要接地吗?还是软件默认接地?
回复

使用道具 举报

8#
ID:321563 发表于 2021-6-15 17:27 | 只看该作者
没经验的是看不出来,老司机一眼就看出来了,问题在驱动程序,实物就没问题,仿真与实物有区别的.
回复

使用道具 举报

9#
ID:738987 发表于 2021-6-15 18:10 | 只看该作者
你需要一步一步的用排除法来检测。
回复

使用道具 举报

10#
ID:938151 发表于 2021-6-15 18:30 | 只看该作者
没接地
回复

使用道具 举报

11#
ID:917567 发表于 2021-6-15 21:39 | 只看该作者
subobo 发表于 2021-6-15 17:27
没经验的是看不出来,老司机一眼就看出来了,问题在驱动程序,实物就没问题,仿真与实物有区别的.

跪求指点
回复

使用道具 举报

12#
ID:342822 发表于 2021-6-15 22:28 | 只看该作者
lcd的VEE接地
回复

使用道具 举报

13#
ID:390416 发表于 2021-6-19 08:42 | 只看该作者
LCD1602显示℃ 这种自定义符号 http://www.51hei.com/bbs/dpj-200685-1.html
LCD1602液晶最新资料 说明了具体的时间要求 http://www.51hei.com/bbs/dpj-205768-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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