找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stc15单片机实现数字电压表问题 1602液晶显示一行白色方块

[复制链接]
跳转到指定楼层
楼主
300黑币
我用STC15F2K6S2芯片做简易电压表测量,但下载进去总是显示一条白行怎么回事啊?电路纯自己焊的P0口输出数据到LCD1602,p1.0,p1.1借FPC8591

单片机源程序如下:
  1. #include<STC15F2K60S2.h>   
  2. #include <intrins.h>

  3. #define  AddWr 0x90   
  4. #define Data  P0   


  5. unsigned char AD_CHANNEL;
  6. sbit scl=P1^0;      
  7. sbit sda=P1^1;      
  8. bit ack;                 

  9. sbit RS = P2^0;
  10. sbit RW = P2^1;
  11. sbit E  = P2^2;



  12. unsigned char TempData[8];
  13. unsigned char  FirstLine[16]="Voltage:        ";
  14. unsigned char  SecondLine[16] ="Current:        ";

  15. void Start_I2c()
  16. {
  17.   sda=1;         
  18.   _nop_();
  19.   scl=1;
  20.   _nop_();        
  21.   _nop_();
  22.   _nop_();
  23.   _nop_();
  24.   _nop_();   
  25.   sda=0;         
  26.   _nop_();        
  27.   _nop_();
  28.   _nop_();
  29.   _nop_();
  30.   _nop_();      
  31.   scl=0;      
  32.   _nop_();
  33.   _nop_();
  34. }


  35. void Stop_I2c()
  36. {
  37.   sda=0;      
  38.   _nop_();      
  39.   scl=1;      
  40.   _nop_();
  41.   _nop_();
  42.   _nop_();
  43.   _nop_();
  44.   _nop_();
  45.   sda=1;      
  46.   _nop_();
  47.   _nop_();
  48.   _nop_();
  49.   _nop_();
  50. }


  51. void  I2C_SendByte(unsigned char  c)
  52. {
  53. unsigned char  i;

  54. for(i=0;i<8;i++)  
  55.     {
  56.      if((c<<i)&0x80)sda=1;   
  57.        else  sda=0;               
  58.      _nop_();
  59.      scl=1;               
  60.       _nop_();
  61.       _nop_();            
  62.       _nop_();
  63.       _nop_();
  64.       _nop_();         
  65.      scl=0;
  66.     }

  67.     _nop_();
  68.     _nop_();
  69.     sda=1;               
  70.     _nop_();
  71.     _nop_();   
  72.     scl=1;
  73.     _nop_();
  74.     _nop_();
  75.     _nop_();
  76.     if(sda==1)ack=0;     
  77.        else ack=1;        
  78.     scl=0;
  79.     _nop_();
  80.     _nop_();
  81. }

  82.    
  83. unsigned char   I2C_RcvByte()
  84. {
  85.   unsigned char  retc=0,i;
  86.   sda=1;                     
  87.   for(i=0;i<8;i++)
  88.       {
  89.         _nop_();           
  90.         scl=0;                  
  91.         _nop_();
  92.         _nop_();                 
  93.         _nop_();
  94.         _nop_();
  95.         _nop_();
  96.         scl=1;                  
  97.         _nop_();
  98.         _nop_();
  99.         retc=retc<<1;
  100.         if(sda==1)retc=retc+1;  
  101.         _nop_();
  102.         _nop_();
  103.       }
  104.   scl=0;   
  105.   _nop_();
  106.   _nop_();
  107.   return(retc);
  108. }


  109. void Ack_I2c(bit a)
  110. {  
  111.   if(a==0)
  112.   {
  113.   sda=0;
  114.     _nop_();
  115.   _nop_();
  116.   _nop_();      
  117.   scl=1;
  118.   _nop_();
  119.   _nop_();                    
  120.   _nop_();
  121.   _nop_();
  122.   _nop_();  
  123.   scl=0;                     
  124.   _nop_();
  125.   _nop_();   
  126.   sda=1;
  127.     _nop_();
  128.   _nop_();   

  129.   }              
  130.   else
  131. {  sda=1;                                 
  132.   _nop_();
  133.   _nop_();
  134.   _nop_();      
  135.   scl=1;
  136.   _nop_();
  137.   _nop_();                    
  138.   _nop_();
  139.   _nop_();
  140.   _nop_();  
  141.   scl=0;                     
  142.   _nop_();
  143.   _nop_();
  144.   sda=0;
  145.       _nop_();
  146.   _nop_();   

  147.   }   
  148. }


  149. bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
  150. {
  151.    Start_I2c();              
  152.    I2C_SendByte(addr);            
  153.    if(ack==0)return(0);
  154.    I2C_SendByte(0x40|channel);              
  155.    if(ack==0)return(0);
  156.    Stop_I2c();               
  157.    return(1);
  158. }


  159. unsigned char PCF8591_RcvByte(unsigned char addr)
  160. {  
  161.    unsigned char dat;

  162.    Start_I2c();         
  163.    I2C_SendByte(addr+1);      
  164.    if(ack==0)return(0);
  165.    dat=I2C_RcvByte();         

  166.    Ack_I2c(1);           
  167.    Stop_I2c();           
  168.    return(dat);
  169. }




  170. void DelayUs(unsigned char us)
  171. {
  172. unsigned char uscnt;
  173. uscnt=us>>1;
  174. while(--uscnt);
  175. }

  176. void DelayMs(unsigned char ms)
  177. {
  178. while(--ms)
  179.    {
  180.      DelayUs(250);
  181.      DelayUs(250);
  182.          DelayUs(250);
  183.          DelayUs(250);
  184.    }
  185. }
  186. void WriteCommand(unsigned char c)
  187. {
  188. DelayMs(5);
  189. E=0;
  190. RS=0;
  191. RW=0;
  192. _nop_();
  193. E=1;
  194. Data=c;
  195. E=0;
  196. }

  197. void WriteData(unsigned char c)
  198. {
  199. DelayMs(5);   
  200. E=0;
  201. RS=1;
  202. RW=0;
  203. _nop_();
  204. E=1;
  205. Data=c;
  206. E=0;
  207. RS=0;
  208. }

  209. void ShowChar(unsigned char pos,unsigned char c)
  210. {
  211. unsigned char p;
  212. if (pos>=0x10)
  213.     p=pos+0xb0;
  214. else
  215.     p=pos+0x80;
  216. WriteCommand (p);
  217. WriteData (c);   
  218. }

  219. void ShowString (unsigned char line,char *ptr)
  220. {
  221. unsigned char l,i;
  222. l=line<<4;
  223. for (i=0;i<16;i++)
  224.   ShowChar (l++,*(ptr+i));
  225. }

  226. void InitLcd()
  227. {
  228. DelayMs(15);
  229. WriteCommand(0x38);
  230. WriteCommand(0x38);
  231. WriteCommand(0x38);
  232. WriteCommand(0x06);
  233. WriteCommand(0x0c);
  234. WriteCommand(0x01);

  235. }


  236. /
  237. void disp(void)

  238. {
  239.    unsigned char i=0;
  240.    while(FirstLine[i]!=' ')
  241.    {
  242.            ShowString(0,FirstLine);
  243.         i++;
  244.    }


  245. FirstLine[8]= '0'+TempData[0];
  246. FirstLine[9]= '0'+TempData[1];
  247. FirstLine[10]='.';
  248. FirstLine[11]='0'+TempData[2];
  249. FirstLine[12]='0'+TempData[3];
  250. FirstLine[14]='V';

  251. ShowString(0,FirstLine);

  252.      while(SecondLine[i]!=' ')
  253.    {
  254.            ShowString(1,SecondLine);
  255.         i++;
  256.    }

  257. SecondLine[8]='0'+TempData[4];
  258. SecondLine[11]='0'+TempData[6];
  259. SecondLine[10]='.';
  260. SecondLine[14]='V';



  261. ShowString(1,SecondLine);

  262. }

  263. void mDelay(unsigned char j)
  264. {
  265.   unsigned int i;
  266.   for(;j>0;j--)
  267.      {
  268.           for(i=0;i<125;i++)
  269.              {;}
  270.           }
  271.   }

  272. main()
  273. {  
  274.          unsigned char ADtemp;               
  275.          InitLcd();
  276.      mDelay(20);
  277.         while(1)
  278.         {

  279.          
  280.         
  281.             switch(AD_CHANNEL)
  282.                 {
  283.                         case 0: PCF8591_SendByte(AddWr,1);
  284.                              ADtemp = PCF8591_RcvByte(AddWr);  
  285.                                  TempData[0]=(ADtemp*10/51)/10;            
  286.                                  TempData[1]=(ADtemp*10/51)%10;            
  287.                                  TempData[2]=((ADtemp*10)%51)/5;
  288.                                  TempData[3]=((ADtemp*10)%51)%5;
  289.                                                                                    
  290.                                  break;  
  291.                         
  292.                         case 1: PCF8591_SendByte(AddWr,0);
  293.                              ADtemp=PCF8591_RcvByte(AddWr);  
  294.                                  TempData[4]=ADtemp/51;
  295.                                    TempData[6]=(ADtemp%51)/5;
  296.                                  break;  
  297.                         
  298.                         
  299.                 }                        
  300.            if(++AD_CHANNEL>2) AD_CHANNEL=0;
  301.            disp();         
  302.    }
  303. }
