找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1450|回复: 9
收起左侧

液晶模块模拟IO口,单片机编译的时候出现c213错误,有会的吗

[复制链接]
ID:726849 发表于 2020-12-22 20:06 | 显示全部楼层 |阅读模式
本帖最后由 zdcn 于 2020-12-22 20:41 编辑

#include<reg51.h>

#include<absacc.h>

#define uchar unsigned char

#define uint unsigned int

sbit LCD_RST=P1^0;

sbit DI=P1^5;

sbit RW=P1^4;

sbit CSL=P1^2;

sbit CSR=P1^1;

sbit EN=P1^3;

sbit RDY=P0^7;

sbit LCD=0x80;

#define LCD_DISPON  0x3f

#define LCD_STARTROW 0xc0

#define LCD_ADDRSTRY 0xb8

#define LCD_ADDRSTRX 0x40

#define CSL 0

#define CSR 1

void LCD_WrCmd(bit port, uchar cmd)
{
EN=0;
CSL=port;
DI=0;
RW=0;
EN=1;
LCD=cmd;
EN=0;

}



void LCD_WrDat(bit port, uchar wrdata)
{
EN=0;
CSR=port;
DI=1;
RW=0;
EN=1;
LCD=wrdata;
EN=0;

}



uchar code  ASCII_TAB[480] = //0X20~0X7F之间 ASCII码对应的点阵数据表

              { 0x00, 0x00, 0x00, 0x00, 0x00,

                            0x00, 0x00, 0x9e, 0x00, 0x00,

                0x00, 0x0e, 0x00, 0x0e, 0x00,

                0x28, 0xfe, 0x28, 0xfe, 0x28,

                0x48, 0x54, 0xfe, 0x54, 0x24,

                0x46, 0x26, 0x10, 0xc8, 0xc4,

                0x6c, 0x92, 0xaa, 0x44, 0xa0,

                0x00, 0x0a, 0x06, 0x00, 0x00,

                                 0x00, 0x38, 0x44, 0x82, 0x00,

                                 0x00, 0x82, 0x44, 0x38, 0x00,

                                 0x28, 0x10, 0x7c, 0x10, 0x28,

                                 0x10, 0x10, 0x7c, 0x10, 0x10,

                                 0x00, 0xa0, 0x60, 0x00, 0x00,

                                 0x10, 0x10, 0x10, 0x10, 0x10,

                                 0x00, 0xc0, 0xc0, 0x00, 0x00,

                                 0x40, 0x20, 0x10, 0x08, 0x04,



                        0x7C, 0xA2, 0x92, 0x8A, 0x7C,                        

                                0x00, 0x84, 0xFE, 0x80, 0x00,

                                0x84, 0xC2, 0xA2, 0x92, 0x8C,                        

                                0x42, 0x82, 0x8A, 0x96, 0x62,                        

                                0x30, 0x28, 0x24, 0xFE, 0x20,               

                                0x4E, 0x8A, 0x8A, 0x8A, 0x72,                        

                                0x78, 0x94, 0x92, 0x92, 0x60,                        

                                0x02, 0xE2, 0x12, 0x0A, 0x06,                        

                                0x6C, 0x92, 0x92, 0x92, 0x6C,                        

                                 0x0C, 0x92, 0x92, 0x52, 0x3C,                        

                                0x00, 0x6C, 0x6C, 0x00, 0x00,                        

                                0x00, 0xAC, 0x6C, 0x00, 0x00,                        

                                0x10, 0x28, 0x44, 0x82, 0x00,                        

                                0x28, 0x28, 0x28, 0x28, 0x28,                        

                                0x00, 0x82, 0x44, 0x28, 0x10,                        

                                0x04, 0x02, 0xA2, 0x12, 0x0C,



                        0x64, 0x92, 0xF2, 0x82, 0x7C,                        

                                0xFC, 0x22, 0x22, 0x22, 0xFC,                        

                                 0xFE, 0x92, 0x92, 0x92, 0x6C,                        

                                0x7C, 0x82, 0x82, 0x82, 0x44,                        

                                0xFE, 0x82, 0x82, 0x44, 0x38,               

                                0xFE, 0x92, 0x92, 0x92, 0x82,               

                                0xFE, 0x12, 0x12, 0x12, 0x02,                        

                                0x7C, 0x82, 0x92, 0x92, 0xF4,                        

                                0xFE, 0x10, 0x10, 0x10, 0xFE,               

                                0x00, 0x82, 0xFE, 0x82, 0x00,               

                                0x40, 0x80, 0x82, 0x7E, 0x02,                        

                                0xFE, 0x10, 0x28, 0x44, 0x82,                        

                                0xFE, 0x80, 0x80, 0x80, 0x80,               

                                0xFE, 0x04, 0x18, 0x04, 0xFE,                        

                                0xFE, 0x08, 0x10, 0x20, 0xFE,                        

                                0x7C, 0x82, 0x82, 0x82, 0x7C,



                        0xFE, 0x12, 0x12, 0x12, 0x0C,

                                0x7C, 0x82, 0xA2, 0x42, 0xBC,

                                0xFE, 0x12, 0x32, 0x52, 0x8C,                        

                                0x8C, 0x92, 0x92, 0x92, 0x62,                        

                                0x02, 0x02, 0xFE, 0x02, 0x02,        

                                0x7E, 0x80, 0x80, 0x80, 0x7E,

                                0x3E, 0x40, 0x80, 0x40, 0x3E,

                                0x7E, 0x80, 0x70, 0x80, 0x7E,

                                0xC6, 0x28, 0x10, 0x28, 0xC6,

                                0x0E, 0x10, 0xE0, 0x10, 0x0E,

                                0xC2, 0xA2, 0x92, 0x8A, 0x86,

                                0x00, 0xFE, 0x82, 0x82, 0x00,

                                0x04, 0x08, 0x10, 0x20, 0x40,

                                0x00, 0x82, 0x82, 0xFE, 0x00,

                                0x08, 0x04, 0x02, 0x04, 0x08,

                                0x80, 0x80, 0x80, 0x80, 0x80,



                        0x00, 0x02, 0x04, 0x08, 0x00,

                                0x40, 0xA8, 0xA8, 0xA8, 0xF0,

                                0xFE, 0x90, 0x88, 0x88, 0x70,

                                0x70, 0x88, 0x88, 0x88, 0x40,

                                0x70, 0x88, 0x88, 0x90, 0xFE,

                                0x70, 0xA8, 0xA8, 0xA8, 0x30,

                                0x10, 0xFC, 0x12, 0x02, 0x04,

                                0x18, 0xA4, 0xA4, 0xA4, 0x7C,

                                0xFE, 0x10, 0x08, 0x08, 0xF0,

                                0x00, 0x88, 0xFA, 0x80, 0x00,

                                0x40, 0x80, 0x88, 0x7A, 0x00,

                                0xFE, 0x20, 0x50, 0x88, 0x00,

                                0x00, 0x82, 0xFE, 0x80, 0x00,

                                0xF8, 0x08, 0x30, 0x08, 0xF8,

                                0xF8, 0x10, 0x08, 0x08, 0xF0,

                                0x70, 0x88, 0x88, 0x88, 0x70,



                        0xF8, 0x28, 0x28, 0x28, 0x10,

                                0x10, 0x28, 0x28, 0x30, 0xF8,

                                0xF8, 0x10, 0x08, 0x08, 0x10,

                                0x90, 0xA8, 0xA8, 0xA8, 0x40,

                                0x08, 0x7E, 0x88, 0x80, 0x40,

                                0x78, 0x80, 0x80, 0x40, 0xF8,

                                0x38, 0x40, 0x80, 0x40, 0x38,

                                0x78, 0x80, 0x60, 0x80, 0x78,

                                0x88, 0x50, 0x20, 0x50, 0x88,

                                0x18, 0xA0, 0xA0, 0xA0, 0x78,

                                0x88, 0xC8, 0xA8, 0x98, 0x88,

                                0x00, 0x10, 0x6C, 0x82, 0x00,

                                0x00, 0x00, 0xFE, 0x00, 0x00,

                                0x00, 0x82, 0x6C, 0x10, 0x00,

                                0x10, 0x10, 0x54, 0x38, 0x10,

                                0x10, 0x38, 0x54, 0x10, 0x10};



