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

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

ST7920 12864 經(jīng)典函數(shù)

作者:佚名   來源:不詳   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月17日   【字體:

 void  LCD12864Init(void)           //LCD12864字庫初始化程序

{
 Delay_nms(100); //大于40MS的延時(shí)程序             
 PSB = 1;  //設(shè)置為8BIT并口工作模式
 Delay_nus(1);
 RST = 0;
 Delay_nms(100); //大于40MS的延時(shí)程序              
 RST = 1;  //復(fù)位置高
 Delay_nms(100);
 
 
 Delay_nms(50);
 LCD12864_Write(COMMAND,0x30);  //Extended Function Set :8BIT設(shè)置,RE=0: basic instruction set, G=0 :graphic display OFF
 Delay_nms(120);         //大于100uS的延時(shí)程序
 LCD12864_Write(COMMAND,0x30);  //Function Set
 Delay_nms(40);          //大于37uS的延時(shí)程序
 LCD12864_Write(COMMAND,0xC0);  //Display on Control
 Delay_nms(120);         //大于100uS的延時(shí)程序
 LCD12864_Write(COMMAND,0x10);  //Cursor Display Control光標(biāo)設(shè)置
 Delay_nms(120);         //大于100uS的延時(shí)程序
 LCD12864_Write(COMMAND,0x0C);  //Display Control,D=1,顯示開
 Delay_nms(120);         //大于100uS的延時(shí)程序
 LCD12864_Write(COMMAND,0x01);  //Display Clear
 Delay_nms(15);          //大于10mS的延時(shí)程序
 LCD12864_Write(COMMAND,0x06);  //Enry Mode Set,光標(biāo)從右向左加1位移動
 Delay_nms(120);         //大于100uS的延時(shí)程序
 
 
}
 
void LCD12864WaitForReady(void)
{
    unsigned char temp;
#ifdef _Use_LCD12864OnlyWrite
 Delay_nus(30);
#else
 LCD12864_SetReadData;
 LCD12864_RS = 0;
 LCD12864_RW = 1;
   
 do
 {
        LCD12864_EN = Enable;
  Delay_nus(1); 
  temp = LCD12864_Data_PIN;
  Delay_nus(1);
  LCD12864_EN = Disable;
 }while (temp & 0x80);  //RW=1,讀PD7,為0表示空閑;
  
    LCD12864_EN = Disable;
 LCD12864_SetWriteData;
 
#endif
}
 
void LCD12864_Write(unsigned char cmdordata,unsigned char Data)  //傳送數(shù)據(jù)或者命令,當(dāng)cmdordata=0是,傳送命令,當(dāng)cmdordata=1,傳送數(shù)據(jù).
{
    LCD12864WaitForReady();
 LCD12864_EN = 0;
 LCD12864_RW = 0;
 Delay_nus(1);
 if(cmdordata == 0)
 {
  LCD12864_RS = 0;
 }
 else
 {
  LCD12864_RS = 1;
 }
 Delay_nus(1);
 LCD12864_Data_Port = Data;
 LCD12864_EN = 1;
 Delay_nus(1);
 LCD12864_EN = 0;
}
 