复制代码

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

使用道具 举报

沙发
ID:123289 发表于 2019-7-17 11:05 | 只看该作者
自己先写个显示的程序,将LCD调通。
回复

使用道具 举报

板凳
ID:579621 发表于 2019-7-17 12:54 | 只看该作者
已经调试好用了,谢谢
回复

使用道具 举报

地板
ID:307020 发表于 2019-7-23 12:38 | 只看该作者
其实到此时刻,对LCD1602来说基本是程序已经走通了,接下来要作的就是调整对比度电位器旋钮,一直从屏幕上什么都看不出来到你程序确定的显示位置出现方块,此为调整对比度的可能范围。对比度调整合适了,方块自然就成了文字了。
回复

使用道具 举报

5#
ID:542954 发表于 2019-8-11 20:09 | 只看该作者
可能有几个问题,在接受数据的时候rw端需要拉低,你可以试试单纯的把rw接地,看一看是否有值,如果你行检查你的供电电压是否为这个lcd的工作电压
回复

使用道具 举报

6#
ID:662776 发表于 2019-12-12 20:43 | 只看该作者
楼主,可以把改好以后的程序发出来看看吗
回复

使用道具 举报

7#
ID:662776 发表于 2019-12-12 20:47 | 只看该作者
楼主,可以把改好的程序发出来看看吗
回复

使用道具 举报

8#
ID:661917 发表于 2019-12-12 22:09 | 只看该作者
主要是电阻调对比度,电阻大小要合适
回复

使用道具 举报

9#
ID:416239 发表于 2019-12-13 15:02 | 只看该作者
能否发一下程序看看,或者说一下错误之处
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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