//以filldata充填液晶屏

void  LCD_DispFill(uchar filldata)

{  uchar  x, y;

   LCD_WrCmd(CSL,LCD_STARTROW+0);        //设置左半屏显示起始行为0

   LCD_WrCmd(CSR,LCD_STARTROW+0);        //设置右半屏显示起始行为0

   for( y=0;y<8;y++)           //循环充填8页

   {  LCD_WrCmd(CSL,LCD_ADDRSTRY+y);        // 设置左半屏页地址

      LCD_WrCmd(CSL,LCD_ADDRSTRX);            // 设置左半屏列地址

      LCD_WrCmd(CSR,LCD_ADDRSTRY+y);        // 设置右半屏页地址

      LCD_WrCmd(CSR,LCD_ADDRSTRX);                // 设置右半屏列地址



      for(x=0;x<64;x++)                  //充填每页的64个单元(列)

      {  LCD_WrDat(CSL,filldata);

         LCD_WrDat(CSR,filldata);



      }        

   }

}



//液晶模块初始化

void  LCD_DispIni(void)                        

{  uint  i;

   LCD_RST = 0;                                           // 复位驱动芯片

   for(i=0; i<500; i++);

   LCD_RST = 1;   

   LCD_WrCmd(CSL,LCD_DISPON);                 // 打开显示

   LCD_WrCmd(CSL,LCD_STARTROW);           // 设置显示起始行为0

   LCD_WrCmd(CSR,LCD_DISPON);        

   LCD_WrCmd(CSR,LCD_STARTROW);               

   LCD_DispFill(00);                        // 清屏

   LCD_WrCmd(CSL,LCD_ADDRSTRY+0);        // 设置页(字符行)地址

   LCD_WrCmd(CSL,LCD_ADDRSTRX+0);        // 设置列地址

   LCD_WrCmd(CSR,LCD_ADDRSTRY+0);

   LCD_WrCmd(CSR,LCD_ADDRSTRX+0);

}



