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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

1602液晶疑難雜癥

[復制鏈接]
跳轉到指定樓層
樓主
ID:65751 發表于 2014-9-16 17:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 codenew 于 2014-9-16 20:46 編輯

先附上程序:
#include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code table[]= {"Temp wireless   "};
unsigned char code table1[]={"Temp:           "};
unsigned char code shuzi[]={"123456789ABCDEFG"};

unsigned char num;
sbit BEEP=P3^6;         //蜂鳴器定義引腳IO口

void delays(uint x) //毫秒級延時函數
{
  uint i,j;
  for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}
/*******************************************************************************
以下是對液晶模塊的操作程序
*******************************************************************************/
/***********1602液晶顯示部分子程序****************/
sbit rs=P3^3;//LCD數據/命令選擇端(H/L)
sbit rw=P3^4;//LCD讀/寫選擇端(H/L)
sbit en=P3^5;//LCD使能控制
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低電平選擇命令
        rw=1;  //RW(H/L),讀操作
        en=1;
        while(P0&0x80); //當為0時表示不忙,退出循環。
        en=0;
}
void write_com(uchar com)
{
        ready();
        rs=0;//命令
        rw=0;
        P0=com;
        en=1;//ready()執行完后,en0。形成高脈沖,表示可對液晶讀寫。
        en=0;
}
void write_date(uchar date)
{
        ready();
        rs=1;//數據
        rw=0;
        P0=date;
        en=1;//ready()執行完后,en0。形成高脈沖,表示可對液晶讀寫。
        en=0;
}
void init1602()                         //上電后液晶顯示初始化函數
{
        write_com(0x38);        //設置工作方式
        write_com(0x0c);        //設置光標
        write_com(0x06);        //設置輸入方式
        write_com(0x01);        //清屏
        write_com(0x80);
        for(num=0;num<16;num++)
        {
           write_date(table[num]);
        }
        write_com(0x80+0x40);
        for(num=0;num<16;num++)
        {
           write_date(table1[num]);
        }
}

/**************************************************
函數功能:主函數
***************************************************/
void main(void)
{         
          BEEP=1;                //禁止蜂鳴器
          en=0;
          P0=0xff;

        write_com(0x38);        //設置工作方式
        write_com(0x0c);        //設置光標
        write_com(0x06);        //設置輸入方式
        write_com(0x01);        //清屏
        write_com(0x80);
          for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
        while(1);
}        

評分

參與人數 2黑幣 +60 收起 理由
YJGG + 10 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:65751 發表于 2014-9-16 17:33 | 只看該作者
本帖最后由 codenew 于 2014-9-16 17:36 編輯

1.刷芯片,上電運行,第一行全部顯示小方塊,不正常。如圖所示。
2.刪除for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
改成下面的:
        write_date('1');
        write_date('2');
        write_date('3');
        write_date('4');
        write_date('5');
當然while(1);不能刪除,上電運行,第一行還是全部顯示小方塊。
再刪除write_date('5');,即保留        
    write_date('1');
        write_date('2');
        write_date('3');
        write_date('4');
再刷芯片,上電運行,可正常顯示1234。
3.當刷芯片第一次是刷for語句,去掉主函數P0=0xff;,再把for語句換成
    write_date('1');
        write_date('2');
        write_date('3');
        write_date('4');
        write_date('5');
編譯再刷芯片,上電運行,居然能顯示12345。

aa.jpg (132.62 KB, 下載次數: 91)

小方塊

小方塊
回復

使用道具 舉報

板凳
ID:65751 發表于 2014-9-16 19:54 | 只看該作者
本帖最后由 codenew 于 2014-10-3 16:27 編輯

     把數組的G去掉,即如下:
unsigned char code shuzi[]={"123456789ABCDEF"};
     在主函數中照樣用:
     for(num=0;num<16;num++)
     {
     write_date(shuzi[num]);
     }
     while(1);
     刷芯片,上電運行,顯示123456789ABCDEF正常,但最后一位亂碼,如圖所示。    最后一位亂碼屬正常,因為shizi[15]沒有賦值。


j16.jpg (95.08 KB, 下載次數: 102)

j16.jpg
回復

使用道具 舉報