unsigned char LCD12864_Read(void)
{
 unsigned char data;
    LCD12864WaitForReady();
 LCD12864_SetReadData;
 LCD12864_RS = 1;
 Delay_nus(1);
 LCD12864_RW = 1;
    Delay_nus(1);
 LCD12864_EN = 1;
 Delay_nus(1);
 data = LCD12864_Data_PIN;
 LCD12864_EN = 0;
 LCD12864_SetWriteData;
 return data;
}
void LCD12864_Clean(void)
{
    unsigned char x,y;
    LCD12864_Write(COMMAND,GRAPH_ON);
    LCD12864Init();     //設(shè)置擴(kuò)展指令集,按手冊說明,僅設(shè)置了繪圖位,
    LCD12864_Write(COMMAND,GRAPH_ON); //需要兩次,本次設(shè)置擴(kuò)展指令集。
 
    for (y=0;y<32;y++)
    {
        LCD12864_Write(COMMAND,0x80+y); //設(shè)置y=0000+000x,y+1則往下一行
        LCD12864_Write(COMMAND,0x80); //設(shè)置x=0000 0000
        for (x=0;x<16;x++)
        {
            LCD12864_Write(DATA,0x00);   //高字節(jié)數(shù)據(jù)
            LCD12864_Write(DATA,0x00); //低字節(jié)數(shù)據(jù)
        }
    }
}
void Serial_DDRAM_Address_Set(unsigned char ucDDramAdd)
{
 LCD12864_Write(COMMAND,BASIC_FUNCTION);   //基本指令集
 LCD12864_Write(COMMAND,ucDDramAdd);    //設(shè)定DDRAM地址到地址計(jì)數(shù)器AC
}
void Overturn_Char(unsigned char x,unsigned char y,unsigned char wide,unsigned char cor)
{
    unsigned char i,base_x,colour;
 if(cor == 1) colour = 0xFF;
 if(cor == 0) colour = 0x00;
 LCD12864_Write(COMMAND,GRAPH_OFF);
 if(y == 1 || y == 2)    base_x = 0x80;
 if(y == 3 || y == 4)    base_x = 0x88;
    if(x % 2)
 {
     for(i = 0;i < wide; i ++)
  {
         LCD12864_Write(COMMAND,0X80 - 16 + y * 16 + i);
         LCD12864_Write(COMMAND,base_x+(x/2));
      LCD12864_Write(DATA,colour);
      LCD12864_Write(DATA,0x00);
  }
 }
 else
 {
     for(i = 0;i < wide; i ++)
  {
         LCD12864_Write(COMMAND,0X80 - 16 + y * 16 + i);
         LCD12864_Write(COMMAND,base_x+(x/2)-1);
      LCD12864_Write(DATA,0x00);
      LCD12864_Write(DATA,colour);
  }
 } 
 LCD12864_Write(COMMAND,GRAPH_ON);  
}
void Overturn_Font(unsigned char x,unsigned char y,unsigned char wide,unsigned char cor)
{
    unsigned char i,base_x,colour;
 if(cor == 1) colour = 0xFF;
 if(cor == 0) colour = 0x00;
 LCD12864_Write(COMMAND,GRAPH_OFF);
 if(y == 1 || y == 2)    base_x = 0x80;
 if(y == 3 || y == 4)    base_x = 0x88;
 
    for(i = 0;i < wide;i ++)
 {
     LCD12864_Write(COMMAND,0X80 - 16 + y * 16 + i); //- 16 + y * 16 + i);
     LCD12864_Write(COMMAND,base_x+x-1);
  LCD12864_Write(DATA,colour);
  LCD12864_Write(DATA,colour);
 }
 LCD12864_Write(COMMAND,GRAPH_ON);
}
void GUI_Point(unsigned char y,unsigned char x,unsigned colour)
{
    unsigned char GDRAM_hbit,GDRAM_lbit;
    unsigned char x_Dyte,x_byte;                 //定義列地址的字節(jié)位,及在字節(jié)中的哪1位
    unsigned char y_Dyte,y_byte;       
    x--;y--;          //定義為上下兩個(gè)屏(取值為0,1),行地址(取值為0~31)
   
    x_Dyte=y/16;                                         //計(jì)算在16個(gè)字節(jié)中的哪一個(gè)
    x_byte=y&0x0f;                                     //計(jì)算在該字節(jié)中的哪一位
    y_Dyte=x/32;                                         //0為上半屏,1為下半屏
    y_byte=x&0x1f;                                     //計(jì)算在0~31當(dāng)中的哪一行
   
    LCD12864_Write(COMMAND,0x80+y_byte);                     //設(shè)定行地址(y坐標(biāo))
    LCD12864_Write(COMMAND,0x80+x_Dyte+8*y_Dyte);         //設(shè)定列地址(x坐標(biāo)),并通過8*y_Dyte選定上下屏
                           
    LCD12864_Read();
    GDRAM_hbit=LCD12864_Read();                         //讀取當(dāng)前顯示高8位數(shù)據(jù)
    GDRAM_lbit=LCD12864_Read();                         //讀取當(dāng)前顯示低8位數(shù)據(jù)
    Delay_nus(1);
   
    if(colour==1)
    {
  LCD12864_Write(COMMAND,0x80+y_byte);                     //設(shè)定行地址(y坐標(biāo))
  LCD12864_Write(COMMAND,0x80+x_Dyte+8*y_Dyte);         //設(shè)定列地址(x坐標(biāo)),并通過8*y_Dyte選定上下屏
  Delay_nus(1);
 
        if(x_byte<8)                                             //判斷其在高8位,還是在低8位
  {
   LCD12864_Write(DATA,GDRAM_hbit|(0X01<<(7-x_byte)));     //顯示GDRAM區(qū)高8位數(shù)據(jù)
   LCD12864_Write(DATA,GDRAM_lbit);                             //顯示GDRAM區(qū)低8位數(shù)據(jù)
        }
        else
        {
   LCD12864_Write(DATA,GDRAM_hbit);
   LCD12864_Write(DATA,GDRAM_lbit|(0x01<<(15-x_byte)));
        }
    }
    else
    {
  LCD12864_Write(COMMAND,0x80+y_byte);                     //設(shè)定行地址(y坐標(biāo))
  LCD12864_Write(COMMAND,0x80+x_Dyte+8*y_Dyte);         //設(shè)定列地址(x坐標(biāo)),并通過8*y_Dyte選定上下屏
  Delay_nus(1);
 
        if(x_byte<8)                                             //判斷其在高8位,還是在低8位
  {
   LCD12864_Write(DATA,GDRAM_hbit & ~(0X01<<(7-x_byte)));     //顯示GDRAM區(qū)高8位數(shù)據(jù)
   LCD12864_Write(DATA,GDRAM_lbit);                             //顯示GDRAM區(qū)低8位數(shù)據(jù)
        }
        else
        {
   LCD12864_Write(DATA,GDRAM_hbit);
   LCD12864_Write(DATA,GDRAM_lbit & ~(0x01<<(15-x_byte)));
        }
 }
 
}
 