//在液晶屏的cy(0-7)行、cx(0-15)列显示字符dispdata        

void LCD_DispChar(uchar cy, uchar cx, char dispdata)

{  uchar  code  *pch;

   uchar  i;

   bit port;

   cy = cy&0x07;                // 参数过滤

   cx = cx&0x0f;

   pch = &ASCII_TAB[(dispdata-0X20)*5];     //指向字符起始列的点阵码

   if((cx&0x08)==0)                // 列号cx<8,在左半屏显示

       {  port=CSL;

          i=cx<<3;

       }

   else

       {  port=CSR;

          i = (cx&0x07)<<3;

       }

   LCD_WrCmd(port,LCD_ADDRSTRX+i);        // 设置当前列地址

   LCD_WrCmd(port,LCD_ADDRSTRY+cy);        // 设置当前页地址

   for(i=0; i<5; i++);           //延时

   LCD_WrDat(port,0x00);                                // 显示一列空格

   for(i=0; i<5; i++)            //送出字符的5列点阵码

      { LCD_WrDat(port,*pch);               

        pch++;

      }

   LCD_WrDat(port,0x00);                   //显示一列空格

      for(i=0; i<5; i++);

   LCD_WrDat(port,0x00);        

}

                                                      

//在液晶屏的cy(0-7)行、cx(0-15)列显示字符disp_str        

void  LCD_DispStr(uchar cy, uchar cx, char *disp_str)

{  while( *disp_str !='\0')

   {  cy = cy&0x07;                        // 参数过滤

      cx = cx&0x0f;        

      LCD_DispChar(cy, cx, *disp_str);         // 显示字符

             disp_str++ ;                                // 指向下一字符数据

      cx++;

      if(cx>15) cy++;                    // 指向下一显示行

   }

}

#define uchar unsigned char
#define uint unsigned int
extern void LCD_DispIni(void);
extern void LCD_DispFill(uchar filldata);
extern void LCD_DispChar(uchar cy,uchar cx,char dispdata);
extern void LCD_DispStr(uchar cy,uchar cx,char *disp_str);

void  main(void)

{ while(1)

   {  LCD_DispIni();        // 初始化液晶模块

      LCD_DispStr (0,1,"void Stop()");

      LCD_DispStr (1,1,"{ SDA=0;");

      LCD_DispStr (2,1,"        SCL=1;");

      LCD_DispStr (3,1,"        delay5us();");

      LCD_DispStr (4,1,"        SDA=1;");

      LCD_DispStr (5,1,"        delay5us();");

      LCD_DispStr (6,1,"        SCL=0;");

      LCD_DispChar (7,1,'}');

      while(1);

   }

}

回复

使用道具 举报

ID:726849 发表于 2020-12-22 20:08 | 显示全部楼层
出错的是40和54行
回复

使用道具 举报

ID:726849 发表于 2020-12-22 20:36 | 显示全部楼层
后面按要求把CSL=port;改成了if(port)
{
CSR=1;
CSL=0;
}
else
{
CSR=0;
CSL=1;
}还是C213的错误
回复

使用道具 举报

ID:517466 发表于 2020-12-22 23:31 | 显示全部楼层
你的程序写的有点让人迷惑啊。是不是从别的地方拷贝过来的?
1、函数明明在这个程序中为什么要加extern说明?
2、#define CSL 0和sbit CSL=P1^2;同时存在,你到底想要声明CSL是什么?CSR也一样。
3、#define能否全部提到前面?
4、类似extern void LCD_DispIni(void);这样的函数声明是不是也放到前面?
改好的程序如下:

#include<reg51.h>

#include<absacc.h>

#define uchar unsigned char

#define uint unsigned int


#define LCD_DISPON  0x3f

#define LCD_STARTROW 0xc0

#define LCD_ADDRSTRY 0xb8

#define LCD_ADDRSTRX 0x40

//#define CSL 0
//#define CSR 1

void LCD_DispIni(void);
void LCD_DispFill(uchar filldata);
void LCD_DispChar(uchar cy,uchar cx,char dispdata);
void LCD_DispStr(uchar cy,uchar cx,char *disp_str);

sbit LCD_RST=P1^0;

sbit DI=P1^5;

sbit RW=P1^4;

sbit CSL=P1^2;

sbit CSR=P1^1;

sbit EN=P1^3;

sbit RDY=P0^7;

sbit LCD=0x80;



void LCD_WrCmd(bit port, uchar cmd)
{
EN=0;
CSL=port;
DI=0;
RW=0;
EN=1;
LCD=cmd;
EN=0;

}



void LCD_WrDat(bit port, uchar wrdata)
{
EN=0;
CSR=port;
DI=1;
RW=0;
EN=1;
LCD=wrdata;
EN=0;

}



