久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13698|回復: 4
打印 上一主題 下一主題
收起左側

Proteus仿真中的lcd1602為什么只亮不顯示?

[復制鏈接]
跳轉到指定樓層
樓主

sbit LCD_RS = P2^5;    //片選信號輸入
sbit LCD_RW = P2^6;   //串行數據輸入
sbit LCD_E = P2^7;  //串行時鐘輸入
sbit D0=P0^0;

void delay_nms(uint t)
{
    uint i;
    uchar j;
    for(i=0;i<t;i++)
      for(j=0;j<110;j++);
}
/*********************************************************
*函數功能:向lcd12864串行輸入一個字節
**********************************************************/
void send_byte(uchar Dbyte)
{
    uchar i;
    for(i=0;i<8;i++)
    {
      LCD_E = 0;
      Dbyte = Dbyte<<1;
      LCD_RW = CY;
      LCD_E = 1;
      _nop_();
      LCD_E = 0;
    }   
}
/*********************************************************
*函數功能:接收lcd12864輸出的一個有效字節
**********************************************************/
uchar recive_byte()
{
    uchar temp1,temp2,i;
    bit flag;
    temp1 = 0;
    temp2 = 0;
    for(i=0;i<8;i++)//接收有效字節的高四位
    {
        temp1 = temp1<<1;
        LCD_E = 0;
         LCD_E = 1;
        _nop_();
        LCD_E = 0;
        flag = LCD_RW;
        if(flag==1)
          temp1 = temp1&0x01;  
    }
    for(i=0;i<8;i++)//接收有效字節的低四位
    {
        temp2 = temp2<<1;
        LCD_E = 0;
         LCD_E= 1;
        _nop_();
        LCD_E = 0;
        flag = LCD_RW;
        if(flag==1)
          temp2 = temp2&0x01;  
    }   
    return ((temp1&0xf0)|(temp2&0x0f));//返回接收到的有效字節
}
/*********************************************************
*函數功能:檢測忙標志位
**********************************************************/
void lcd12864_checkbusy()
{
    do
    {
        send_byte(0xfc);//1111 1【1 RW】【0 RS】0
    }while(recive_byte()&0x80==0x80);  //BF(.7)=1 Busy
}

/*********************************************************
*函數功能:向12864寫命令函數
**********************************************************/
void lcd12864_write_com(uchar com)
{
    LCD_RS = 1;
    lcd12864_checkbusy();//檢測忙信號
     send_byte(0xf8);//1111 1[0 rw][0 rs]0   寫命令起始指令
    send_byte(com&0xf0);   
    send_byte((com<<4)&0xf0);
    LCD_RS = 0;
}
/*********************************************************
*函數功能:向12864寫數據函數
**********************************************************/
void lcd12864_write_dat(uchar dat)
{
    LCD_RS = 1;
    lcd12864_checkbusy();//檢測忙信號
    send_byte(0xfa);//1111 1[0 rw][1 rs]0  寫數據起始指令
    send_byte(dat&0xf0);
    send_byte((dat<<4)&0xf0);
    LCD_RS = 0;
}
/*********************************************************
*函數功能:設置光標位置
**********************************************************/
void lcd12864_set_cursor(uchar x,uchar y)
{
    uchar addr;
    switch(x)//確定行
    {
        case 0x00:addr = 0x80;break;//第一行
        case 0x01:addr = 0x90;break;//第二行
        case 0x02:addr = 0x88;break;//第三行
        case 0x03:addr = 0x98;break;//第四行
        default:break;
    }
    addr += y;                      //確定列
    lcd12864_write_com(addr);       //設置光標
}
/*********************************************************
*函數功能:lcd12864清顯示(顯示漢字、字符模式下的清屏)
**********************************************************/
void lcd12864_clear0(void)
{
    lcd12864_write_com(0x01);
    delay_nms(10);
}
/*********************************************************
*函數功能:lcd12864清顯示(繪圖模式下的清屏)
**********************************************************/
void lcd12864_clear1(void)
{
    uchar i, j, k ;
    lcd12864_write_com(0x34);//功能設置:擴充指令集動作
    lcd12864_write_com(0x36);//開繪圖顯示
    for( i = 0 ; i < 2 ; i++ )//分上下兩屏寫
    {
        for( j = 0 ; j < 32 ; j++ )
        {
          lcd12864_write_com( 0x80 + j ) ;//寫Y坐標(行坐標)
            if( i == 0 )                  //寫X坐標(列坐標)
               lcd12864_write_com( 0x80 ) ;
            else
               lcd12864_write_com( 0x88 ) ;
            for( k = 0 ; k < 16 ; k++ )      //寫一整行數據
                lcd12864_write_dat(0x00) ;
        }
    }
    lcd12864_write_com( 0x30 ) ;//功能設置:恢復為基本指令集
                                //          關繪圖顯示
}
/*********************************************************
*函數功能:初始化函數
**********************************************************/
void lcd12864_init()
{
  delay_nms(50);
  //功能設定
  lcd12864_write_com(0x30);   //設置為8位并行口,基本指令集
  delay_nms(1);
  lcd12864_write_com(0x30);   //再次設置為8位并行口,基本指令集
  delay_nms(1);
  lcd12864_write_com(0x0c);   //顯示狀態設置:整體顯示ON 游標OFF
  delay_nms(10);
  lcd12864_write_com(0x01);   //清除顯示,并且設定地址指針為00H
  delay_nms(10);
  lcd12864_write_com(0x06);   //設置為游標右移,DDRAM位地址加1,畫面不移動
}

