帶字型檔12864顯示矩形波 單片機

來源:互聯網
上載者:User

#include <reg52.h>
#include <intrins.h>
#include <math.h>
//------------定義介面-------------//
sbit RS=P2^2 ;
sbit RW=P2^3 ;
sbit E=P2^4;
sbit PSB= P2^5;   //H=並口; L="串口";
#define Lcd_Bus P0
// P0 接 LCM
#define uchar unsigned char
#define FIRST_ADDR 0
//定義字元/漢字顯示起始位置
/*------------------檢查忙位-----------------------------*/
void chk_busy()
{
    RS=0 ;
    RW=1 ;
    E=1 ;
    Lcd_Bus=0xff ;
    while((Lcd_Bus&0x80)==0x80);
    E=0 ;
}
/*------------------延時子程式-----------------------------*/
void delay(unsigned int t)
{
    unsigned int i,j ;
    for(i=0;i<t;i++)
    for(j=0;j<10;j++);
}

/*------------------寫命令到LCD------------------------------*/
void write_com(unsigned char cmdcode)
{
    chk_busy();
    RS=0 ;
    RW=0 ;
    E=1 ;
    Lcd_Bus=cmdcode ;
    delay(5);
    //------------------在資料寫入的時候加入適當的延時
    E=0 ;
    delay(5);
}

/*-------------------寫資料到LCD----------------------------*/
void write_data(unsigned char Dispdata)
{
    chk_busy();
    RS=1 ;
    RW=0 ;
    E=1 ;
    Lcd_Bus=Dispdata ;
    delay(5);
    //------------------在資料寫入的時候加入適當的延時
    E=0 ;
    delay(5);
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
    PSB = 1;
    delay(2000);
    write_com(0x30);
    delay(10);
    //選擇基本指令集
    write_com(0x30);
    //選擇8bit資料流
    delay(5);
    write_com(0x0c);
    //開顯示(無遊標、不反白)
    delay(10);
    write_com(0x01);
    //清除顯示,並且設定地址指標為00H
    delay(500);
    write_com(0x06);
    //指定在資料的讀取及寫入時,設定遊標的移動方向及指定顯示的移位
    delay(0);
}
/*------------------顯示字串--------------------------*/
void hzkdis(unsigned char code*s)
{
    while(*s>0)
    {
        write_data(*s);
        s++;
        delay(50);
    }
}
/*------------------首屏顯示--------------------------*/
void ceshi()
{
    write_com(0x01);
    //清除顯示,並且設定地址指標為00H
    delay(5);
   
    write_com(0x80);
    //第一行(如果是地址是:80H,即LCD的第一行的第一個位置顯示)
    hzkdis("南京郵電大學");
   
    write_com(0x90);
    //第二行(如果是地址是:90H,即LCD的第二行的第一個位置顯示)
    hzkdis("通訊與資訊工程");
   
    write_com(0x88);
    //第三行(如果是地址是:88H,即LCD的第二行的第一個位置顯示)
    hzkdis("電子資訊工程");
   
    write_com(0x98);
    //第四行(如果是地址是:98H,即LCD的第二行的第一個位置顯示)
    hzkdis("鄭海波測試程式");
}
//------------------清整個GDRAM空間----------------------------
void clrgdram()
{
    unsigned char x,y ;
    for(y=0;y<64;y++)
    for(x=0;x<16;x++)
    {
        write_com(0x34);
        write_com(y+0x80);
        //行地址
        write_com(x+0x80);
        //列地址
        write_com(0x30);
        write_data(0x00);
        write_data(0x00);
    }
}
//------------------------------------------------------------
void clrscreen()
{
    write_com(0x01);
    delay(10);
}
unsigned char ReadByte(void)
{
    unsigned char byReturnValue ;
    chk_busy();
    Lcd_Bus=0xff ;
    RS=1 ;
    RW=1 ;
    E=0 ;
    E=1 ;
    byReturnValue=Lcd_Bus ;
    E=0 ;
   
    return byReturnValue ;
}

/*增加畫點子程式
函數功能:在座標為(x,y)點畫一個點
參數意義
X:12864螢幕的橫座標,範圍是0到128(從左至右)
Y:12864的縱座標,範圍是0到64(從上到下)
Color:為1的時候表示為黑點
*/
void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
    unsigned char Row,Tier,Tier_bit ;
    unsigned char ReadOldH,ReadOldL ;
    write_com(0x34);
    write_com(0x36);
    Tier=X>>4 ;
    Tier_bit=X&0x0f ;
    if(Y<32)
    {
        Row=Y ;
    }
    else
    {
        Row=Y-32 ;
        Tier+=8 ;
    }
    write_com(Row+0x80);
    write_com(Tier+0x80);
    ReadByte();
    ReadOldH=ReadByte();
    ReadOldL=ReadByte();
    write_com(Row+0x80);
    write_com(Tier+0x80);
    if(Tier_bit<8)
    {
        switch(Color)
        {
            case 0 :
            ReadOldH&=(~(0x01<<(7-Tier_bit)));
            break ;
            case 1 :
            ReadOldH|=(0x01<<(7-Tier_bit));
            break ;
            case 2 :
            ReadOldH^=(0x01<<(7-Tier_bit));
            break ;
            default :
            break ;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
    else
    {
        switch(Color)
        {
            case 0 :
            ReadOldL&=(~(0x01<<(15-Tier_bit)));
            break ;
            case 1 :
            ReadOldL|=(0x01<<(15-Tier_bit));
            break ;
            case 2 :
            ReadOldL^=(0x01<<(15-Tier_bit));
            break ;
            default :
            break ;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
    write_com(0x30);
}
void juxingbo(void)//顯示矩形波
{
    uchar i,j,colour=1,flag=0;
 uchar zhan=20;//為電平'1'的時間長度
 uchar high=2;//高電平的位置
 uchar low=62;//低電平的位置
   for(i=0;i<128;i++)
    {
         if(i%zhan==0)
         {
           for(j=high;j<=low;j++)
            DrawPoint(i,j,colour);
           if(flag==0)
              flag=1;
           else
              flag=0;
         }
         else
         {
          if(flag==0)
              j=high;
           else
              j=low;
           DrawPoint(i,j,colour);
         }
    }
}
void main(void)
{
 
    RW=0;
    lcdreset();
    ceshi();
    clrgdram();
    delay(2000);
    clrscreen();
    juxingbo();
    delay(5000);
    while(1);
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.