void GUI_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)
{
    int temp;
    int dx,dy;               //定義起點(diǎn)到終點(diǎn)的橫、縱坐標(biāo)增加值
    int s1,s2,status,i;
    int Dx,Dy,sub;
 
    dx = x1 - x0;
    if(dx >= 0)                 //X的方向是增加的
        s1 = 1;
    else                     //X的方向是降低的
        s1 = -1;    
    dy = y1 - y0;                 //判斷Y的方向是增加還是降到的
    if(dy >= 0)
        s2 = 1;
    else
        s2 =- 1;
 
    Dx = abs(x1-x0);             //計(jì)算橫、縱標(biāo)志增加值的絕對值
    Dy = abs(y1-y0);
      
    if(Dy > Dx)                             
    {                     //以45度角為分界線,靠進(jìn)Y軸是status=1,靠近X軸是status=0
        temp = Dx;
        Dx = Dy;
        Dy = temp;
    status = 1;
    }
    else
        status = 0;
 
 
 
    sub = Dy + Dy - Dx;                 //第1次判斷下個(gè)點(diǎn)的位置
    for(i = 0;i < Dx;i ++)
    {
        GUI_Point(x0,y0,colour);           //畫點(diǎn)
        if(sub >= 0)                              
        {
            if(status == 1)               //在靠近Y軸區(qū),x值加1
                x0 += s1;
            else                     //在靠近X軸區(qū),y值加1              
                y0 += s2;
            sub -= (Dx + Dx);                 //判斷下下個(gè)點(diǎn)的位置
        }
        if(status == 1)
            y0 += s2;
        else      
            x0 += s1;
        sub += Dy + Dy;
       
    }
}
 
void plotC(int x,int y,int xc,int yc,unsigned char colour)
{
    GUI_Point(xc+x,yc+y,colour);
    GUI_Point(xc+x,yc-y,colour);
    GUI_Point(xc-x,yc+y,colour);
    GUI_Point(xc-x,yc-y,colour);
    GUI_Point(xc+y,yc+x,colour);
    GUI_Point(xc+y,yc-x,colour);
    GUI_Point(xc-y,yc+x,colour);
    GUI_Point(xc-y,yc-x,colour);
}
 
void GUI_Circle(int xc,int yc,int r,unsigned char colour)
{
    int x,y,d;
    y = r;
    d = 3 - (r + r);
    x = 0;
    while(x <= y)
    {
        plotC(x,y,xc,yc,colour);
        if(d < 0)
            d += (x + x + x + x) + 6;
        else
        {
            d+=((x - y) + (x - y) + (x - y) + (x - y)) + 10;
            y = y - 1;
        }
        x = x + 1;
    }
}
void GUI_Full(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)
{
    unsigned char i,j;
 for(j = y0;j <= y1;j ++)
     for(i = x0;i <= x1;i ++)
      GUI_Point(i,j,colour);
}
 
 
 
 
關(guān)閉窗口
主站蜘蛛池模板: 91中文字幕在线观看 | 日韩在线不卡视频 | 国产午夜精品一区二区三区嫩草 | 91精品国产色综合久久 | 欧美极品一区二区 | 九九99久久| 成人精品一区二区三区中文字幕 | 成人在线黄色 | 毛片一区二区三区 | 嫩呦国产一区二区三区av | 毛片网站在线观看 | 综合国产第二页 | 久久久久9999亚洲精品 | 日本韩国欧美在线观看 | 色综合久 | 色综合激情 | 国产精品18久久久久久白浆动漫 | 粉嫩粉嫩芽的虎白女18在线视频 | 国产在线精品区 | 97伦理电影网 | 91一区二区 | 国产一区二区在线91 | 日批免费看 | 国产在线一区二区 | 久久综合爱 | 一区二区三区在线 | 999免费观看视频 | 国产精品视频一区二区三区四区国 | 精品国产乱码久久久久久中文 | 一区二区三区在线播放 | 天堂精品 | 一区二区在线免费观看 | 国产精品大片 | 日韩中文字幕2019 | 国产精品久久久久久久久久久免费看 | 99精品欧美一区二区蜜桃免费 | 色av一区| 日韩高清一区 | 91资源在线 | 免费一区 | 亚洲成人一区 |