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

📄 untitled.lst

📁 基于PIC18F2580实现的 1602LCD显示程序 只用4个数据口
💻 LST
📖 第 1 页 / 共 2 页
字号:
     1: /*****************************************
     2:                      *
     3:                                  *
     4: * 时钟频率:内部8MHz                                             *
     5: * 设    计:方  勇                                               *
     6: * 修改日期:2008年08月20日                               *
     7: * 编译环境:maplab8.1                                    *
     8: * 实验环境:自制试验板                                   *
     9: * 使用端口:1602:PC0,PC2,PC4~PC7             *
    10: *****************************************/
    11: 
    12: #include        "pic18.h"
    13: #pragma romdata TABLE=0x1000
    14: const rom char table[240]={0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
    15:                            0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,             //"P",0~15
    16:                            0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
    17:                            0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,             //"I",16~31
    18:                                                0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, 
    19:                                                0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,         //"C",32~47
    20:                                                0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
    21:                            0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,             //"1",48~63
    22:                                            0x00,0x70,0x88,0x08,0x00,0x1C,0x22,0x21,             //"8"左,64~71
    23:                                            0x08,0x88,0x70,0x00,0x21,0x22,0x1C,0x00,             //"8"右,72~79 
    24:                                                0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
    25:                            0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,             //"F",80~95
    26:                                                0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
    27:                            0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,             //"4",96~111
    28:                                                0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 
    29:                            0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,             //"5",112~127
    30:                                                0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
    31:                            0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,             //"8",128~143
    32:                                                0x00,0x10,0x0C,0x04,0x4C,0xB4,0x94,0x05,
    33:                            0xF6,0x04,0x04,0x04,0x14,0x0C,0x04,0x00,
    34:                            0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0A,
    35:                            0x07,0x0A,0x12,0xE2,0x42,0x02,0x02,0x00,             //"实",144~175
    36:                                                0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x60,
    37:                            0x08,0x04,0x24,0x40,0x3F,0x22,0x2C,0x21,     //"验"左,176~191
    38:                                                0x58,0x46,0x48,0x50,0x20,0x20,0x20,0x00,
    39:                            0x21,0x2E,0x20,0x30,0x2C,0x23,0x20,0x00,     //"验"右,192~207
    40:                                                0x10,0x10,0xD0,0xFF,0x50,0x90,0x00,0xFE,
    41:                            0x62,0xA2,0x22,0x21,0xA1,0x61,0x00,0x00,
    42:                            0x04,0x03,0x00,0x7F,0x00,0x11,0x0E,0x41,
    43:                            0x20,0x11,0x0A,0x0E,0x31,0x60,0x20,0x00};//"板",208~239      
    44: #pragma romdata
    45: 
    46: void    initial()
    47: {
    48:         INTCON=0X00;            
    49:         WDTCON=0;
    50:         ADCON1=0X87;                            //设置所有与模拟输入共用的引脚为I/O方式
    51:         TRISE=TRISE&0XF8;                       //设置RE0,RE1,RE2为输出
    52:         TRISB=TRISB&0XFE;                       //设置RB0为输出
    53:     TRISA=TRISA&0XF7;                   //设置RA3为输出
    54: 
    55: }
    56: 
    57: 
    58: //读液晶显示器状态子程序,行参E代表液晶的边
    59: void    LCDSTA1(int     E)
    60: //int           E;
    61: {
    62:         int     E1FLAG;
    63:         TRISD=0XFF;                                     //设置D口为输入
    64:         while(1)
    65:         {
    66:                 if(E==1)
    67:                         {PORTA=PORTA|0X08;      //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
    68:                         PORTE=(PORTE|0X01)&0XF9;}
    69:                 else    
    70:                         {PORTA=PORTA&0XF7;      //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0     
    71:                         PORTE=(PORTE|0X05)&0XFD;}
    72:                 PORTB=PORTB|0X01;               //RB0/E=1
    73:                 E1FLAG=PORTD&0X80;
    74:                 PORTB=PORTB&0XFE;               //RB0/E=0
    75:                 if(E1FLAG==0X0000)break;
    76:         }
    77: }
    78: 
    79: //对液晶显示器发指令子程序,行参E代表处理的液晶的边
    80: void    TRANS1(int      TRANS,int       E)
    81: //int   TRANS,E;
    82: {
    83:         LCDSTA1(E);
    84:         TRISD=0X00;                     //RD为输出
    85:         if(E==1)                                //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=0     
    86:                 {PORTA=PORTA|0X08;
    87:                 PORTE=PORTE&0XF8;}
    88:         else                                    //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=0
    89:                 {PORTA=PORTA&0xF7;
    90:                 PORTE=(PORTE|0X04)&0XFC;}
    91:         PORTD=TRANS;
    92:         PORTB=PORTB|0X01;       //RB0/E=1
    93:         PORTB=PORTB&0XFE;       //RB0/E=0               
    94: }
    95: 
    96: //对液晶显示器写数据子程序
    97: void    WRITE1(char     WRITE,int       CLMADD,int      E)
    98: //int   WRITE,CLMADD,E;
    99: {
   100:         TRANS1(CLMADD,E);               //设置列地址
   101:         LCDSTA1(E);                             //查询液晶是否为空闲
   102:         TRISD=0X00;     //RD为输出
   103:         if(E==1)                                        //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=1     
   104:                 {PORTA=PORTA|0X08;
   105:                 PORTE=(PORTE|0X02)&0xFA;}
   106:         else                                            //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=1
   107:                 {PORTA=PORTA&0xF7;
   108:                 PORTE=(PORTE|0X06)&0xFE;}
   109:         PORTD=WRITE;
   110:         PORTB=PORTB|0X01;               //RB0/E=1
   111:         PORTB=PORTB&0XFE;               //RB0/E=0
   112: }
   113: 
   114: //开E边显示子程序
   115: void    DISP1(int       E)
   116: //int   E;
   117: {
   118:         int     E1FLAG;
   119:         while(1)
   120:         {
   121:                 TRANS1(0X03F,E);                //送出控制命令
   122:         LCDSTA1(E);                             //判断液晶是否为空闲状态
   123:                 TRISD=0XFF;                             //设置ED为输入
   124:                 if(E==1)                                        //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
   125:                         {PORTA=PORTA|0X08;
   126:                         PORTE=(PORTE|0X01)&0xF9;}
   127:                 else                                            //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
   128:                         {PORTA=PORTA&0xF7;
   129:                         PORTE=(PORTE|0X05)&0xFD;}
   130:         PORTB=PORTB|0X01;                       //RB0/E=1
   131:         E1FLAG=PORTD&0X20;
   132:         PORTB=PORTB&0XFE;                       //RB0/E=0
   133:         if(E1FLAG==0X00)break;                  //如果液晶被打开,则退出循环,否则继续打开
   134:         }
   135: }
   136: 
   137: //E边清屏子程序
   138: void    CLEAR1(int      E)
   139: //int   E;
   140: {
   141:         int PAGEADD,PAGENUM,CLMADD,CLMSUM;
   142:         for(PAGENUM=0X08,PAGEADD=0X0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
   143:         {
   144:                 TRANS1(PAGEADD,E);              //设置相应的页地址
   145:                  for(CLMSUM=0x40;CLMSUM<=0X7F;CLMSUM++)
   146:                         {
   147:                                 LCDSTA1(E);             //判断液晶空闲状态
   148:                                 WRITE1(0X00,CLMSUM,E);  //送0清屏
   149:                         }
   150:         }
   151: }
   152: 
   153: 
   154: //关E边显示子程序
   155: void    DISOFF1(int     E)
   156: //int   E;
   157: {
   158:         int E1FLAG;
   159:         while(1)
   160:         {
   161:                 TRANS1(0X3E,E);         //发送控制命令
   162:                 LCDSTA1(E);                     //判断液晶是否为空闲状态
   163:                 TRISD=0XFF;                     //设置RD为输入
   164:                 if(E==1)                                //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
   165:                         {PORTA=PORTA|0X08;
   166:                         PORTE=(PORTE|0X01)&0xF9;}
   167:                 else                                    //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
   168:                         {PORTA=PORTA&0xF7;
   169:                         PORTE=(PORTE|0X05)&0xFD;}
   170:         PORTB=PORTB|0X01;               //RB0/E=1
   171:         E1FLAG=PORTD&0X20;
   172:         PORTB=PORTB&0XFE;               //RB0/E=0
   173:         if(E1FLAG==0X20)break;          //如液晶关闭,则推出循环,否则继续关闭
   174:         }
   175: }
   176: 
   177: //LCD的E边初始化子程序
   178: void    LCD1INIT(int    E)
   179: {
   180:         DISOFF1(E);                     //关E区显示
   181:         /*TRANS1(0X0A4,E);  
   182:         TRANS1(0X0A9,E);    
   183:         TRANS1(0X0E2,E);   
   184:         TRANS1(0X0A0,E);*/ 
   185:         CLEAR1(E);                      //清屏
   186:     LCDSTA1(E);                 //判断液晶空闲状态

⌨️ 快捷键说明

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