打印

STC12C5A60S2单片机+LCD1602液晶显示的问题~求指导

[复制链接]
1241|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sbit LCD_RS=P3^5;//定义引脚
sbit LCD_RW=P3^6;
sbit LCD_E=P3^7;
#define LCD_Data P2

/********宏定义***********************************************************/
#define Busy    0x80 //用于检测LCD状态字中的Busy标识


/********数据定义*************************************************************/
code BYTE table[]={48,49,50,51,52,53,54,55,56,57};     //0_9 ascii码的数字

/********函数声明*************************************************************/
void WriteDataLCD(BYTE WR_DATA);                    //写数据
void WriteCommandLCD(BYTE WCLCD);        //写命令
void WriteCommandLCD1(BYTE WCLCD);        //写命令
void busy_check(void);                        //读状态
void LCDInit(void);                                        //初始化
void DisplayOneChar(BYTE X, BYTE Y, BYTE DData);            //相应坐标显示字节内容
void DisplayListChar(BYTE X, BYTE Y, BYTE code *DData);    //相应坐标开始显示一串内容
//void delay1MS(uint t)
//{
//    uint i,j;
//    for(i=0;i<t;i++)
//    for(j=0;j<935;j++);
//}

/*初始化*/   
void LCDInit(void)
{
    WriteCommandLCD(0x38);//不检测忙信号
    WriteCommandLCD(0x08);     //关闭显示
    WriteCommandLCD(0x01);     //显示清屏
    WriteCommandLCD(0x06);     //显示光标移动设置
    WriteCommandLCD(0x0C);     //显示开及光标设置
}

/*按指定位置显示一串字符*/   
void DisplayListChar(BYTE X, BYTE Y, BYTE code *DData)
{
     BYTE ListLength;
     ListLength = 0;
     X &= 0xF;
    Y &= 0x1;                 //限制X不能大于15,Y不能大于1
     while (DData[ListLength]>=0x20){ //若到达字串尾则退出
           if (X <= 0xF){         //X坐标应小于0xF
             DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
             ListLength++;
             X++;
        }
      }
}

/*按指定位置显示一个字符*/   
void DisplayOneChar(BYTE X, BYTE Y, BYTE DData)
{
    X &= 0xF;
     Y &= 0x1;                //限制X不能大于15,Y不能大于1
     if (Y)
     X |= 0x40;         //当要显示第二行时地址码+0x40;
   
    X |= 0x80;             //算出指令码
     WriteCommandLCD(X); //发送地址码
     WriteDataLCD(DData);
}

/***********写指令********************************************************/   
void WriteCommandLCD(BYTE WCLCD)
{   
    busy_check();
    LCD_Data = WCLCD;
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_E = 1;     
    LCD_E = 0;
}

/***********写数据********************************************************/   
void WriteDataLCD(BYTE WR_DATA)
{
    busy_check(); //检测忙
     LCD_Data = WR_DATA;
     LCD_RS = 1;
     LCD_RW = 0;
    LCD_E = 1;
    LCD_E = 0;
}

//检测忙信号
void busy_check(void)
{
     LCD_Data = 0xFF;
    LCD_E = 0;
     LCD_RS = 0;
     LCD_RW = 1;
     LCD_E = 1;
     while (LCD_Data & Busy);
    LCD_E = 0;
}
由于数据端D0-D7用到了不同IO口~在程序中如何修改才行~求大神指导


QQ截图20160408181522.jpg (441.52 KB )

QQ截图20160408181522.jpg

相关帖子

沙发
ohy3686| | 2016-4-9 15:38 | 只看该作者
你这样的情况,建议重新写一个函数,替换void WriteDataLCD(BYTE WR_DATA);   

使用特权

评论回复
板凳
ningling_21| | 2016-4-9 18:08 | 只看该作者
电路和程序完全不一样
改电路更简单

使用特权

评论回复
地板
WU7896352410|  楼主 | 2016-4-10 12:18 | 只看该作者
ningling_21 发表于 2016-4-9 18:08
电路和程序完全不一样
改电路更简单

我已经更改了~数据端D0-D7用P2口

使用特权

评论回复
5
WU7896352410|  楼主 | 2016-4-10 12:19 | 只看该作者
ningling_21 发表于 2016-4-9 18:08
电路和程序完全不一样
改电路更简单

大神~你懂ENC28J60以太网模块?我与stc12单片机通讯出了问题

使用特权

评论回复
6
ningling_21| | 2016-4-10 13:01 | 只看该作者
WU7896352410 发表于 2016-4-10 12:19
大神~你懂ENC28J60以太网模块?我与stc12单片机通讯出了问题

什么问题?
两边的电源电压是否一样?

使用特权

评论回复
7
WU7896352410|  楼主 | 2016-4-10 15:35 | 只看该作者
ningling_21 发表于 2016-4-10 13:01
什么问题?
两边的电源电压是否一样?

ENC28j60我是用3.3V供电的~无法访问IP

QQ截图20160410153429.jpg (96.51 KB )

QQ截图20160410153429.jpg

使用特权

评论回复
8
WU7896352410|  楼主 | 2016-4-10 15:36 | 只看该作者
WU7896352410 发表于 2016-4-10 15:35
ENC28j60我是用3.3V供电的~无法访问IP

这是我用的程序

uIP_0.9_Keil_8051.一步一步教你移植uIP0.9到8051 ENC28J60.rar

411.07 KB

使用特权

评论回复
9
ningling_21| | 2016-4-11 08:27 | 只看该作者
WU7896352410 发表于 2016-4-10 15:35
ENC28j60我是用3.3V供电的~无法访问IP

这个芯片需要协议栈的支持,你的程序移植了协议没?

使用特权

评论回复
10
WU7896352410|  楼主 | 2016-4-11 13:25 | 只看该作者
ningling_21 发表于 2016-4-11 08:27
这个芯片需要协议栈的支持,你的程序移植了协议没?

现在可以ping通了~vb winsock控件怎么才能与单片机通讯??

使用特权

评论回复
11
ningling_21| | 2016-4-11 14:30 | 只看该作者
WU7896352410 发表于 2016-4-11 13:25
现在可以ping通了~vb winsock控件怎么才能与单片机通讯??

PING 通了,vb winsock 要和28J60建立通信(指定IP地址和端口),STC12也通过SPI和28J60进行数据交互,这样两者就可以通信了

使用特权

评论回复
12
WU7896352410|  楼主 | 2016-4-11 17:17 | 只看该作者
ningling_21 发表于 2016-4-11 14:30
PING 通了,vb winsock 要和28J60建立通信(指定IP地址和端口),STC12也通过SPI和28J60进行数据交互,这 ...

我想建立一个这样的界面~与ENC28J60通讯~该怎么样弄?

QQ截图20160411171355.jpg (203.93 KB )

QQ截图20160411171355.jpg

QQ截图20160411171424.jpg (130.65 KB )

QQ截图20160411171424.jpg

使用特权

评论回复
13
保夫鲁沙| | 2016-4-12 23:01 | 只看该作者
单独写个输出函数,判断写的数据每一位,然后让对应IO口输出高低电平即可。判断执行8次,就能写一个完整的unsigned char 数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