新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機1602液晶程序

        51單片機1602液晶程序

        作者: 時間:2016-11-19 來源:網絡 收藏
        #include

        #define Lcd_Data P0
        sbit RS=P2^0;
        sbit RW=P2^1;
        sbit E=P2^2;
        sbit Busy=P0^7;
        sbit k1=P1^0;
        sbit k2=P1^1;
        sbit k3=P1^2;
        sbit k4=P1^3;
        sbit buzzer=P3^7;
        unsigned int hour,min,second,day,month,year; ////////定義的幾個時間
        unsigned char code Time[] = {"Time: "};////用于顯示
        unsigned char code num[] = {"0123456789ABCDEF"};/////////////用于液晶顯示
        unsigned char code haha[]={"^_^"};
        unsigned char code middle[]={":"};
        unsigned int numberflag;
        unsigned int number;
        unsigned code heart[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
        0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
        0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
        0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
        0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心圖案
        unsigned int t0_1S;//定義0.1S變量
        unsigned char keyvalue;//定義鍵值
        void delay(unsigned int time)/////////////////////////////////////////////延時程序
        {
        while(time--);
        }
        void Delay_1ms(unsigned char t)///////////////////////////精確延時子程序,延時 1MS*t S
        {
        unsigned char a;
        while(--t != 0)
        {
        for(a = 0; a < 125; a++);
        }
        }
        ////////////////////////////////////////////////
        ///////////////////////////////////////////////////
        //////////////////////////////////////////////////液晶的程序
        void Read_Busy(void)
        {
        do{ Lcd_Data=0xff;
        RS=0;
        RW=1;
        E=0;
        delay(2);
        E=1;}while(Busy);
        }
        void Write_Comn(unsigned char comn)
        {
        Lcd_Data=comn;
        RS=0;
        RW=0;
        E=0;
        Read_Busy();
        E=1;
        }
        void Write_Data(unsigned char Lcddata)
        {
        Lcd_Data=Lcddata;
        RS=1;
        RW=0;
        E=0;
        Read_Busy();
        E=1;

        本文引用地址:http://www.104case.com/article/201611/318331.htm

        }
        void init()
        {
        Write_Comn(0x01);///清顯示
        delay(50);
        Write_Comn(0x02);//光標位于左上方
        Write_Comn(0x38);//5*8點陣 8位2行
        Write_Comn(0x06);// 文字不動,光標右移
        Write_Comn(0x0f);///光標閃爍
        }
        ////////////////////////////////////////////////////
        //////////////////////////////////////////////
        ////////////////////////////////////////////////////
        ///////////////////////////////////////////以上為lcd的程序;
        /////////////////////////////////////////以下為鍵盤掃描的程序
        void KEY4X4_scan(void)
        {
        keyvalue=0x00;//無按鍵時返回Ox00
        P1=0xFE;//掃描第1行
        delay(1);
        if((P1&0xF0)!=0xF0)
        keyvalue=(P1>>4)|0x10;//返回鍵值
        P1=0xFD;//掃描第2行
        delay(1);
        if((P1&0xF0)!=0xF0)
        keyvalue=(P1>>4)|0x20;//返回鍵值
        P1=0xFB;//掃描第3行
        delay(1);
        if((P1&0xF0)!=0xF0)
        keyvalue=(P1>>4)|0x30;//返回鍵值
        P1=0xF7;//掃描第4行
        delay(1);
        if((P1&0xF0)!=0xF0)
        keyvalue=(P1>>4)|0x40;//返回鍵值
        //return keyvalue;
        }
        //////////////////////////////////////////////////
        /////////////////////////////////////////////////
        ///////////////////////////////////////////////秒表程序
        void seconddisplay(void)//顯示時間
        {
        unsigned char aa = 0, bb = 0, cc = 0, dd = 0,ee = 0;//定義時間各個位
        if(t0_1S>60000)t0_1S=0;
        aa=t0_1S/10000;
        bb=t0_1S%10000/1000;
        cc=t0_1S%1000/100;
        dd=t0_1S%100/10;
        ee=t0_1S%10;
        Write_Comn(0xc9);
        Write_Data(num[aa]);
        Write_Data(num[bb]);
        Write_Data(num[cc]);
        Write_Data( num[dd] );
        Write_Data(.);
        Write_Data(num[ee]);
        Write_Data(S);

        }

        /////////////////////////////////////////////////////////////秒表
        void mysecond()
        { unsigned int i;
        init();//初始化液晶
        Write_Comn(0x01);//清顯示
        k1=1;k2=1;
        t0_1S=0;
        Write_Comn(0x80);

        for(i=0;i<16;i++)
        {
        Write_Data( Time[i] );//顯示time字樣
        }
        run:
        seconddisplay();
        if(k1==0)
        {
        while(1)
        {
        Delay_1ms(100);//延時0.1S
        t0_1S++;
        seconddisplay();
        if(k2==0)
        {
        while(1)
        {
        if(k1==0)break;
        if(k3==0){t0_1S=0;
        goto over;
        }
        }
        }
        }
        }
        goto run;
        over:
        t0_1S=0;

        }
        ///////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////
        void showheart()
        {
        unsigned int i; // char m=0;
        init();
        Write_Comn(0x40); //設定CGRAM地址
        for(i=0;i<64;i++) //將心型代碼寫入CGRAM中
        {
        Write_Data(heart[i]);
        }
        Write_Comn(0x85); //設定上排的顯示位置
        for(i=0;i<4;i++) //顯示心型圖案的上半部分
        {
        Write_Data(i);
        }
        Write_Comn(0xc5); //將顯示坐標轉移到下排和上排相對應的地方
        for(i=4;i<8;i++) //顯示心型圖案的下半部分
        {
        Write_Data(i);
        }


        }
        //////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////
        /////////////////////////////////////////////
        ////////////////////////////////////////////////
        ///////////////////////////////////定時器中斷的初始化
        void init_int()
        {
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;
        TR0=1;
        EA=1;
        }
        void edit(unsigned int t)////////////////////////////對月,天 時 分 秒的計算
        {
        unsigned int a,b;
        a=t/10;
        b=t%10;
        Write_Data(num[a]);
        Write_Data(num[b]);
        }
        void showmiddle(unsigned int x)///////////////////////////////顯示冒號的函數
        { Write_Comn(x);
        Write_Data(middle[0]);
        }
        void showhaha(unsigned int x)//////////////////////////////////顯示笑臉的函數
        {unsigned int i;
        Write_Comn(x);
        for(i=0;i<3;i++)
        Write_Data(haha[i]);
        }
        void showtime()
        {unsigned int a,b,c,d;


        a=year/1000;
        b=(year%1000)/100;
        c=((year%1000)%100)/10;
        d=year%1000%100%10;
        init();
        showhaha(0x80); /////////////////////////////////顯示笑臉
        Write_Comn(0x80+3);
        Write_Data(num[a]);
        Write_Data(num[b]);
        Write_Data(num[c]);
        Write_Data(num[d]);

        showmiddle(0x80+7); ////////////////////////////顯示冒號
        Write_Comn(0x80+8);
        edit(month);

        showmiddle(0x80+10); ////////////////////////////顯示冒號
        Write_Comn(0x80+11);
        edit(day);
        showhaha(0x80+13);///////////////////////////////////////顯示笑臉
        showhaha(0xc0+1); //////////////////////////////////////顯示笑臉
        Write_Comn(0xc0+4);
        edit(hour);

        showmiddle(0xc0+6); ////////////////////////////顯示冒號
        Write_Comn(0xc0+7);
        edit(min);

        showmiddle(0xc0+9); /////////////////////////////////顯示冒號
        Write_Comn(0xc0+10);
        edit(second);
        showhaha(0xc0+12);////////////////////////////////顯示笑臉
        }
        //////////////////////////////////
        /////////////////////////////////////
        ///////////////////////////////鍵盤上顯示數字的小函數
        void shownumber()
        {
        numberflag=0;
        Write_Comn(0x80+number-1);
        Write_Data(num[number]);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大兴区| 徐闻县| 荣昌县| 泰兴市| 太仓市| 宜兰县| 永城市| 广安市| 盖州市| 云梦县| 河源市| 三亚市| 微博| 昔阳县| 拉萨市| 宾阳县| 江津市| 武鸣县| 遂川县| 霍山县| 阳曲县| 泰兴市| 武山县| 福泉市| 繁昌县| 丰台区| 梧州市| 宣武区| 桐梓县| 建湖县| 米泉市| 金坛市| 东源县| 乌兰县| 云南省| 普洱| 金寨县| 岑巩县| 黎平县| 万宁市| 蒲江县|