⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.lst

📁 PIC单片机驱动1602液晶屏的C程序。
💻 LST
字号:
     1: /*********************************************************************

     2:  *

     3:  *                           LCD1602.C

     4:  *

     5:  *********************************************************************

     6:  * 文件名: LCD1602.C

     7:  * 描述: 2*16液晶模块驱动程序,应用时只需要根据硬件连接方式作适当修改,在主程序中包含其头文件即可以用几个简单的函数实现功能,实现了简化编程

     8:  * 公司: 爱晶电子

     9:  *

    10:  * 作者                         日期                            注释

    11:  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    12:  * 王伟民                                       08/04/01                                原始文件

    13:  ********************************************************************/

    14: 

    15: /*函数实现*/

    16: #include <pic16f877A.h>

    17: #include <pic.h>

    18: #include  "lcd1602.h"

    19: const rom char cgtab[64]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,

    20:                                         0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,

    21:                                         0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,

    22:                                         0x11,0x0a,0x04,0x1f,0x04,0x1f,0x04,0x00,

    23:                                         0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,

    24:                                         0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,

    25:                                         0x04,0x0a,0x15,0x04,0x04,0x04,0x04,0x00,

    26:                                         0x01,0x03,0x1d,0x15,0x1d,0x03,0x01,0x00}; /*年、月、日、¥、元、℃、↑、小喇叭图标*/

    27:                                         

    28: 

    29:                 

    30: /*产生一个LCD模块的使能脉冲*/

    31: /*该函数只在本文件内使用,不会被其他文件调用,因此放在本文件的最前面,不在H文件中声明了*/

    32: void LCD_E_toggle(void)

    33: {

    34:         LCD_EN=0;

    35:         Nop();

    36:         LCD_EN=1;

    37:         Nop();

    38: }

    39: 

    40: void LCD_init(void)

    41: {

    42:         ADCON1=0x0F;/*所有引脚均设置为数字IO脚*/

    43:         Delay10Ms(10);/*延时100ms*/

    44:         TRIS_LCD_RW=0;/*设置单片机LCD控制引脚全为输出*/

    45:         TRIS_LCD_RS=0;

    46:         TRIS_LCD_EN=0;

    47:         LCD_wrcmd(LCD_MODE_STD);/*LCD标准工作模式:8位数据传送,2行显示,字符点阵5*7*/

    48:         LCD_wrcmd(DISP_OFF);/*显示关闭*/

    49:         LCD_wrcmd(DISP_CLR);/*清屏*/ 

    50:     /*清屏和光标归位需要较长的时间*/

    51:         LCD_wrcmd(CUR_AUTO_R);/*设置光标在文字插入后自动右移*/

    52:         LCD_wrcmd(DISP_ON       & CUR_OFF & BLINK_OFF);/*显示开,无光标, 光标不闪烁*/

    53:         //LCD_wrcmd(DISP_ON     & CUR_ON & BLINK_ON);/*显示开,光标, 光标闪烁*/

    54:         CG_Write();/*建立自定义字符块*/

    55: }

    56: 

    57: //void LCD_wrcmd(Uchar cmd)/*写入控制命令*/

    58: void LCD_wrcmd(Uchar cmd)/*写入控制命令*/

    59: {

    60:    Nop();/****/

    61:    wait_until_LCDready();

    62:    Nop();/****/

    63:    TRIS_LCD_DATA=0x00;  /*单片机的LCD数据口设置为全输出*/

    64:    Nop();/****/

    65:    LCD_EN=0;

    66:    Nop();/****/

    67:    LCD_RS=0;

    68:    Nop();/****/

    69:    LCD_RW=0;

    70:    Nop();/****/

    71:    LCD_DATA=cmd;

    72:    Nop();/****/

    73:    LCD_EN=1;

    74:    Nop();/****/

    75:    Nop();

    76:    LCD_EN=0;

    77:    Nop();/****/

    78: }

    79: 

    80: void LCD_wrchar(char str)/*写入要显示的字符*/

    81: {

    82:    Nop();/****/

    83:    wait_until_LCDready();

    84:    Nop();/****/

    85:    TRIS_LCD_DATA=0x00;  /*单片机的LCD数据口设置为全输出*/

    86:    Nop();/****/

    87:    LCD_EN=0;

    88:    Nop();/****/

    89:    LCD_RS=1;

    90:    Nop();/****/

    91:    LCD_RW=0;

    92:    Nop();/****/

    93:    LCD_DATA=str;

    94:    Nop();/****/

    95:    LCD_EN=1;

    96:    Nop();/****/

    97:    Nop();

    98:    LCD_EN=0;

    99:    Nop();/****/

   100: }

   101: 

   102: void LCD_setxy(char x,char y) /*设定显示位置,行x=1/2,列y=1~16的任意整数*/

   103: {

   104:         char temp;

   105:         if(x==1)

   106:         {

   107:                 temp=0x80+y-1;

   108:                 LCD_wrcmd(temp);

   109:         }

   110:         else

   111:         {

   112:                 temp=0xC0+y-1;

   113:                 LCD_wrcmd(temp);

   114:         }

   115: }

   116: 

   117: 

   118: void LCD_wrstr(const rom char *s)/*写入要显示的字符串*/

   119: {

   120:  for(;*s!='\0';s++)LCD_wrchar(*s);

   121: }

   122: 

   123: 

   124: void LCD_wrul(unsigned long num)/*写入要显示的无符号长整型数*/

   125: {

   126:         char str[11];/*无符号长整型数转换为字符串是10个,所以需要11个单元存储*/

   127:         int i=0;

   128:         int j=0;

   129:         ultoa(num,str);/*将无符号长整型数转换为字符串*/

   130:         LCD_wrcmd(CUR_AUTO_L);/*设置光标在文字插入后自动左移*/

   131:         while(str[i]!='\0')/*搜索字符串结束符*/

   132:                 {

   133:                 i++;    

   134:                 }

   135:         while(i>0)/*显示前面的有效数字*/

   136:                 {

   137:                 i--;

   138:                 LCD_wrchar(str[i]);

   139:                 j++;

   140:                 }

   141:         while(j<10)/*往前写满10位,也就是前面都写空格*/

   142:                 {

   143:                 LCD_wrchar(0x20);       

   144:                 j++;

   145:                 }

   146:         LCD_wrcmd(CUR_AUTO_R);/*设置光标在文字插入后自动右移*/

   147: }

   148: 

   149: 

   150: void LCD_wrlval(unsigned long num,unsigned char bits,unsigned char dp)/*写入要显示的长变量*/

   151: {

   152:         char str[11];/*无符号长整型数转换为字符串是10个,所以需要11个单元存储*/

   153:         int i=0;

   154:         int j=0;

   155:         ultoa(num,str);/*将无符号长整型数转换为字符串*/

   156:         LCD_wrcmd(CUR_AUTO_L);/*设置光标在文字插入后自动左移*/

   157:         while(str[i]!='\0')/*搜索字符串结束符*/

   158:                 {

   159:                 i++;    

   160:                 }

   161:         if (i>bits)/*要显示的数据比规定的显示位数多,数据显示溢出*/

   162:                 {

   163:                 while(j<bits)/*往前写满规定的位数,也就是前面都写空格,直到规定的位数*/

   164:                         {

   165:                         LCD_wrchar('-');        /*规定的位全部写-,表示数据溢出*/

   166:                         j++;

   167:                         if (j==dp) LCD_wrchar('.');/*插入小数点*/

   168:                         }

   169:                 }

   170:         else

   171:                 {

   172:                 while(i>0)/*显示前面的有效数字*/

   173:                         {

   174:                         i--;

   175:                         LCD_wrchar(str[i]);

   176:                         j++;

   177:                         if (j==dp) LCD_wrchar('.');/*插入小数点*/

   178:                         }

   179:                 while(j<bits)/*往前写满规定的位数,也就是前面都写空格,直到规定的位数*/

   180:                         {

   181:                         if (j==dp) LCD_wrchar('.');/*插入小数点*/

   182:                         if (j<=dp) LCD_wrchar('0');/*小数点前后补0字符*/        

   183:                         else LCD_wrchar(0x20);  /*小数点前后补空字符*/

   184:                         j++;

   185:                         }

   186:                 }

   187:         LCD_wrcmd(CUR_AUTO_R);/*设置光标在文字插入后自动右移*/

   188: }

   189: 

   190: 

   191: void wait_until_LCDready(void) /*检测忙标志,忙则等待*/

   192: {

   193:         LCD_EN=0;/*此句必须加,否则后面RS RW输出电平后,液晶屏出现光标复位的现象*/

   194:         LCD_RS=0;

   195:         TRIS_LCD_DATA=0x0ff;/*设置单片机LCD数据引脚全为输入*/

   196:         LCD_RW=1;

   197:         LCD_EN=1;/*读状态的时候,E始终保持高电平即可*/

   198:         Nop();

   199:         while(LCD_BUSY==1);/*LCD忙,则原地等待*/

   200:      LCD_EN=0;

   201: }

   202: 

   203: 

   204: 

   205: void CG_Write(void)/*建立自定义字符块*/

   206: {

   207:         int i;

   208:         LCD_wrcmd(SET_ADDR_CGRAM);/*字符发生器CGRAM地址设置*/

   209:         for(i=0;i<64;i++)

   210:                 {

   211:                 LCD_wrchar(cgtab[i]);

   212:                 };

   213: }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -