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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13339|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

lcd1602并口轉(zhuǎn)串口

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:73684 發(fā)表于 2015-2-16 21:49 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 破力達(dá) 于 2015-2-16 22:00 編輯

      費(fèi)了點(diǎn)時(shí)間做了一個(gè)lcd1602并口轉(zhuǎn)串口的轉(zhuǎn)換板。
一開(kāi)始以為這個(gè)很簡(jiǎn)單,應(yīng)該很快就能弄好,但是實(shí)際操作遇到了很多問(wèn)題。雖說(shuō)這些問(wèn)題解決了,但不知道為什么。
      我既想發(fā)表一下這轉(zhuǎn)接板又想問(wèn)問(wèn)題,所以也不知道要在單片機(jī)DIY制作發(fā)表好,還是在24小時(shí)必答區(qū)發(fā)表好,最好還是選了這。
因?yàn)閱?wèn)題不多。
      
      這個(gè)是用STC12C5410AD    晶振12M做的轉(zhuǎn)接板,聽(tīng)起來(lái)確實(shí)有點(diǎn)小題大做。但是沒(méi)辦法,手頭上只有它了,或者給自己另一個(gè)理由有錢(qián)任性。


      有了這個(gè)轉(zhuǎn)接板以后就不用為要接著么多線所煩惱了。就兩條通信的線,和兩個(gè)電源線,還有一個(gè)對(duì)比度的調(diào)節(jié)(也可以在轉(zhuǎn)接板接好就行了)。


      這個(gè)基本原理就是通過(guò)一條線來(lái)脈沖計(jì)數(shù)控制IO口德高低電平,另一條線也是通過(guò)脈沖計(jì)數(shù)來(lái)傳輸lcd D0-D7 的數(shù)據(jù)。一個(gè)畫(huà)面刷新速度是76ms;





很簡(jiǎn)單











這下面是轉(zhuǎn)接板的程序,直接貼出(由于轉(zhuǎn)接板單片機(jī)數(shù)據(jù)接線和lcd的相反,所以要把接收到的數(shù)據(jù)倒過(guò)來(lái)在輸入給lcd)
#include <reg52.h>
#include <STC12C5410AD.H>
#define uint unsigned int
#define uchar unsigned char


sbit DAT=P3^3;
sbit IO=P3^2;


sbit ledvcc=P3^7;
sbit led=P2^7;
sbit rs=P2^6;                                 
sbit rw=P2^1;
sbit lcde=P2^0;


sbit p0=P1^0;
sbit p1=P1^1;
sbit p2=P1^2;
sbit p3=P1^3;
sbit p4=P1^4;
sbit p5=P1^5;
sbit p6=P1^6;
sbit p7=P1^7;


uchar count;count1;count2;io;
uchar dat;


void init()
{
        P2M0=0X0C;                   //00001100
        P2M1=0X80;                   //10000000
        P3M0=0X01;                   //00000001
        P3M1=0X80;                   //10000000
              
        IT0=1;
        EX0=1;
        IT1=1;
        EX1=1;
        EA=1;//打開(kāi)總中斷
        
        ledvcc=1;
        led=0;
}


void IOdispose()
{
        while((IO==0)&&(count1<40))          //50us
        {
                count1++;
        }


        if(count1>39)
        {
                led=io&0x01;           //11.2us
                io>>=1;
                lcde=io&0x01;           //取出數(shù)據(jù)
                io>>=1;
                rw=io&0x01;
                io>>=1;
                rs=io&0x01;
                count1=io=0;
        }
}


void datdispose()
{
//    uchar dat1;


        while((DAT==0)&&(count2<40))          //50us
        {
                count2++;
        }


        if(count2>39)         
        {
                p0=dat>>7;          //把數(shù)據(jù)倒過(guò)來(lái),例:0x0f倒為0xf0
                dat<<=1;
                p1=dat>>7;
                dat<<=1;
                p2=dat>>7;
                dat<<=1;
                p3=dat>>7;
                dat<<=1;
                p4=dat>>7;
                dat<<=1;
                p5=dat>>7;
                dat<<=1;
                p6=dat>>7;
                dat<<=1;
                p7=dat>>7;
                dat=count2=0;
//                for(count=0;count<7;count++)
//                {
//                dat1=dat1|(dat&0x01);
//                dat>>=1;
//                dat1<<=1;
//                }

//                P1=dat1;
//                dat=dat1=count2=0;        
        }
}