/*********************************************************
*函數功能:在指定位置 顯示一個字符
**********************************************************/
void lcd12864_write_char(uchar x,uchar y,uchar chr)
{
  lcd12864_set_cursor(x,y);
  lcd12864_write_dat(chr);
}
/*********************************************************
*函數功能:在指定位置 顯示一個字符
**********************************************************/
void lcd12864_write_str(uchar x,uchar y,uchar *string)
{
    uchar *str;
    uchar i=x;
    uchar j=y;
    str = string;
    lcd12864_set_cursor(x,y);
    while(*str!='\0')
    {
      lcd12864_write_dat(*str);
      j++;
      if(j>0x0f)
      {
        i++;
        j=0;
        if(i>4)
          i=0;
        lcd12864_set_cursor(i,j);
      }   
      str++;
    }   
}


//********************************************************
//畫滿屏圖片
//參數:dat為填充的數據
//********************************************************
void draw_full_picture (uchar *dat)
{
    uchar i;                 
    uchar j;
    uchar k;
    uchar bGDRAMAddrX = 0x80;        //GDRAM水平地址
    uchar bGDRAMAddrY = 0x80;        //GDRAM垂直地址
    for(i = 0; i < 2; i++)                                                                                                            
    {
        for(j = 0; j < 32; j++)                                                                 
        {
            for(k = 0; k < 8; k++)                                                         
            {
                lcd12864_write_com(0x34);                //設置為8位MPU接口,擴充指令集
                lcd12864_write_com(bGDRAMAddrY+j);        //垂直地址Y                                                                        
                lcd12864_write_com(bGDRAMAddrX+k);        //水平地址X
                lcd12864_write_dat(*dat++);
                lcd12864_write_dat(*dat++);
            }
        }
        bGDRAMAddrX = 0x88;                    //寫下半屏幕
    }
    lcd12864_write_com(0x36);                            //打開繪圖模式
    lcd12864_write_com(0x30);                            //恢復基本指令集,關閉繪圖模式   
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:35873 發表于 2019-4-18 00:24 | 只看該作者
給你個顯示自己看吧

1602.PNG (57.83 KB, 下載次數: 47)

1602.PNG

ds18b20和1602顯示.rar

66.31 KB, 下載次數: 254

回復

使用道具 舉報

板凳
ID:96682 發表于 2019-4-18 00:38 | 只看該作者
這文不對題的無解
回復

使用道具 舉報

地板
ID:213173 發表于 2019-4-18 05:25 | 只看該作者
你的程序用的是12864,仿真用的是1602,讓它怎么顯示?
回復

使用道具 舉報

5#
ID:515099 發表于 2019-4-18 11:29 | 只看該作者
wulin 發表于 2019-4-18 05:25
你的程序用的是12864,仿真用的是1602,讓它怎么顯示?

那換啦LCD12864,要怎么改才能顯示數據?

sbit LCD_CS = P0^0;    //片選信號輸入
sbit LCD_STD = P0^1;   //串行數據輸入
sbit LCD_SCLK = P0^2;  //串行時鐘輸入

void delay_nms(uint t)
{
    uint i;
    uchar j;
    for(i=0;i<t;i++)
      for(j=0;j<110;j++);
}

/*函數功能:向lcd12864串行輸入一個字節*/
void send_byte(uchar Dbyte)
{
    uchar i;
    for(i=0;i<8;i++)
    {
      LCD_SCLK = 0;
      Dbyte = Dbyte<<1;
      LCD_STD = CY;
      LCD_SCLK = 1;
      _nop_();
      LCD_SCLK = 0;
    }   
}
/*函數功能:接收lcd12864輸出的一個有效字節*/
uchar recive_byte()
{
    uchar temp1,temp2,i;
    bit flag;
    temp1 = 0;
    temp2 = 0;
    for(i=0;i<8;i++)//接收有效字節的高四位
    {
        temp1 = temp1<<1;
        LCD_SCLK = 0;
         LCD_SCLK = 1;
        _nop_();
        LCD_SCLK = 0;
        flag = LCD_STD;
        if(flag==1)
          temp1 = temp1&0x01;  
    }
    for(i=0;i<8;i++)//接收有效字節的低四位
    {
        temp2 = temp2<<1;
        LCD_SCLK = 0;
         LCD_SCLK = 1;
        _nop_();
        LCD_SCLK = 0;
        flag = LCD_STD;
        if(flag==1)
          temp2 = temp2&0x01;  
    }   
    return ((temp1&0xf0)|(temp2&0x0f));//返回接收到的有效字節
}
/*函數功能:檢測忙標志位*/
void lcd12864_checkbusy()
{
    do
    {
        send_byte(0xfc);//1111 1【1 RW】【0 RS】0
    }while(recive_byte()&0x80==0x80);  //BF(.7)=1 Busy
}

/*函數功能:向12864寫命令函數*/
void lcd12864_write_com(uchar com)
{
    LCD_CS = 1;
    lcd12864_checkbusy();//檢測忙信號
     send_byte(0xf8);//1111 1[0 rw][0 rs]0   寫命令起始指令
    send_byte(com&0xf0);   
    send_byte((com<<4)&0xf0);
    LCD_CS = 0;
}
/*函數功能:向12864寫數據函數*/
void lcd12864_write_dat(uchar dat)
{
    LCD_CS = 1;
    lcd12864_checkbusy();//檢測忙信號
    send_byte(0xfa);//1111 1[0 rw][1 rs]0  寫數據起始指令
    send_byte(dat&0xf0);
    send_byte((dat<<4)&0xf0);
    LCD_CS = 0;
}

void lcd12864_set_cursor(uchar x,uchar y)
{
    uchar addr;
    switch(x)//確定行
    {
        case 0x00:addr = 0x80;break;//第一行
        case 0x01:addr = 0x90;break;//第二行
        case 0x02:addr = 0x88;break;//第三行
        case 0x03:addr = 0x98;break;//第四行
        default:break;
    }
    addr += y;                      //確定列
    lcd12864_write_com(addr);       //設置光標
}
/*函數功能:lcd12864清顯示(顯示漢字、字符模式下的清屏)*/
void lcd12864_clear0(void)
{
    lcd12864_write_com(0x01);
    delay_nms(10);
}
/*函數功能:lcd12864清顯示(繪圖模式下的清屏)*/
void lcd12864_clear1(void)
{
    uchar i, j, k ;
    lcd12864_write_com(0x34);//功能設置:擴充指令集動作
    lcd12864_write_com(0x36);//開繪圖顯示
    for( i = 0 ; i < 2 ; i++ )//分上下兩屏寫
    {
        for( j = 0 ; j < 32 ; j++ )
        {
          lcd12864_write_com( 0x80 + j ) ;//寫Y坐標(行坐標)
            if( i == 0 )                  //寫X坐標(列坐標)
               lcd12864_write_com( 0x80 ) ;
            else
               lcd12864_write_com( 0x88 ) ;
            for( k = 0 ; k < 16 ; k++ )      //寫一整行數據
                lcd12864_write_dat(0x00) ;
        }
    }
    lcd12864_write_com( 0x30 ) ;//功能設置:恢復為基本指令集
                                //          關繪圖顯示
}
/*函數功能:初始化函數*/
void lcd12864_init()
{
  delay_nms(50);
  //功能設定
  lcd12864_write_com(0x30);   //設置為8位并行口,基本指令集
  delay_nms(1);
  lcd12864_write_com(0x30);   //再次設置為8位并行口,基本指令集
  delay_nms(1);
  lcd12864_write_com(0x0c);   //顯示狀態設置:整體顯示ON 游標OFF
  delay_nms(10);
  lcd12864_write_com(0x01);   //清除顯示,并且設定地址指針為00H
  delay_nms(10);
  lcd12864_write_com(0x06);   //設置為游標右移,DDRAM位地址加1,畫面不移動
}

/*函數功能:在指定位置 顯示一個字符*/
void lcd12864_write_char(uchar x,uchar y,uchar chr)
{
  lcd12864_set_cursor(x,y);
  lcd12864_write_dat(chr);
}
/*函數功能:在指定位置 顯示一個字符*/
void lcd12864_write_str(uchar x,uchar y,uchar *string)
{
    uchar *str;
    uchar i=x;
    uchar j=y;
    str = string;
    lcd12864_set_cursor(x,y);
    while(*str!='\0')
    {
      lcd12864_write_dat(*str);
      j++;
      if(j>0x0f)
      {
        i++;
        j=0;
        if(i>4)
          i=0;
        lcd12864_set_cursor(i,j);
      }   
      str++;
    }   
}


//畫滿屏圖片
//參數:dat為填充的數據
void draw_full_picture (uchar *dat)
{
    uchar i;                 
    uchar j;
    uchar k;
    uchar bGDRAMAddrX = 0x80;        //GDRAM水平地址
    uchar bGDRAMAddrY = 0x80;        //GDRAM垂直地址
    for(i = 0; i < 2; i++)                                                                                                            
    {
        for(j = 0; j < 32; j++)                                                                 
        {
            for(k = 0; k < 8; k++)                                                         
            {
                lcd12864_write_com(0x34);                //設置為8位MPU接口,擴充指令集
                lcd12864_write_com(bGDRAMAddrY+j);        //垂直地址Y                                                                        
                lcd12864_write_com(bGDRAMAddrX+k);        //水平地址X
                lcd12864_write_dat(*dat++);
                lcd12864_write_dat(*dat++);
            }
        }
        bGDRAMAddrX = 0x88;                    //寫下半屏幕
    }
    lcd12864_write_com(0x36);                            //打開繪圖模式
    lcd12864_write_com(0x30);                            //恢復基本指令集,關閉繪圖模式   
}


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清视频在线播放 | 99精品久久99久久久久 | 午夜精品久久久久久久 | 国产96色在线 | 国产一区电影 | 精品国产乱码久久久久久牛牛 | 久久午夜视频 | 国产成年人视频 | 天天干天天干 | 91久久伊人 | 在线播放中文字幕 | 91精品国产91久久综合桃花 | 国产偷久久一级精品60部 | 欧美午夜剧场 | 欧美精品一区二区在线观看 | 成人精品一区二区三区中文字幕 | 狠狠干天天干 | 成人性视频在线播放 | 在线成人福利 | 国产三级大片 | 一区二区免费在线观看 | 亚洲国产一区二区三区, | 中文字幕成人av | 综合久 | 日韩欧美一区二区三区免费观看 | 久久综合狠狠综合久久综合88 | 欧美99久久精品乱码影视 | 超碰男人天堂 | 91在线观看免费 | 亚洲激情综合 | 日韩精品成人一区二区三区视频 | 精品国产乱码一区二区三 | 精品一区二区在线观看 | 亚洲一区二区中文字幕 | 欧美精品一区二区在线观看 | 日韩国产中文字幕 | 日韩在线观看网站 | 婷婷精品| 成人av片在线观看 | 久久久国产精品 | 精品免费国产一区二区三区四区 |