地板
ID:65751 發表于 2014-9-16 20:28 | 只看該作者
本帖最后由 codenew 于 2014-9-16 20:44 編輯

       一開始時,編譯提示*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS兩個警告,主要是有兩函數沒有被調用。這兩個函數是void delays(uint x)和void init1602()。
        我把void delays(uint x)和void init1602()這兩個函數去掉,重新編譯,提示0錯誤,0警告了。重新刷芯片,上電運行,可正常顯示123456789ABCDEFG這十六個字符了。我不明白,為什么保留上面哪兩個函數就顯示不正常的?照理沒調用應不影響的。
         正常顯示123456789ABCDEFG的程序如下:
#include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code table[]= {"Temp wireless   "};
unsigned char code table1[]={"Temp:           "};
unsigned char code shuzi[]={"123456789ABCDEFG"};

unsigned char num;
sbit BEEP=P3^6;         //蜂鳴器定義引腳IO口
sbit rs=P3^3;//LCD數據/命令選擇端(H/L)
sbit rw=P3^4;//LCD讀/寫選擇端(H/L)
sbit en=P3^5;//LCD使能控制

/*******************************************************************************
以下是對液晶模塊的操作程序
*******************************************************************************/
/***********1602液晶顯示部分子程序****************/
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低電平選擇命令
        rw=1;  //RW(H/L),讀操作
        en=1;
        while(P0&0x80);  //當為0時表示不忙,退出循環。
        en=0;
}
void write_com(uchar com)
{
        ready();
        rs=0;//命令
        rw=0;
        P0=com;
        en=1;//ready()執行完后,en0。形成高脈沖,表示可對液晶讀寫。
        en=0;
}
void write_date(uchar date)
{
        ready();
        rs=1;//數據
        rw=0;
        P0=date;
        en=1;//ready()執行完后,en0。形成高脈沖,表示可對液晶讀寫。
        en=0;
}

/**************************************************
函數功能:主函數
***************************************************/
void main(void)
{         
          BEEP=1;                //禁止蜂鳴器
          en=0;
          P0=0xff;

        write_com(0x38);        //設置工作方式
        write_com(0x0c);        //設置光標
        write_com(0x06);        //設置輸入方式
        write_com(0x01);        //清屏
        write_com(0x80);
          for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
        while(1);
}        
回復

使用道具 舉報

5#
ID:58502 發表于 2014-9-16 22:53 | 只看該作者

回帖獎勵 +5

我先拿你最原先的程序調試,發現有2個函數未被調用,一個延時函數,一個1602初始化,改了之后正常顯示
           #include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code table[]= {"Temp wireless   "};
unsigned char code table1[]={"Temp:           "};
unsigned char code shuzi[]={"123456789ABCDEFG"};

unsigned char num;
sbit BEEP=P3^6;         //蜂鳴器定義引腳IO口

/*void delays(uint x) //毫秒級延時函數
{
  uint i,j;
  for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}          */
/*******************************************************************************
以下是對液晶模塊的操作程序
*******************************************************************************/
/***********1602液晶顯示部分子程序****************/
sbit rs=P2^6;//LCD數據/命令選擇端(H/L)
sbit rw=P2^5;//LCD讀/寫選擇端(H/L)
sbit en=P2^7;//LCD使能控制
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低電平選擇命令
        rw=1;  //RW(H/L),讀操作
        en=1;
        while(P0&0x80); //當為0時表示不忙,退出循環。
        en=0;
}
void write_com(uchar com)
{
        ready();
        rs=0;//命令
        rw=0;
        P0=com;
        en=1;//ready()執行完后,en為0。形成高脈沖,表示可對液晶讀寫。
        en=0;
}
void write_date(uchar date)
{
        ready();
        rs=1;//數據
        rw=0;
        P0=date;
        en=1;//ready()執行完后,en為0。形成高脈沖,表示可對液晶讀寫。
        en=0;
}
void init1602()                         //上電后液晶顯示初始化函數
{
        write_com(0x38);        //設置工作方式
        write_com(0x0c);        //設置光標
        write_com(0x06);        //設置輸入方式
        write_com(0x01);        //清屏
        write_com(0x80);
        for(num=0;num<16;num++)
        {
           write_date(table[num]);
        }
        write_com(0x80+0x40);
        for(num=0;num<16;num++)
        {
           write_date(table1[num]);
        }
}