void main()
{
    init();
        while(1)
        {
                IOdispose();
                datdispose();
        }
}


void Int0()        interrupt 0                //外部中斷0的中斷函數(shù)(IO)
{
        io++;
        count1=0;
}


void Int1()        interrupt 2                //外部中斷1的中斷函數(shù)(DAT)
{
        dat++;
        count2=0;
}


搞不懂的就是為什么這里這樣寫(xiě)為什么就不行
//                for(count=0;count<7;count++)        //把數(shù)據(jù)倒過(guò)來(lái),例:0x0f倒為0xf0
//                {
//                dat1=dat1|(dat&0x01);
//                dat>>=1;
//                dat1<<=1;
//                }

//                P1=dat;
//                dat=dat1=count2=0;        
如果這樣寫(xiě)就可以
                p0=dat>>7;          //把數(shù)據(jù)倒過(guò)來(lái),例:0x0f倒為0xf0
                dat<<=1;
                p1=dat>>7;
                dat<<=1;
                p2=dat>>7;
                dat<<=1;
                p3=dat>>7;
                dat<<=1;
                p4=dat>>7;
                dat<<=1;
                p5=dat>>7;
                dat<<=1;
                p6=dat>>7;
                dat<<=1;
                p7=dat>>7;
                dat=count2=0;


還有個(gè)更加奇怪的問(wèn)題是這樣把dat重打一行dat倒過(guò)來(lái)輸入給lcd就行 ,如果一起打在同一行就不行,這是為什么。我只知道這樣打所占的data是不同的(前者data小,后者大),就是由于這個(gè)以為不是問(wèn)題的問(wèn)題讓我弄了好久。大蝦們幫忙解決一下。
uchar count;count1;count2;io;
uchar dat;



下面是你想讓1602顯示內(nèi)容的程序,其實(shí)這通信協(xié)議很簡(jiǎn)單,看起來(lái)沒(méi)什么改變。


#include <reg52.h>
#include <intrins.h>
#include <STC12C5410AD.H>
#define uint unsigned int
#define uchar unsigned char


sbit IO=P2^2;
sbit DAT=P2^3;


sbit c=P2^0;


uchar rs;rw;lcde;led;count;
uchar dat1;
                                     //   00                10                  20                30                  40                50                  60                70                  80                90
uchar code charset[]="0123456789 abcdefghi jklmnopqr stuvwxyzA BCDEFGHIJ KLMNOPQRS TUVWSYZ., ?!<>=+-() ;*/%~#_[] {}:'      ";


uchar code charset_1[]="Welcome to use!!";   //歡迎使用
uchar code charset_2[]="     <PLD>      ";             //破力達(dá)


void delay_short(uint x)        //延時(shí)(us)
{
        while(x--);
}


void delay_long(uint y)                //延時(shí)(ms)
{
        uint i,j;
        y=7*y;
        for(i=y;i>0;i--)
        for(j=160;j>0;j--);
}


void sendIO()
{
        uchar com=2;
        com=com|rs;
        com<<=1;
        com=com|rw;
        com<<=1;
        com=com|lcde;
        com<<=1;
        com=com|led;
        while(com--)
        {
                IO=1;
                _nop_();   //_nop_()*9:1.1us
                _nop_();
                _nop_();
                _nop_();
                _nop_();   
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                IO=0;
                delay_short(5);         //11.3us
        }
        delay_short(80);         //80us        終止時(shí)間
        IO=1;        
}


