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

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

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

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

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

{
 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,顯示開(kāi)
 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位移動(dòng)
 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ò)展指令集,按手冊(cè)說(shuō)明,僅設(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)),并通過(guò)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)),并通過(guò)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)),并通過(guò)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)志增加值的絕對(duì)值
    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);           //畫(huà)點(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)閉窗口
主站蜘蛛池模板: av在线播放国产 | 99精品欧美一区二区蜜桃免费 | 国产高清一二三区 | 最新中文字幕在线 | 精品国产精品国产偷麻豆 | 成人在线小视频 | 国产一区在线视频 | 成人国产一区二区三区精品麻豆 | 日韩三级电影在线看 | 羞羞视频网站 | 欧美成年黄网站色视频 | 性色在线 | 中文字幕亚洲视频 | 一区二区福利视频 | 在线永久看片免费的视频 | 久久小视频 | 四虎影院在线播放 | 91电影 | 艹逼网 | 欧美日韩专区 | 欧美综合一区 | 成人av一区二区在线观看 | 日本不卡一区二区 | 欧美国产一区二区三区 | 精品网| 三级免费网 | 青青久久av北条麻妃海外网 | 国产精品久久久久久久久久久久午夜片 | 成人黄色三级毛片 | 99在线精品视频 | 午夜三区 | 久久综合一区二区三区 | 中文字字幕在线中文乱码范文 | 1级毛片 | 狠狠操狠狠干 | 怡红院怡春院一级毛片 | 美国a级毛片免费视频 | 亚洲久久| a视频在线观看 | 日韩精品一区二区三区视频播放 | 玖玖在线免费视频 |