uchar code  ASCII_TAB[480] = //0X20~0X7F之间 ASCII码对应的点阵数据表

              { 0x00, 0x00, 0x00, 0x00, 0x00,

                            0x00, 0x00, 0x9e, 0x00, 0x00,

                0x00, 0x0e, 0x00, 0x0e, 0x00,

                0x28, 0xfe, 0x28, 0xfe, 0x28,

                0x48, 0x54, 0xfe, 0x54, 0x24,

                0x46, 0x26, 0x10, 0xc8, 0xc4,

                0x6c, 0x92, 0xaa, 0x44, 0xa0,

                0x00, 0x0a, 0x06, 0x00, 0x00,

                                 0x00, 0x38, 0x44, 0x82, 0x00,

                                 0x00, 0x82, 0x44, 0x38, 0x00,

                                 0x28, 0x10, 0x7c, 0x10, 0x28,

                                 0x10, 0x10, 0x7c, 0x10, 0x10,

                                 0x00, 0xa0, 0x60, 0x00, 0x00,

                                 0x10, 0x10, 0x10, 0x10, 0x10,

                                 0x00, 0xc0, 0xc0, 0x00, 0x00,

                                 0x40, 0x20, 0x10, 0x08, 0x04,



                        0x7C, 0xA2, 0x92, 0x8A, 0x7C,                        

                                0x00, 0x84, 0xFE, 0x80, 0x00,

                                0x84, 0xC2, 0xA2, 0x92, 0x8C,                        

                                0x42, 0x82, 0x8A, 0x96, 0x62,                        

                                0x30, 0x28, 0x24, 0xFE, 0x20,               

                                0x4E, 0x8A, 0x8A, 0x8A, 0x72,                        

                                0x78, 0x94, 0x92, 0x92, 0x60,                        

                                0x02, 0xE2, 0x12, 0x0A, 0x06,                        

                                0x6C, 0x92, 0x92, 0x92, 0x6C,                        

                                 0x0C, 0x92, 0x92, 0x52, 0x3C,                        

                                0x00, 0x6C, 0x6C, 0x00, 0x00,                        

                                0x00, 0xAC, 0x6C, 0x00, 0x00,                        

                                0x10, 0x28, 0x44, 0x82, 0x00,                        

                                0x28, 0x28, 0x28, 0x28, 0x28,                        

                                0x00, 0x82, 0x44, 0x28, 0x10,                        

                                0x04, 0x02, 0xA2, 0x12, 0x0C,



                        0x64, 0x92, 0xF2, 0x82, 0x7C,                        

                                0xFC, 0x22, 0x22, 0x22, 0xFC,                        

                                 0xFE, 0x92, 0x92, 0x92, 0x6C,                        

                                0x7C, 0x82, 0x82, 0x82, 0x44,                        

                                0xFE, 0x82, 0x82, 0x44, 0x38,               

                                0xFE, 0x92, 0x92, 0x92, 0x82,               

                                0xFE, 0x12, 0x12, 0x12, 0x02,                        

                                0x7C, 0x82, 0x92, 0x92, 0xF4,                        

                                0xFE, 0x10, 0x10, 0x10, 0xFE,               

                                0x00, 0x82, 0xFE, 0x82, 0x00,               

                                0x40, 0x80, 0x82, 0x7E, 0x02,                        

                                0xFE, 0x10, 0x28, 0x44, 0x82,                        

                                0xFE, 0x80, 0x80, 0x80, 0x80,               

                                0xFE, 0x04, 0x18, 0x04, 0xFE,                        

                                0xFE, 0x08, 0x10, 0x20, 0xFE,                        

                                0x7C, 0x82, 0x82, 0x82, 0x7C,



                        0xFE, 0x12, 0x12, 0x12, 0x0C,

                                0x7C, 0x82, 0xA2, 0x42, 0xBC,

                                0xFE, 0x12, 0x32, 0x52, 0x8C,                        

                                0x8C, 0x92, 0x92, 0x92, 0x62,                        

                                0x02, 0x02, 0xFE, 0x02, 0x02,        

                                0x7E, 0x80, 0x80, 0x80, 0x7E,

                                0x3E, 0x40, 0x80, 0x40, 0x3E,

                                0x7E, 0x80, 0x70, 0x80, 0x7E,

                                0xC6, 0x28, 0x10, 0x28, 0xC6,

                                0x0E, 0x10, 0xE0, 0x10, 0x0E,

                                0xC2, 0xA2, 0x92, 0x8A, 0x86,

                                0x00, 0xFE, 0x82, 0x82, 0x00,

                                0x04, 0x08, 0x10, 0x20, 0x40,

                                0x00, 0x82, 0x82, 0xFE, 0x00,

                                0x08, 0x04, 0x02, 0x04, 0x08,

                                0x80, 0x80, 0x80, 0x80, 0x80,



                        0x00, 0x02, 0x04, 0x08, 0x00,

                                0x40, 0xA8, 0xA8, 0xA8, 0xF0,

                                0xFE, 0x90, 0x88, 0x88, 0x70,

                                0x70, 0x88, 0x88, 0x88, 0x40,

                                0x70, 0x88, 0x88, 0x90, 0xFE,

                                0x70, 0xA8, 0xA8, 0xA8, 0x30,

                                0x10, 0xFC, 0x12, 0x02, 0x04,

                                0x18, 0xA4, 0xA4, 0xA4, 0x7C,

                                0xFE, 0x10, 0x08, 0x08, 0xF0,

                                0x00, 0x88, 0xFA, 0x80, 0x00,

                                0x40, 0x80, 0x88, 0x7A, 0x00,

                                0xFE, 0x20, 0x50, 0x88, 0x00,

                                0x00, 0x82, 0xFE, 0x80, 0x00,

                                0xF8, 0x08, 0x30, 0x08, 0xF8,

                                0xF8, 0x10, 0x08, 0x08, 0xF0,

                                0x70, 0x88, 0x88, 0x88, 0x70,



                        0xF8, 0x28, 0x28, 0x28, 0x10,

                                0x10, 0x28, 0x28, 0x30, 0xF8,

                                0xF8, 0x10, 0x08, 0x08, 0x10,

                                0x90, 0xA8, 0xA8, 0xA8, 0x40,

                                0x08, 0x7E, 0x88, 0x80, 0x40,

                                0x78, 0x80, 0x80, 0x40, 0xF8,

                                0x38, 0x40, 0x80, 0x40, 0x38,

                                0x78, 0x80, 0x60, 0x80, 0x78,

                                0x88, 0x50, 0x20, 0x50, 0x88,

                                0x18, 0xA0, 0xA0, 0xA0, 0x78,

                                0x88, 0xC8, 0xA8, 0x98, 0x88,

                                0x00, 0x10, 0x6C, 0x82, 0x00,

                                0x00, 0x00, 0xFE, 0x00, 0x00,

                                0x00, 0x82, 0x6C, 0x10, 0x00,

                                0x10, 0x10, 0x54, 0x38, 0x10,

                                0x10, 0x38, 0x54, 0x10, 0x10};