void senddat()
{
        while(dat1--)
        {
                DAT=1;          //此IO口無(wú)法太快
                _nop_();            
                _nop_();
                _nop_();
                _nop_();
                _nop_();   
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                DAT=0;
                delay_short(5);         //11.3us
        }
        delay_short(80);         //80us         終止時(shí)間         
        DAT=1;        
}


void write_com(uchar com)       //寫(xiě)命令
{
        rs=0;
        rw=0;
        sendIO();         //發(fā)送IO口數(shù)據(jù)
        dat1=com;
        senddat();         //發(fā)送數(shù)據(jù)
        lcde=1;
        sendIO();         //發(fā)送IO口數(shù)據(jù)
        lcde=0;
        sendIO();         //發(fā)送IO口數(shù)據(jù)
}


void write_dat(uchar dat)       //寫(xiě)數(shù)據(jù)
{
        rs=1;
        rw=0;
        sendIO();         //發(fā)送IO口數(shù)據(jù)
        dat1=dat;
        senddat();         //發(fā)送數(shù)據(jù)
        lcde=1;
        sendIO();         //發(fā)送IO口數(shù)據(jù)
        lcde=0;
        sendIO();         //發(fā)送IO口數(shù)據(jù)
}


void lcde_init()
{
    led=0;                              
        write_com(0x38);                //設(shè)置顯示模式
        write_com(0x0c);                //開(kāi)顯示且光標(biāo)不顯示
        write_com(0x06);                //寫(xiě)一字符指針加一
        write_com(0x01);                //清屏
        delay_long(1);
        c=1;
}


void display()
{
    write_com(0x80);                    
        for(count=0;count<16;count++)         
        {
                write_dat(charset_1[count]);
        }


        write_com(0xc0);                    
        for(count=0;count<16;count++)         
        {
                write_dat(charset_2[count]);
        }
        delay_long(1000);
}


void main()
{        
        lcde_init();          //初始化LCDE
        while(1)
        {
                display();
        }
}





隨便畫(huà)個(gè)電路



評(píng)分

參與人數(shù) 1威望 +50 黑幣 +50 收起 理由
admin + 50 + 50 共享資料的積分獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:106423 發(fā)表于 2016-2-26 12:18 | 只看該作者
樓主,有急事請(qǐng)教你,能否加我q  2426449464, 萬(wàn)分感謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:79544 發(fā)表于 2016-3-19 17:49 | 只看該作者
uchar rs,rw,lcde,led,count,dat1;這樣寫(xiě)對(duì)吧。你試試
回復(fù)

使用道具 舉報(bào)

地板
ID:164089 發(fā)表于 2017-12-27 17:16 來(lái)自手機(jī) | 只看該作者
用兩cd4094就可以解決問(wèn)題
回復(fù)

使用道具 舉報(bào)

5#
ID:704585 發(fā)表于 2020-6-18 09:58 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人高清 | 丁香久久 | 免费观看国产视频在线 | 一区二区三区四区不卡视频 | 久草a√| 亚洲一区国产 | 亚洲精品电影在线观看 | 一级大片免费 | 91一区二区三区在线观看 | 午夜免费电影院 | 免费视频一区二区 | 日韩成人在线观看 | 欧美一级大片 | 久久成人精品视频 | 亚洲精品一区二 | 亚洲精品一区二区三区中文字幕 | 国产ts人妖系列高潮 | 日韩中文一区 | 精品麻豆剧传媒av国产九九九 | 日韩精品免费在线观看 | 久久精品亚洲国产奇米99 | 日本精品一区二区三区在线观看视频 | 国产精品成av人在线视午夜片 | 中文字幕精品一区二区三区在线 | 亚洲精品视频观看 | 久草99| 精品视频免费 | 国产精品欧美一区二区 | 日本超碰| www.日韩欧美 | 中文字幕黄色大片 | 免费看一区二区三区 | 久久久久亚洲精品 | 精品久久国产 | 欧美日韩国产一区二区三区不卡 | 精品国产乱码久久久久久影片 | 在线播放亚洲 | 在线视频亚洲 | 成人午夜精品 | 亚洲国产精品一区二区第一页 | 日韩1区2区|