/**************************************************
函數功能:主函數
***************************************************/
void main(void)
{         
          BEEP=1;                //禁止蜂鳴器
          en=0;
          P0=0xff;
                init1602();
        write_com(0x38);        //設置工作方式
        write_com(0x0c);        //設置光標
        write_com(0x06);        //設置輸入方式
        write_com(0x01);        //清屏
        write_com(0x80);
          for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
        while(1);
}   

評分

參與人數 1威望 +50 黑幣 +50 收起 理由
admin + 50 + 50 回帖助人的積分獎勵

查看全部評分

回復

使用道具 舉報

6#
ID:65751 發表于 2014-9-17 11:04 | 只看該作者
樓上的主函數可去掉 init1602();,因為它后面的 write_com等等實際就是初始化,原意是在主函數中自己初始化,顯示123456789ABCDEFG,不想調用void delays(uint x)和void init1602()。但為什么放著void delays(uint x)和void init1602()這兩個函數,不調用它們,會出現奇怪現像呢。求解。
回復

使用道具 舉報

7#
ID:65751 發表于 2014-9-17 20:39 | 只看該作者
誰來評評理呀,即把我首發的程序去掉void delays(uint x)和void init1602()函數,就能正常顯示16個字符了,為什么會這樣的,哪兩個函數主程序根本沒調用呀。
回復

使用道具 舉報

8#
ID:65751 發表于 2014-9-17 21:16 | 只看該作者
重大進展,把我首發的程序中的函數void ready()改成如下,不刪除void delays(uint x)和void init1602()函數也能正常顯示123456789ABCDEFG這十六個字符了。
void ready()
{
        unsigned char sta;
        P0 = 0xFF;
        rs = 0;
        rw = 1;
        do        {
                en = 1;
                sta = P0;
                en = 0;
        }while(sta & 0x80);//當為0時表示不忙,退出循環。

}

原ready()函數為:
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低電平選擇命令
        rw=1;  //RW(H/L),讀操作
        en=1;
        while(P0&0x80); //當為0時表示不忙,退出循環。
        en=0;
}
應該是原來ready()函數有問題才會導致哪么多奇怪的問題,上面比較一下,原來錯在哪呢?
回復

使用道具 舉報

9#
ID:65751 發表于 2014-10-3 16:18 | 只看該作者
本帖最后由 codenew 于 2014-10-3 16:24 編輯

忘了總結,導致莫名的現像真正原因是40P鎖緊器彈簧接觸不良!

40p.jpg (16.53 KB, 下載次數: 95)

40p.jpg
回復

使用道具 舉報

10#
ID:153199 發表于 2017-2-19 12:07 | 只看該作者
感謝樓主分享,我也遇到過由于此問題,無法寫進程序
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩和的一区二区 | 日本一区二区三区免费观看 | www.久久.com | 男女国产网站 | 国产精品一区二区久久精品爱微奶 | 免费能直接在线观看黄的视频 | 欧美 日韩精品 | 亚洲自拍一区在线观看 | 日韩精品视频一区二区三区 | 国产九九九 | 日韩精品在线免费 | 北条麻妃av一区二区三区 | 给我免费的视频在线观看 | 嫩草黄色影院 | 在线视频国产一区 | 狠狠操av| 黄色大片在线播放 | 久久区二区| 亚洲视频三 | 精品久久久久久久久久久久久久 | 日韩欧美久久精品 | 欧美成人精品一区二区男人看 | 性高湖久久久久久久久3小时 | 亚洲成人精品 | 人妖videosex高潮另类 | 精品一区二区免费视频 | 国产精品视频网站 | 欧洲视频一区 | 亚洲精品在线免费观看视频 | 国产日韩一区二区三区 | 成人综合视频在线 | 精品欧美一区二区三区免费观看 | 国产在线一区二区三区 | 九九热免费看 | 国产精品久久久久久久久免费高清 | 午夜三区 | 国产a一区二区 | 成人欧美 | 欧美性网 | 中文字幕在线观看第一页 | 亚洲 欧美 日韩在线 |