//以filldata充填液晶屏

void  LCD_DispFill(uchar filldata)

{  uchar  x, y;

   LCD_WrCmd(CSL,LCD_STARTROW+0);        //设置左半屏显示起始行为0

   LCD_WrCmd(CSR,LCD_STARTROW+0);        //设置右半屏显示起始行为0

   for( y=0;y<8;y++)           //循环充填8页

   {  LCD_WrCmd(CSL,LCD_ADDRSTRY+y);        // 设置左半屏页地址

      LCD_WrCmd(CSL,LCD_ADDRSTRX);            // 设置左半屏列地址

      LCD_WrCmd(CSR,LCD_ADDRSTRY+y);        // 设置右半屏页地址

      LCD_WrCmd(CSR,LCD_ADDRSTRX);                // 设置右半屏列地址



      for(x=0;x<64;x++)                  //充填每页的64个单元(列)

      {  LCD_WrDat(CSL,filldata);

         LCD_WrDat(CSR,filldata);



      }        

   }

}



//液晶模块初始化

void  LCD_DispIni(void)                        

{  uint  i;

   LCD_RST = 0;                                           // 复位驱动芯片

   for(i=0; i<500; i++);

   LCD_RST = 1;   

   LCD_WrCmd(CSL,LCD_DISPON);                 // 打开显示

   LCD_WrCmd(CSL,LCD_STARTROW);           // 设置显示起始行为0

   LCD_WrCmd(CSR,LCD_DISPON);        

   LCD_WrCmd(CSR,LCD_STARTROW);               

   LCD_DispFill(00);                        // 清屏

   LCD_WrCmd(CSL,LCD_ADDRSTRY+0);        // 设置页(字符行)地址

   LCD_WrCmd(CSL,LCD_ADDRSTRX+0);        // 设置列地址

   LCD_WrCmd(CSR,LCD_ADDRSTRY+0);

   LCD_WrCmd(CSR,LCD_ADDRSTRX+0);

}



//在液晶屏的cy(0-7)行、cx(0-15)列显示字符dispdata        

void LCD_DispChar(uchar cy, uchar cx, char dispdata)

{  uchar  code  *pch;

   uchar  i;

   bit port;

   cy = cy&0x07;                // 参数过滤

   cx = cx&0x0f;

   pch = &ASCII_TAB[(dispdata-0X20)*5];     //指向字符起始列的点阵码

   if((cx&0x08)==0)                // 列号cx<8,在左半屏显示

       {  port=CSL;

          i=cx<<3;

       }

   else

       {  port=CSR;

          i = (cx&0x07)<<3;

       }

   LCD_WrCmd(port,LCD_ADDRSTRX+i);        // 设置当前列地址

   LCD_WrCmd(port,LCD_ADDRSTRY+cy);        // 设置当前页地址

   for(i=0; i<5; i++);           //延时

   LCD_WrDat(port,0x00);                                // 显示一列空格

   for(i=0; i<5; i++)            //送出字符的5列点阵码

      { LCD_WrDat(port,*pch);               

        pch++;

      }

   LCD_WrDat(port,0x00);                   //显示一列空格

      for(i=0; i<5; i++);

   LCD_WrDat(port,0x00);        

}

                                                      

//在液晶屏的cy(0-7)行、cx(0-15)列显示字符disp_str        

void  LCD_DispStr(uchar cy, uchar cx, char *disp_str)

