108-PCF8591 1路AD 1602显示

来源:互联网 发布:得力考勤机导出数据 编辑:程序博客网 时间:2024/05/21 14:46
  1. /*----------------------------------------------- 
  2.   名称:IIC协议 PCF8591 AD/DA转换 
  3.   论坛:www.doflye.net 
  4.   编写:shifang 
  5.   修改:无 
  6.   内容:使用4路AD中的1路检测外部模拟量输入 
  7. ------------------------------------------------*/    
  8. #include <reg52.h>                  
  9. #include "i2c.h"  
  10. #include "delay.h"  
  11. #include "display.h"  
  12. #include "1602.h"  
  13.   
  14. #define AddWr 0x90   //写数据地址   
  15. #define AddRd 0x91   //读数据地址  
  16.   
  17. extern bit ack;  
  18. unsigned char ReadADC(unsigned char Chl);  
  19. bit WriteDAC(unsigned char dat);  
  20. /*------------------------------------------------ 
  21.               主程序 
  22. ------------------------------------------------*/  
  23. main()  
  24. {  
  25.  unsigned int num=0;  
  26.  Init_Timer0();  
  27.  LCD_Init();   
  28. LCD_Clear();  
  29.   
  30. while (1)         //主循环  
  31.   {  
  32.     
  33.  num=ReadADC(0)*100/51;  
  34.  /*TempData[0]=dofly_DuanMa[num/100]|0x80;     
  35.  TempData[1]=dofly_DuanMa[(num%100)/10]; 
  36.  TempData[2]=dofly_DuanMa[(num%100)%10];*/  
  37.  //主循环中添加其他需要一直工作的程序  
  38.     LCD_Write_String(0,0,"Voltage:");  
  39.   LCD_Write_Char(0,1,num/100+0x30);  
  40.   LCD_Write_Char(1,1,num%100/10+0x30);  
  41.   LCD_Write_Char(2,1,num%100%10+0x30);  
  42.   LCD_Write_Char(3,1,0+0x30);  
  43. LCD_Write_String(4,1,"mv");  
  44.  DelayMs(100);  
  45.   }  
  46. }  
  47. /*------------------------------------------------ 
  48.              读AD转值程序 
  49. 输入参数 Chl 表示需要转换的通道,范围从0-3 
  50. 返回值范围0-255 
  51. ------------------------------------------------*/  
  52. unsigned char ReadADC(unsigned char Chl)  
  53.  {  
  54.    unsigned char Val;  
  55.    Start_I2c();               //启动总线  
  56.    SendByte(AddWr);             //发送器件地址  
  57.      if(ack==0)return(0);  
  58.    SendByte(0x40|Chl);            //发送器件子地址  
  59.      if(ack==0)return(0);  
  60.    Start_I2c();  
  61.    SendByte(AddWr+1);  
  62.       if(ack==0)return(0);  
  63.    Val=RcvByte();  
  64.    NoAck_I2c();                 //发送非应位  
  65.    Stop_I2c();                  //结束总线  
  66.   return(Val);  
  67.  }  
  68. /*------------------------------------------------ 
  69.                写入DA转换数值 
  70. 输入参数:dat 表示需要转换的DA数值,范围是0-255 
  71. ------------------------------------------------*/  
  72. /*bit WriteDAC(unsigned char dat) 
  73. { 
  74.    Start_I2c();               //启动总线 
  75.    SendByte(AddWr);             //发送器件地址 
  76.      if(ack==0)return(0); 
  77.    SendByte(0x40);            //发送器件子地址 
  78.      if(ack==0)return(0); 
  79.    SendByte(dat);             //发送数据 
  80.      if(ack==0)return(0); 
  81.    Stop_I2c();   
  82. }*/  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //delay.c  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "delay.h"  
  2. /*------------------------------------------------ 
  3.  uS延时函数,含有输入参数 unsigned char t,无返回值 
  4.  unsigned char 是定义无符号字符变量,其值的范围是 
  5.  0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 
  6.  长度如下 T=tx2+5 uS  
  7. ------------------------------------------------*/  
  8. void DelayUs2x(unsigned char t)  
  9. {     
  10.  while(--t);  
  11. }  
  12. /*------------------------------------------------ 
  13.  mS延时函数,含有输入参数 unsigned char t,无返回值 
  14.  unsigned char 是定义无符号字符变量,其值的范围是 
  15.  0~255 这里使用晶振12M,精确延时请使用汇编 
  16. ------------------------------------------------*/  
  17. void DelayMs(unsigned char t)  
  18. {  
  19.        
  20.  while(t--)  
  21.  {  
  22.      //大致延时1mS  
  23.      DelayUs2x(245);  
  24. <span style="white-space:pre">  </span> DelayUs2x(245);  
  25.  }  
  26. }  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //display.c  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include"display.h"  
  2. #include"delay.h"  
  3. //#include "1602.h"  
  4.   
  5.   
  6. #define DataPort P1 //定义数据端口 程序中遇到DataPort 则用P0 替换  
  7. //sbit LATCH1=P2^0;//定义锁存使能端口 段锁存  
  8. //sbit LATCH2=P2^3;//                 位锁存  
  9.   
  10.   
  11. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9  
  12. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码  
  13. unsigned char TempData[8]; //存储显示值的全局变量  
  14.   
  15.   
  16.   
  17.   
  18. /*------------------------------------------------ 
  19.  显示函数,用于动态扫描数码管 
  20.  输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 
  21.  如输入0表示从第一个显示。 
  22.  Num表示需要显示的位数,如需要显示99两位数值则该值输入2 
  23. ------------------------------------------------*/  
  24. void Display(unsigned char FirstBit,unsigned char Num)  
  25. {  
  26.       static unsigned char i=0;  
  27. <span style="white-space:pre">  </span>    
  28.   
  29.   
  30. <span style="white-space:pre">  </span>   DataPort=0;   //清空数据,防止有交替重影  
  31.        LATCH1=1;     //段锁存  
  32.        LATCH1=0;  
  33.   
  34.   
  35.        DataPort=dofly_WeiMa[i+FirstBit]; //取位码   
  36.        LATCH2=1;     //位锁存  
  37.        LATCH2=0;  
  38.   
  39.   
  40.        DataPort=TempData[i]; //取显示数据,段码  
  41.        LATCH1=1;     //段锁存  
  42.        LATCH1=0;  
  43.          
  44. <span style="white-space:pre">  </span>   i++;  
  45.        if(i==Num)  
  46. <span style="white-space:pre">  </span>      i=0;  
  47.   
  48.   
  49.   
  50.   
  51. }  
  52. /*------------------------------------------------ 
  53.                     定时器初始化子程序 
  54. ------------------------------------------------*/  
  55. void Init_Timer0(void)  
  56. {  
  57.  TMOD |= 0x01;<span style="white-space:pre">   </span>  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响<span style="white-space:pre">       </span>       
  58.  //TH0=0x00;<span style="white-space:pre"> </span>      //给定初值  
  59.  //TL0=0x00;  
  60.  EA=1;            //总中断打开  
  61.  ET0=1;           //定时器中断打开  
  62.  TR0=1;           //定时器开关打开  
  63. }  
  64. /*------------------------------------------------ 
  65.                  定时器中断子程序 
  66. ------------------------------------------------*/  
  67. void Timer0_isr(void) interrupt 1   
  68. {  
  69.  TH0=(65536-2000)/256;<span style="white-space:pre">       </span>  //重新赋值 2ms  
  70.  TL0=(65536-2000)%256;  
  71.    
  72. // Display(0,8);  
  73.  //LCD_Write_Char(0,0,num/100+0x30);  
  74.   
  75.   
  76. }  
  77. //i2.c  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*----------------------------------------------- 
  2.   名称:IIC协议  
  3.   论坛:www.doflye.net 
  4.   编写:shifang 
  5.   修改:无 
  6.   内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 
  7. <span style="white-space:pre">      </span>周期,即晶振频率要小于12MHZ) 
  8. ------------------------------------------------*/    
  9.     
  10.                 
  11. #include "i2c.h"  
  12. #include "delay.h"  
  13.   
  14.   
  15. #define  _Nop()  _nop_()  //定义空指令  
  16.                            
  17. bit ack;<span style="white-space:pre">  </span>              //应答标志位  
  18.   
  19.   
  20. sbit SDA=P2^1;  
  21. sbit SCL=P2^0;  
  22.   
  23.   
  24. /*------------------------------------------------ 
  25.                     启动总线 
  26. ------------------------------------------------*/  
  27. void Start_I2c()  
  28. {  
  29.   SDA=1;   //发送起始条件的数据信号  
  30.   _Nop();  
  31.   SCL=1;  
  32.   _Nop();    //起始条件建立时间大于4.7us,延时  
  33.   _Nop();  
  34.   _Nop();  
  35.   _Nop();  
  36.   _Nop();      
  37.   SDA=0;     //发送起始信号  
  38.   _Nop();    //起始条件锁定时间大于4μ  
  39.   _Nop();  
  40.   _Nop();  
  41.   _Nop();  
  42.   _Nop();         
  43.   SCL=0;    //钳住I2C总线,准备发送或接收数据  
  44.   _Nop();  
  45.   _Nop();  
  46. }  
  47. /*------------------------------------------------ 
  48.                     结束总线 
  49. ------------------------------------------------*/  
  50. void Stop_I2c()  
  51. {  
  52.   SDA=0;    //发送结束条件的数据信号  
  53.   _Nop();   //发送结束条件的时钟信号  
  54.   SCL=1;    //结束条件建立时间大于4μ  
  55.   _Nop();  
  56.   _Nop();  
  57.   _Nop();  
  58.   _Nop();  
  59.   _Nop();  
  60.   SDA=1;    //发送I2C总线结束信号  
  61.   _Nop();  
  62.   _Nop();  
  63.   _Nop();  
  64.   _Nop();  
  65. }  
  66.   
  67.   
  68.   
  69.   
  70.   
  71.   
  72.   
  73.   
  74. /*---------------------------------------------------------------- 
  75.                  字节数据传送函数                
  76. 函数原型: void  SendByte(unsigned char c); 
  77. 功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 
  78.      此状态位进行操作.(不应答或非应答都使ack=0 假)      
  79.      发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 
  80. ------------------------------------------------------------------*/  
  81. void  SendByte(unsigned char c)  
  82. {  
  83.  unsigned char BitCnt;  
  84.    
  85.  for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位  
  86.     {  
  87.      if((c<<BitCnt)&0x80)SDA=1;   //判断发送位  
  88.        else  SDA=0;                  
  89.      _Nop();  
  90.      SCL=1;               //置时钟线为高,通知被控器开始接收数据位  
  91.       _Nop();   
  92.       _Nop();             //保证时钟高电平周期大于4μ  
  93.       _Nop();  
  94.       _Nop();  
  95.       _Nop();           
  96.      SCL=0;   
  97.     }  
  98.       
  99.     _Nop();  
  100.     _Nop();  
  101.     SDA=1;               //8位发送完后释放数据线,准备接收应答位  
  102.     _Nop();  
  103.     _Nop();     
  104.     SCL=1;  
  105.     _Nop();  
  106.     _Nop();  
  107.     _Nop();  
  108.     if(SDA==1)ack=0;       
  109.        else ack=1;        //判断是否接收到应答信号  
  110.     SCL=0;  
  111.     _Nop();  
  112.     _Nop();  
  113. }  
  114.   
  115.   
  116.   
  117.   
  118.   
  119.   
  120.   
  121.   
  122.   
  123.   
  124.   
  125.   
  126.   
  127.   
  128. /*---------------------------------------------------------------- 
  129.                  字节数据传送函数                
  130. 函数原型: unsigned char  RcvByte(); 
  131. 功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号), 
  132.      发完后请用应答函数。   
  133. ------------------------------------------------------------------*/<span style="white-space:pre">  </span>  
  134. unsigned char  RcvByte()  
  135. {  
  136.   unsigned char retc;  
  137.   unsigned char BitCnt;  
  138.     
  139.   retc=0;   
  140.   SDA=1;             //置数据线为输入方式  
  141.   for(BitCnt=0;BitCnt<8;BitCnt++)  
  142.       {  
  143.         _Nop();             
  144.         SCL=0;       //置时钟线为低,准备接收数据位  
  145.         _Nop();  
  146.         _Nop();      //时钟低电平周期大于4.7us  
  147.         _Nop();  
  148.         _Nop();  
  149.         _Nop();  
  150.         SCL=1;       //置时钟线为高使数据线上数据有效  
  151.         _Nop();  
  152.         _Nop();  
  153.         retc=retc<<1;  
  154.         if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中  
  155.         _Nop();  
  156.         _Nop();   
  157.       }  
  158.   SCL=0;      
  159.   _Nop();  
  160.   _Nop();  
  161.   return(retc);  
  162. }  
  163.   
  164.   
  165.   
  166.   
  167.   
  168.   
  169. /*---------------------------------------------------------------- 
  170.                      应答子函数 
  171. 原型:  void Ack_I2c(void); 
  172.   
  173. ----------------------------------------------------------------*/  
  174. /*void Ack_I2c(void) 
  175. { 
  176.    
  177.   SDA=0;      
  178.   _Nop(); 
  179.   _Nop(); 
  180.   _Nop();       
  181.   SCL=1; 
  182.   _Nop(); 
  183.   _Nop();              //时钟低电平周期大于4μ 
  184.   _Nop(); 
  185.   _Nop(); 
  186.   _Nop();   
  187.   SCL=0;               //清时钟线,钳住I2C总线以便继续接收 
  188.   _Nop(); 
  189.   _Nop();     
  190. }*/  
  191. /*---------------------------------------------------------------- 
  192.                      非应答子函数 
  193. 原型:  void NoAck_I2c(void); 
  194.   
  195. ----------------------------------------------------------------*/  
  196. void NoAck_I2c(void)  
  197. {  
  198.     
  199.   SDA=1;  
  200.   _Nop();  
  201.   _Nop();  
  202.   _Nop();        
  203.   SCL=1;  
  204.   _Nop();  
  205.   _Nop();              //时钟低电平周期大于4μ  
  206.   _Nop();  
  207.   _Nop();  
  208.   _Nop();    
  209.   SCL=0;                //清时钟线,钳住I2C总线以便继续接收  
  210.   _Nop();  
  211.   _Nop();      
  212. }  
  213.   
  214.   
  215.   
  216.   
  217.   
  218.   
  219.   
  220.   
  221.   
  222.   
  223.   
  224.   
  225. /*---------------------------------------------------------------- 
  226.                     向无子地址器件发送字节数据函数                
  227. 函数原型: bit  ISendByte(unsigned char sla,ucahr c);   
  228. 功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla. 
  229.            如果返回1表示操作成功,否则操作有误。 
  230. 注意:    使用前必须已结束总线。 
  231. ----------------------------------------------------------------*/  
  232. /*bit ISendByte(unsigned char sla,unsigned char c) 
  233. { 
  234.    Start_I2c();               //启动总线 
  235.    SendByte(sla);             //发送器件地址 
  236.      if(ack==0)return(0); 
  237.    SendByte(c);               //发送数据 
  238.      if(ack==0)return(0); 
  239.   Stop_I2c();                 //结束总线 
  240.   return(1); 
  241. } 
  242. */  
  243.   
  244.   
  245. /*---------------------------------------------------------------- 
  246.                     向有子地址器件发送多字节数据函数                
  247. 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);   
  248. 功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 
  249.           地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 
  250.            如果返回1表示操作成功,否则操作有误。 
  251. 注意:    使用前必须已结束总线。 
  252. ----------------------------------------------------------------*/  
  253. /*bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) 
  254. { 
  255.    unsigned char i; 
  256.  for(i=0;i<no;i++) 
  257.     {  
  258.    Start_I2c();               //启动总线 
  259.    SendByte(sla);             //发送器件地址 
  260.      if(ack==0)return(0); 
  261.    SendByte(suba);            //发送器件子地址 
  262.      if(ack==0)return(0);  
  263.   
  264.      SendByte(*s);            //发送数据 
  265.        if(ack==0)return(0); 
  266.      Stop_I2c();                  //结束总线 
  267. <span style="white-space:pre">  </span> DelayMs(1);               //必须延时等待芯片内部自动处理数据完毕 
  268. <span style="white-space:pre">  </span> s++; 
  269. <span style="white-space:pre">  </span> suba++; 
  270.     }  
  271.   return(1); 
  272. } 
  273. */  
  274. /*---------------------------------------------------------------- 
  275.                     向无子地址器件读字节数据函数                
  276. 函数原型: bit  IRcvByte(unsigned char sla,ucahr *c);   
  277. 功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地 
  278.           址sla,返回值在c. 
  279.            如果返回1表示操作成功,否则操作有误。 
  280. 注意:    使用前必须已结束总线。 
  281. ----------------------------------------------------------------*/  
  282. /*bit IRcvByte(unsigned char sla,unsigned char *c) 
  283. { 
  284.    Start_I2c();                //启动总线 
  285.    SendByte(sla+1);            //发送器件地址 
  286.      if(ack==0)return(0); 
  287.    *c=RcvByte();               //读取数据 
  288.      NoAck_I2c();              //发送非就答位 
  289.      Stop_I2c();               //结束总线 
  290.   return(1); 
  291. } 
  292.  
  293.  
  294. */  
  295. /*---------------------------------------------------------------- 
  296.                     向有子地址器件读取多字节数据函数                
  297. 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);   
  298. 功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件 
  299.           地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。 
  300.            如果返回1表示操作成功,否则操作有误。 
  301. 注意:    使用前必须已结束总线。 
  302. ----------------------------------------------------------------*/  
  303. /*bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) 
  304. { 
  305.    unsigned char i; 
  306.  
  307.  
  308.    Start_I2c();               //启动总线 
  309.    SendByte(sla);             //发送器件地址 
  310.      if(ack==0)return(0); 
  311.    SendByte(suba);            //发送器件子地址 
  312.      if(ack==0)return(0); 
  313.  
  314.  
  315.    Start_I2c(); 
  316.    SendByte(sla+1); 
  317.       if(ack==0)return(0); 
  318.  
  319.  
  320.   for(i=0;i<no-1;i++) 
  321.     {  
  322.      *s=RcvByte();              //发送数据 
  323.       Ack_I2c();                //发送就答位  
  324.      s++; 
  325.     }  
  326.    *s=RcvByte(); 
  327.     NoAck_I2c();                 //发送非应位 
  328.     Stop_I2c();                    //结束总线 
  329.   return(1); 
  330. } 
  331. */  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.   
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //1602.c  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*----------------------------------------------- 
  2.   名称:LCD1602 
  3.   论坛:www.doflye.net 
  4.   编写:shifang 
  5.   日期:2009.5 
  6.   修改:无 
  7.   内容: 
  8.   引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK 
  9. ------------------------------------------------*/  
  10. #include "1602.h"  
  11. #include "delay.h"  
  12.   
  13.   
  14. sbit RS = P2^4;   //定义端口   
  15. sbit RW = P2^5;  
  16. sbit EN = P2^6;  
  17.   
  18.   
  19. #define RS_CLR RS=0   
  20. #define RS_SET RS=1  
  21.   
  22.   
  23. #define RW_CLR RW=0   
  24. #define RW_SET RW=1   
  25.   
  26.   
  27. #define EN_CLR EN=0  
  28. #define EN_SET EN=1  
  29.   
  30.   
  31. #define DataPort P0  
  32.   
  33.   
  34. /*------------------------------------------------ 
  35.               判忙函数 
  36. ------------------------------------------------*/  
  37.  bit LCD_Check_Busy(void)   
  38.  {   
  39.  DataPort= 0xFF;   
  40.  RS_CLR;   
  41.  RW_SET;   
  42.  EN_CLR;   
  43.  _nop_();   
  44.  EN_SET;  
  45.  return (bit)(DataPort & 0x80);  
  46.  }  
  47. /*------------------------------------------------ 
  48.               写入命令函数 
  49. ------------------------------------------------*/  
  50.  void LCD_Write_Com(unsigned char com)   
  51.  {    
  52. // while(LCD_Check_Busy()); //忙则等待  
  53.  DelayMs(5);  
  54.  RS_CLR;   
  55.  RW_CLR;   
  56.  EN_SET;   
  57.  DataPort= com;   
  58.  _nop_();   
  59.  EN_CLR;  
  60.  }  
  61. /*------------------------------------------------ 
  62.               写入数据函数 
  63. ------------------------------------------------*/  
  64.  void LCD_Write_Data(unsigned char Data)   
  65.  {   
  66.  //while(LCD_Check_Busy()); //忙则等待  
  67.  DelayMs(5);  
  68.  RS_SET;   
  69.  RW_CLR;   
  70.  EN_SET;   
  71.  DataPort= Data;   
  72.  _nop_();  
  73.  EN_CLR;  
  74.  }  
  75.   
  76.   
  77. /*------------------------------------------------ 
  78.                 清屏函数 
  79. ------------------------------------------------*/  
  80.  void LCD_Clear(void)   
  81.  {   
  82.  LCD_Write_Com(0x01);   
  83.  DelayMs(5);  
  84.  }  
  85. /*------------------------------------------------ 
  86.               写入字符串函数 
  87. ------------------------------------------------*/  
  88.  void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)   
  89.  {       
  90.  if (y == 0)   
  91.  <span style="white-space:pre">    </span>{       
  92. <span style="white-space:pre">  </span> LCD_Write_Com(0x80 + x);     //表示第一行  
  93.  <span style="white-space:pre">    </span>}  
  94.  else   
  95.  <span style="white-space:pre">    </span>{        
  96.  <span style="white-space:pre">    </span>LCD_Write_Com(0xC0 + x);      //表示第二行  
  97.  <span style="white-space:pre">    </span>}          
  98.  while (*s)   
  99.  <span style="white-space:pre">    </span>{       
  100.  LCD_Write_Data( *s);       
  101.  s ++;       
  102.  <span style="white-space:pre">    </span>}  
  103.  }  
  104. /*------------------------------------------------ 
  105.               写入字符函数 
  106. ------------------------------------------------*/  
  107.  void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)   
  108.  {       
  109.  if (y == 0)   
  110.  <span style="white-space:pre">    </span>{       
  111.  <span style="white-space:pre">    </span>LCD_Write_Com(0x80 + x);       
  112.  <span style="white-space:pre">    </span>}      
  113.  else   
  114.  <span style="white-space:pre">    </span>{       
  115.  <span style="white-space:pre">    </span>LCD_Write_Com(0xC0 + x);       
  116.  <span style="white-space:pre">    </span>}          
  117.  LCD_Write_Data( Data);    
  118.  }  
  119. /*------------------------------------------------ 
  120.               初始化函数 
  121. ------------------------------------------------*/  
  122.  void LCD_Init(void)   
  123.  {  
  124.    LCD_Write_Com(0x38);    /*显示模式设置*/   
  125.    DelayMs(5);   
  126.    LCD_Write_Com(0x38);   
  127.    DelayMs(5);   
  128.    LCD_Write_Com(0x38);   
  129.    DelayMs(5);   
  130.    LCD_Write_Com(0x38);    
  131.    LCD_Write_Com(0x08);    /*显示关闭*/   
  132.    LCD_Write_Com(0x01);    /*显示清屏*/   
  133.    LCD_Write_Com(0x06);    /*显示光标移动设置*/   
  134.    DelayMs(5);   
  135.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/  
  136.    }  
  137. /*------------------------------------------------    
  138. 设定二个自定义字符,LCD1602中自定义字符的地址为0x00--0x07, 
  139. 即可定义8个字符 
  140. 这里我们设定把一个自定义字符放在0x00位置(000), 
  141. 另一个放在0x01位子(001) 
  142. ------------------------------------------------*/  
  143. void Lcd_User_Chr(void)  
  144. //第一个自定义字符  
  145.  LCD_Write_Com(0x40); //"01 000 000"  第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))  
  146.  LCD_Write_Data(0x00); //"XXX 11111" 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)  
  147.  LCD_Write_Com(0x41); //"01 000 001"  第2行地址  
  148.  LCD_Write_Data(0x04); //"XXX 10001" 第2行数据  
  149.  LCD_Write_Com(0x42); //"01 000 010"  第3行地址  
  150.  LCD_Write_Data(0x0e); //"XXX 10101" 第3行数据  
  151.  LCD_Write_Com(0x43); //"01 000 011"  第4行地址  
  152.  LCD_Write_Data(0x0e); //"XXX 10001" 第4行数据  
  153.  LCD_Write_Com(0x44); //"01 000 100"  第5行地址  
  154.  LCD_Write_Data(0x0e); //"XXX 11111" 第5行数据  
  155.  LCD_Write_Com(0x45); //"01 000 101"  第6行地址  
  156.  LCD_Write_Data(0x1f); //"XXX 01010" 第6行数据  
  157.  LCD_Write_Com(0x46); //"01 000 110"  第7行地址  
  158.  LCD_Write_Data(0x04); //"XXX 11111" 第7行数据  
  159.  LCD_Write_Com(0x47); //"01 000 111"  第8行地址  
  160.    LCD_Write_Data(0x00); //"XXX 00000" 第8行数据   
  161.  //第二个自定义字符  
  162.   
  163.   
  164.  LCD_Write_Com(0x48); //"01 001 000"  第1行地址    
  165.  LCD_Write_Data(0x03); //"XXX 00001" 第1行数据   
  166.  LCD_Write_Com(0x49); //"01 001 001"  第2行地址  
  167.  LCD_Write_Data(0x03); //"XXX 11011" 第2行数据  
  168.  LCD_Write_Com(0x4a); //"01 001 010"  第3行地址  
  169.  LCD_Write_Data(0x00); //"XXX 11101" 第3行数据  
  170.  LCD_Write_Com(0x4b); //"01 001 011"  第4行地址  
  171.  LCD_Write_Data(0x00); //"XXX 11001" 第4行数据  
  172.  LCD_Write_Com(0x4c); //"01 001 100"  第5行地址  
  173.  LCD_Write_Data(0x00); //"XXX 11101" 第5行数据  
  174.  LCD_Write_Com(0x4d); //"01 001 101"  第6行地址  
  175.  LCD_Write_Data(0x00); //"XXX 11011" 第6行数据  
  176.  LCD_Write_Com(0x4e); //"01 001 110"  第7行地址  
  177.  LCD_Write_Data(0x00); //"XXX 00001" 第7行数据  
  178.  LCD_Write_Com(0x4f); //"01 001 111"  第8行地址  
  179.  LCD_Write_Data(0x00); //"XXX 00000" 第8行数据   
  180.  }  

0 0
原创粉丝点击