{  while( *disp_str !='\0')

   {  cy = cy&0x07;                        // 参数过滤

      cx = cx&0x0f;        

      LCD_DispChar(cy, cx, *disp_str);         // 显示字符

             disp_str++ ;                                // 指向下一字符数据

      cx++;

      if(cx>15) cy++;                    // 指向下一显示行

   }

}



void  main(void)

{ while(1)

   {  LCD_DispIni();        // 初始化液晶模块

      LCD_DispStr (0,1,"void Stop()");

      LCD_DispStr (1,1,"{ SDA=0;");

      LCD_DispStr (2,1,"        SCL=1;");

      LCD_DispStr (3,1,"        delay5us();");

      LCD_DispStr (4,1,"        SDA=1;");

      LCD_DispStr (5,1,"        delay5us();");

      LCD_DispStr (6,1,"        SCL=0;");

      LCD_DispChar (7,1,'}');

      while(1);

   }

}
回复

使用道具 举报

ID:517466 发表于 2020-12-22 23:32 | 显示全部楼层
感觉你需要加强C语言的基本编程知识。
回复

使用道具 举报

ID:865960 发表于 2020-12-22 23:37 | 显示全部楼层
后面按要求把CSL=port;改成了if(port) { CSR=1; CSL=0; } else { CSR=0; CSL=1; }还是C213的错误
回复

使用道具 举报

ID:517466 发表于 2020-12-22 23:39 | 显示全部楼层
你的程序结构太乱。#define的函数声明位置不正常。CSL和CSR在程序中被重复使用,这个是主要原因。
#define CSL 0 和sbit CSL=P1^2;同时存在,程序能正常?CSR也一样。把#define CSL 0注释掉或者删除
extern没必要加的
代码给你修改了,编译没有问题。
#include<reg51.h>

#include<absacc.h>

#define uchar unsigned char

#define uint unsigned int


#define LCD_DISPON  0x3f

#define LCD_STARTROW 0xc0

#define LCD_ADDRSTRY 0xb8

#define LCD_ADDRSTRX 0x40

//#define CSL 0
//#define CSR 1

void LCD_DispIni(void);
void LCD_DispFill(uchar filldata);
void LCD_DispChar(uchar cy,uchar cx,char dispdata);
void LCD_DispStr(uchar cy,uchar cx,char *disp_str);

sbit LCD_RST=P1^0;

sbit DI=P1^5;

sbit RW=P1^4;

sbit CSL=P1^2;

sbit CSR=P1^1;

sbit EN=P1^3;

sbit RDY=P0^7;

sbit LCD=0x80;



void LCD_WrCmd(bit port, uchar cmd)
{
EN=0;
CSL=port;
DI=0;
RW=0;
EN=1;
LCD=cmd;
EN=0;

}



void LCD_WrDat(bit port, uchar wrdata)
{
EN=0;
CSR=port;
DI=1;
RW=0;
EN=1;
LCD=wrdata;
EN=0;

}



uchar code  ASCII_TAB[480] = //0X20~0X7F之间 ASCII码对应的点阵数据表

              { 0x00, 0x00, 0x00, 0x00, 0x00,

                            0x00, 0x00, 0x9e, 0x00, 0x00,

                0x00, 0x0e, 0x00, 0x0e, 0x00,

                0x28, 0xfe, 0x28, 0xfe, 0x28,

                0x48, 0x54, 0xfe, 0x54, 0x24,

                0x46, 0x26, 0x10, 0xc8, 0xc4,

                0x6c, 0x92, 0xaa, 0x44, 0xa0,

                0x00, 0x0a, 0x06, 0x00, 0x00,

                                 0x00, 0x38, 0x44, 0x82, 0x00,

                                 0x00, 0x82, 0x44, 0x38, 0x00,

                                 0x28, 0x10, 0x7c, 0x10, 0x28,

                                 0x10, 0x10, 0x7c, 0x10, 0x10,

                                 0x00, 0xa0, 0x60, 0x00, 0x00,

                                 0x10, 0x10, 0x10, 0x10, 0x10,

                                 0x00, 0xc0, 0xc0, 0x00, 0x00,

                                 0x40, 0x20, 0x10, 0x08, 0x04,



                        0x7C, 0xA2, 0x92, 0x8A, 0x7C,                        

                                0x00, 0x84, 0xFE, 0x80, 0x00,

                                0x84, 0xC2, 0xA2, 0x92, 0x8C,                        

                                0x42, 0x82, 0x8A, 0x96, 0x62,                        

                                0x30, 0x28, 0x24, 0xFE, 0x20,               

                                0x4E, 0x8A, 0x8A, 0x8A, 0x72,                        

                                0x78, 0x94, 0x92, 0x92, 0x60,                        

                                0x02, 0xE2, 0x12, 0x0A, 0x06,                        

                                0x6C, 0x92, 0x92, 0x92, 0x6C,                        

                                 0x0C, 0x92, 0x92, 0x52, 0x3C,                        

                                0x00, 0x6C, 0x6C, 0x00, 0x00,                        

                                0x00, 0xAC, 0x6C, 0x00, 0x00,                        

                                0x10, 0x28, 0x44, 0x82, 0x00,                        

                                0x28, 0x28, 0x28, 0x28, 0x28,                        

                                0x00, 0x82, 0x44, 0x28, 0x10,                        

                                0x04, 0x02, 0xA2, 0x12, 0x0C,



                        0x64, 0x92, 0xF2, 0x82, 0x7C,                        

                                0xFC, 0x22, 0x22, 0x22, 0xFC,                        

                                 0xFE, 0x92, 0x92, 0x92, 0x6C,                        

                                0x7C, 0x82, 0x82, 0x82, 0x44,                        

                                0xFE, 0x82, 0x82, 0x44, 0x38,               

                                0xFE, 0x92, 0x92, 0x92, 0x82,               

                                0xFE, 0x12, 0x12, 0x12, 0x02,                        

                                0x7C, 0x82, 0x92, 0x92, 0xF4,                        

                                0xFE, 0x10, 0x10, 0x10, 0xFE,               

                                0x00, 0x82, 0xFE, 0x82, 0x00,               

                                0x40, 0x80, 0x82, 0x7E, 0x02,                        

                                0xFE, 0x10, 0x28, 0x44, 0x82,                        

                                0xFE, 0x80, 0x80, 0x80, 0x80,               

                                0xFE, 0x04, 0x18, 0x04, 0xFE,                        

                                0xFE, 0x08, 0x10, 0x20, 0xFE,                        

                                0x7C, 0x82, 0x82, 0x82, 0x7C,



                        0xFE, 0x12, 0x12, 0x12, 0x0C,

                                0x7C, 0x82, 0xA2, 0x42, 0xBC,

                                0xFE, 0x12, 0x32, 0x52, 0x8C,                        

                                0x8C, 0x92, 0x92, 0x92, 0x62,                        

                                0x02, 0x02, 0xFE, 0x02, 0x02,        

                                0x7E, 0x80, 0x80, 0x80, 0x7E,

                                0x3E, 0x40, 0x80, 0x40, 0x3E,

                                0x7E, 0x80, 0x70, 0x80, 0x7E,

                                0xC6, 0x28, 0x10, 0x28, 0xC6,

                                0x0E, 0x10, 0xE0, 0x10, 0x0E,

                                0xC2, 0xA2, 0x92, 0x8A, 0x86,

                                0x00, 0xFE, 0x82, 0x82, 0x00,

                                0x04, 0x08, 0x10, 0x20, 0x40,

                                0x00, 0x82, 0x82, 0xFE, 0x00,

                                0x08, 0x04, 0x02, 0x04, 0x08,

                                0x80, 0x80, 0x80, 0x80, 0x80,



                        0x00, 0x02, 0x04, 0x08, 0x00,

                                0x40, 0xA8, 0xA8, 0xA8, 0xF0,

                                0xFE, 0x90, 0x88, 0x88, 0x70,

                                0x70, 0x88, 0x88, 0x88, 0x40,

                                0x70, 0x88, 0x88, 0x90, 0xFE,

                                0x70, 0xA8, 0xA8, 0xA8, 0x30,

                                0x10, 0xFC, 0x12, 0x02, 0x04,

                                0x18, 0xA4, 0xA4, 0xA4, 0x7C,

                                0xFE, 0x10, 0x08, 0x08, 0xF0,

                                0x00, 0x88, 0xFA, 0x80, 0x00,

                                0x40, 0x80, 0x88, 0x7A, 0x00,

                                0xFE, 0x20, 0x50, 0x88, 0x00,

                                0x00, 0x82, 0xFE, 0x80, 0x00,

                                0xF8, 0x08, 0x30, 0x08, 0xF8,

                                0xF8, 0x10, 0x08, 0x08, 0xF0,

                                0x70, 0x88, 0x88, 0x88, 0x70,



                        0xF8, 0x28, 0x28, 0x28, 0x10,

                                0x10, 0x28, 0x28, 0x30, 0xF8,

                                0xF8, 0x10, 0x08, 0x08, 0x10,

                                0x90, 0xA8, 0xA8, 0xA8, 0x40,

                                0x08, 0x7E, 0x88, 0x80, 0x40,

                                0x78, 0x80, 0x80, 0x40, 0xF8,

                                0x38, 0x40, 0x80, 0x40, 0x38,

                                0x78, 0x80, 0x60, 0x80, 0x78,

                                0x88, 0x50, 0x20, 0x50, 0x88,

                                0x18, 0xA0, 0xA0, 0xA0, 0x78,

                                0x88, 0xC8, 0xA8, 0x98, 0x88,

                                0x00, 0x10, 0x6C, 0x82, 0x00,

                                0x00, 0x00, 0xFE, 0x00, 0x00,

                                0x00, 0x82, 0x6C, 0x10, 0x00,

                                0x10, 0x10, 0x54, 0x38, 0x10,

                                0x10, 0x38, 0x54, 0x10, 0x10};



//以filldata充填液晶屏

void  LCD_DispFill(uchar filldata)

{  uchar  x, y;

   LCD_WrCmd(CSL,LCD_STARTROW+0);        //设置左半屏显示起始行为0

   LCD_WrCmd(CSR,LCD_STARTROW+0);        //设置右半屏显示起始行为0

   for( y=0;y<8;y++)           //循环充填8页

   {  LCD_WrCmd(CSL,LCD_ADDRSTRY+y);        // 设置左半屏页地址

      LCD_WrCmd(CSL,LCD_ADDRSTRX);            // 设置左半屏列地址

      LCD_WrCmd(CSR,LCD_ADDRSTRY+y);        // 设置右半屏页地址

      LCD_WrCmd(CSR,LCD_ADDRSTRX);                // 设置右半屏列地址



      for(x=0;x<64;x++)                  //充填每页的64个单元(列)

      {  LCD_WrDat(CSL,filldata);

         LCD_WrDat(CSR,filldata);



      }        

   }

}



//液晶模块初始化

void  LCD_DispIni(void)                        

{  uint  i;

   LCD_RST = 0;                                           // 复位驱动芯片

   for(i=0; i<500; i++);

   LCD_RST = 1;   

   LCD_WrCmd(CSL,LCD_DISPON);                 // 打开显示

   LCD_WrCmd(CSL,LCD_STARTROW);           // 设置显示起始行为0

   LCD_WrCmd(CSR,LCD_DISPON);        

   LCD_WrCmd(CSR,LCD_STARTROW);               

   LCD_DispFill(00);                        // 清屏

   LCD_WrCmd(CSL,LCD_ADDRSTRY+0);        // 设置页(字符行)地址

   LCD_WrCmd(CSL,LCD_ADDRSTRX+0);        // 设置列地址

   LCD_WrCmd(CSR,LCD_ADDRSTRY+0);

   LCD_WrCmd(CSR,LCD_ADDRSTRX+0);

}



//在液晶屏的cy(0-7)行、cx(0-15)列显示字符dispdata        

void LCD_DispChar(uchar cy, uchar cx, char dispdata)

{  uchar  code  *pch;

   uchar  i;

   bit port;

   cy = cy&0x07;                // 参数过滤

   cx = cx&0x0f;

   pch = &ASCII_TAB[(dispdata-0X20)*5];     //指向字符起始列的点阵码

   if((cx&0x08)==0)                // 列号cx<8,在左半屏显示

       {  port=CSL;

          i=cx<<3;

       }

   else

       {  port=CSR;

          i = (cx&0x07)<<3;

       }

   LCD_WrCmd(port,LCD_ADDRSTRX+i);        // 设置当前列地址

   LCD_WrCmd(port,LCD_ADDRSTRY+cy);        // 设置当前页地址

   for(i=0; i<5; i++);           //延时

   LCD_WrDat(port,0x00);                                // 显示一列空格

   for(i=0; i<5; i++)            //送出字符的5列点阵码

      { LCD_WrDat(port,*pch);               

        pch++;

      }

   LCD_WrDat(port,0x00);                   //显示一列空格

      for(i=0; i<5; i++);

   LCD_WrDat(port,0x00);        

}

                                                      

//在液晶屏的cy(0-7)行、cx(0-15)列显示字符disp_str        

void  LCD_DispStr(uchar cy, uchar cx, char *disp_str)

{  while( *disp_str !='\0')

   {  cy = cy&0x07;                        // 参数过滤

      cx = cx&0x0f;        

      LCD_DispChar(cy, cx, *disp_str);         // 显示字符

             disp_str++ ;                                // 指向下一字符数据

      cx++;

      if(cx>15) cy++;                    // 指向下一显示行

   }

}



void  main(void)

{ while(1)

   {  LCD_DispIni();        // 初始化液晶模块

      LCD_DispStr (0,1,"void Stop()");

      LCD_DispStr (1,1,"{ SDA=0;");

      LCD_DispStr (2,1,"        SCL=1;");

      LCD_DispStr (3,1,"        delay5us();");

      LCD_DispStr (4,1,"        SDA=1;");

      LCD_DispStr (5,1,"        delay5us();");

      LCD_DispStr (6,1,"        SCL=0;");

      LCD_DispChar (7,1,'}');

      while(1);

   }

}
回复

使用道具 举报

ID:517466 发表于 2020-12-22 23:43 | 显示全部楼层
//#define CSL 0
//#define CSR 1
sbit CSL=P1^2;
sbit CSR=P1^1;

//#define uchar unsigned char
//#define uint unsigned int
下面的去掉extern ,并把所有声明放在函数LCD_WrCmd的实体前面
extern void LCD_DispIni(void);
extern void LCD_DispFill(uchar filldata);
extern void LCD_DispChar(uchar cy,uchar cx,char dispdata);
extern void LCD_DispStr(uchar cy,uchar cx,char *disp_str);

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:517466 发表于 2020-12-22 23:49 | 显示全部楼层
CSL和CSR在sbit后又被define了,然后后面对define的对象赋值,你的代码有些神奇。
把#define CSL和#define CSR注释掉,或者删除!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:726849 发表于 2020-12-23 11:19 | 显示全部楼层
suncat0504 发表于 2020-12-22 23:49
CSL和CSR在sbit后又被define了,然后后面对define的对象赋值,你的代码有些神奇。
把#define CSL和# ...

谢谢谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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