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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4405|回復: 1
打印 上一主題 下一主題
收起左側

12864增加畫點功能程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:26188 發表于 2015-2-18 01:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//LCD顯示器端口定義
#define LCD_RS          P21    // LCD數據/命令(H/L)選擇端
#define LCD_RW          P22    // LCD讀/寫(H/L)選擇端
#define LCD_EN          P23    // LCD使能信號高有效
#define LCD_DATA        P0     // LCD并行數據線
#define LCD_BUSY        P07    // LCD忙信號位
//12864特殊端口
//#define LCD_12864_CSA P24    // LCD12864左半屏選擇端
//#define LCD_12864_CSB P25    // LCD12864右半屏選擇端
//12864基本指令集********************************************************************
#define LCD_12864_CLR                   0x01    //清屏,AC、光標歸零,DDRAM填滿0x20H
#define LCD_12864_GO_HOME               0x02    //AC、光標歸零,DDRAM不改變
//輸入方式設置
#define LCD_12864_AC_AUTO_INCREMENT     0x06    //數據讀、寫操作后,AC自動增一
#define LCD_12864_AC_AUTO_DECREASE      0x04    //數據讀、寫操作后,AC自動減一
#define LCD_12864_MOVE_ENABLE           0x05    //數據讀、寫操作,畫面平移
#define LCD_12864_MOVE_DISENABLE        0x04    //數據讀、寫操作,畫面不動
//設置顯示、光標及閃爍開、關
#define LCD_12864_DISPLAY_ON            0x0C    //顯示開
#define LCD_12864_DISPLAY_OFF           0x08    //顯示關
#define LCD_12864_CURSOR_ON             0x0A    //光標顯示
#define LCD_12864_CURSOR_OFF            0x08    //光標不顯示
#define LCD_12864_CURSOR_BLINK_ON       0x09    //光標閃爍
#define LCD_12864_CURSOR_BLINK_OFF      0x08    //光標不閃爍
//光標、畫面移動,不影響DDRAM
#define LCD_12864_LEFT_MOVE             0x18    //LCD顯示(整屏)左移一位 0x05
#define LCD_12864_RIGHT_MOVE            0x1C    //LCD顯示(整屏)右移一位 0x07
#define LCD_12864_CURSOR_LEFT_MOVE      0x10    //光標左移一位
#define LCD_12864_CURSOR_RIGHT_MOVE     0x14    //光標右移一位
//指令集設置
#define LCD_12864_BASIC_INSTRUCTION     0x30    //使用基本指令集
#define LCD_12864_EXPAND_INSTRUCTION    0x34    //使用擴充指令集
//地址設定
#define LCD_12864_BASIC_CGRAM           0x40    //設定CGRAM地址到地址計數器(AC)64X256 點陣顯示RAM(GDRAM)。
#define LCD_12864_BASIC_DDRAM           0x80    //設定DDRAM地址到地址計數器(AC)
//12864擴充指令集********************************************************************
#define LCD_12864_ORDER                 0x01    //待命模式將DDRAM 填滿“ 20H ”, 并且設定DDRAM 的地址計數器(AC)到“00H”
#define LCD_12864_IRAM_ON               0x02    //允許輸入IRAM地址
#define LCD_12864_VERTICAL_ADDRESS_ON   0x03    //允許輸入垂直卷動地址
//反白顯示
#define LCD_12864_UP_ONE                0x04    //第一行反白顯示
#define LCD_12864_UP_TWO                0x05    //第二行反白顯示
#define LCD_12864_UP_THREE              0x06    //第三行反白顯示
#define LCD_12864_UP_FOUR               0x07    //第四行反白顯示
//睡眠模式
#define LCD_12864_SLEEP_ON              0x08    //進入睡眠模式
#define LCD_12864_SLEEP_OFF             0x0c    //脫離睡眠模式
//在擴充指令集時的指令選擇
#define LCD_12864_BASIC_INSTRUCTION     0x30    //基本指令集
#define LCD_12864_EXPAND_INSTRUCTION    0x34    //擴充指令集
#define LCD_12864_DRAW_OFF              0x34    //繪圖顯示關
#define LCD_12864_DRAW_ON               0x36    //繪圖顯示開
//地址設定
#define LCD_12864_EXPAND_IRAM           0x40    //SR=1:AC5—AC0 為垂直卷動地址SR=0:AC3—AC0 為ICON IRAM 地址
#define LCD_12864_EXPAND_CGRAM          0x80    //設定CGRAM 地址到地址計數器(AC)
//LCD函數聲明*************************************************************************
void LCD_Delay_us(unsigned int us);                        //LCD延時微秒級
unsigned char LCD_BUSY_Bit(void);                          //解決忙問題
void LCD_Write_Command(unsigned char byteData);        //寫指令
void LCD_Write_DATA(unsigned char byteData);               //寫數據
unsigned char LCD_Read_Data();                             //從內部RAM讀取數據
void LCD_12864_Initialization(void);                       //12864初始化
void LCD_12864_bitInitialization(void);                    //圖形初始化
void LCD12864_WH_String(unsigned char x,unsigned char y,unsigned char *s); //寫入字符函數
void LCD_Read_dat_I(unsigned char *xp,unsigned char *yp);  //讀繪圖RAM指定點數據函數
void cls_lcd(unsigned char dat);                                            //初始化繪圖RAM并清屏函數
void LCD_DrawingPoint(unsigned char xp,unsigned char yp,bit dat);  //繪圖RAM畫點函數  
//寫入字符串到第x(1,2,3,4)行y(1,16)列 //中間可以有漢字,并自動插入空格
//void LCD_12864_DRAW_CGRAM(UCHAR x,UCHAR *ZOON_CHAR) ;/*CGRAM.x (0-15)的分區數據寫入  */
/***************************************************************************************
** 函數名稱: LCD_Delay_us(unsigned int us)
** 功能描述: 微秒延時
****************************************************************************************/
void LCD_Delay_us(unsigned int us)
{
    while(us--);
}
/***************************************************************************************
** 函數名稱: void LCD_12864_Initialization(void)
** 功能描述: 12864LCD字符輸入初始化函數
** 調用模塊: LCD_Write_Command();
****************************************************************************************/
void LCD_12864_Initialization(void)   
{
    LCD_Write_Command(LCD_12864_BASIC_INSTRUCTION);               //使用基本指令集
    LCD_Write_Command(LCD_12864_AC_AUTO_INCREMENT);               //數據讀、寫操作后,AC自動增一,畫面不動
    LCD_Write_Command(LCD_12864_DISPLAY_ON|LCD_12864_CURSOR_OFF); //顯示開光標不顯示光標不閃爍
    LCD_Write_Command(LCD_12864_ORDER);                           //清屏
}
/***************************************************************************************
** 函數名稱: unsigned char LCD_BUSY_Bit(void)
** 功能描述: 解決忙問題,等待DB07為空
** 說    明:返回當前AC地址
****************************************************************************************/
unsigned char LCD_BUSY_Bit(void)   
{
    bit byteData;
    do
    {                              //循環開始
        LCD_EN = 0;                //使能關
        LCD_RS = 0;                //1數據0指令
        LCD_RW = 1;                //1讀0寫
        LCD_DATA = 0xff;           //拉高數據口電位
        LCD_EN = 1;                //使能開
        byteData = LCD_BUSY;       //取狀態字DB07的結果  
    }while(byteData);              //循環終點 讀到 忙位為0退出,否則繼續讀忙。
    return((LCD_DATA&0x7F)+0x80);  //返回AC的值
    LCD_EN = 0;                    //使能關
}
/***************************************************************************************
** 函數名稱: void LCD_Write_Command(unsigned char byteData)
** 功能描述: 寫指令
** 輸   入: unsigned char byteData 寫指令
** 調用模塊: LCD_BUSY_Bit();
****************************************************************************************/
void LCD_Write_Command(unsigned char byteData)
{
    LCD_BUSY_Bit();       //讀忙
    LCD_EN = 0;           //使能關
    LCD_RS = 0;           //指令方式
    LCD_RW = 0;           //寫LCD
    LCD_DATA = byteData;  //指令寫入數據口
    LCD_EN = 1;           //使能開
    LCD_Delay_us(4);      //微秒延時
    LCD_EN = 0;           //使能關
}
/***************************************************************************************
** 函數名稱: void LCD_Write_DATA(unsigned char byteData)
** 功能描述: 寫數據
** 輸   入: unsigned char byteData 寫數據
** 調用模塊: LCD_BUSY_Bit(); LCD_Delay_us();
****************************************************************************************/
void LCD_Write_DATA(unsigned char byteData)
{
    LCD_BUSY_Bit();       //讀忙
    LCD_EN = 0;           //使能關
    LCD_RS = 1;           //數據方式
    LCD_RW = 0;           //寫LCD
    LCD_DATA = byteData;  //數據寫入數據口
    LCD_EN = 1;           //使能開
    LCD_Delay_us(4);      //微秒延時
    LCD_EN = 0;           //使能關
}
/***************************************************************************************
** 函數名稱: unsigned char LCD_Read_Data()
** 功能描述: 讀取并返回AC指向的數據
** 說    明: 函數外設定AC地址,第一次試讀讀出高位,第二次會再次讀出高位,第三次讀出低位,
** 然后AC自動加一,在接下來的讀取中,只要不再次指定AC,可按AC順序讀取
****************************************************************************************/
unsigned char LCD_Read_Data()
{
    LCD_BUSY_Bit();
    LCD_EN = 0;                 //使能關
    LCD_RS = 1;                 //數據方式
    LCD_RW = 1;                 //讀LCD
    LCD_DATA = 0xFF;            //數據寫入數據口
    LCD_EN = 1;                 //使能開
    LCD_Delay_us(4);            //微秒延時
    return(LCD_DATA);           //返回AC地址數據
}
/***************************************************************************************
** 函數名稱: unsigned char LCD_Read_Data()
** 功能描述: 讀取繪圖RAM中指定坐標的數據
** 說    明: 參數輸入坐標地址,讀取后從坐標地址參數位返回數據,所以,地址參數在輸入前須使用
** 零時變量,否則地址會被沖掉
****************************************************************************************/
void LCD_Read_dat_I(unsigned char *xp,unsigned char *yp)
{
LCD_Write_Command(*yp);     //寫豎坐標(0x80-0x9f)
LCD_Write_Command(*xp);     //寫橫坐標(AC地址) 上半屏(0x80-0x87) 下半屏(0x88-0x90)
LCD_Read_Data();            //試讀
*xp=LCD_Read_Data();        //讀高字節并返回給xp
*yp=LCD_Read_Data();        //讀低字節并返回給yp
}
/***************************************************************************************
** 函數名稱: void LCD12864_WH_String(unsigned char x,unsigned char y,unsigned char *s)
** 功能描述: 寫入字符串到第x(1,2,3,4)行y(1,16)列
** 輸   入: unsigned char x,unsigned char y,unsigned char *s
** 輸   出: 無
** 全局變量: 無
** 調用模塊:  LCD_BUSY_Bit();LCD_Read_DATA();LCD_Write_Command();LCD_Write_DATA();
**設定起始行列數和字符數組,將在12864中順序顯示,在遇到漢字時如果是在地址低位,將在地址低位插入
**一個空格
****************************************************************************************/
void LCD12864_WH_String(unsigned char x,unsigned char y,unsigned char *s)
{
    unsigned char Tempi=0;          //循環行計次變量
    unsigned char TempAC=0;         //返回的DDRAM地址變量
    unsigned char TempData=0;       //返回的DDRAM高字節數據
    bit test0=1;                    //判斷是否在第一行
    bit test1=0;                    //標準ASCII碼數量的奇偶標記
    --y;                            //輸入y下標為1,統一運算y最低為0
    for(Tempi=x;Tempi<5;Tempi++)
    {                               //行掃描循環
        switch(Tempi)
        {                           //強制指定正確的行地址起點
            case 1:x=0x80;break;    //第一行光標位置
            case 2:x=0x90;break;    //第二行光標位置
            case 3:x=0x88;break;    //第三行光標位置
            case 4:x=0x98;break;    //第四行光標位置
            default: break;
        }
        if(test0)
        {                                     //如果這是第一行               
            LCD_Write_Command(x+(y>>1));      //寫入坐標位置
            if(y%2)
            {                                 //如果y起點在AC地址低位
                TempAC=LCD_BUSY_Bit();        //取當前AC地址
                LCD_Write_Command(TempAC);    //重置當前AC地址
                LCD_Read_Data();              //讀AC地址高位數據
                TempData= LCD_Read_Data();    //讀AC地址高位數據
                LCD_Write_Command(TempAC);    //再次重置當前AC地址
                LCD_Write_DATA(TempData);     //重寫地址高位數據(只有重寫地址原來高位數據,才能在此地址順利寫入低位數據)
                if(*s>127)
                {                             //如果首字是漢字且起點占據了奇數位
                    test1=1;                  //告訴下面的程序在首字插入一個空格
                }
                else
                {                             //如果首字是標準ASCII碼(這行可以不寫)
                    test1=0;
                }
            }
            test0=0;                          //首行定位完成,告訴下輪循環從新的地址開始,4輪循環下3次循環都不需要再計算首行起點
        }
        else
        {                                     //這是4輪循環中的后3輪循環
            y=0;                              //列地址始終從0開始
            LCD_Write_Command(x);             //寫入新行首列AC地址
        }
        for(y;y<16;y++)
        {                                     //列循環掃描
            if(*s)
            {                                 //如果字符數組沒有到最后一位空數據
                if(*s<128)
                {                             //如果當前字符數組數據是標準ASCII碼
                    test1=~test1;             //奇偶翻轉
                    LCD_Write_DATA(*s++);     //向LCD寫入當前字符后,指針自加1
                }
                else
                {                             //如果當前字符數組數據是擴展ASCII碼
                    if(test1)
                    {                         //如果已經寫入了奇數個標準ASCII碼
                        LCD_Write_DATA(' ');  //插入一個空格,湊齊偶數個標準ASCII碼
                        test1=0;              //清空奇偶判斷位成偶數標記
                     }
                    else
                    {                         //如果先前已經湊齊偶數個標準ASCII碼
                        LCD_Write_DATA(*s++); //寫入擴展ASCII碼
                    }
                }
            }
        }
    }
}
/***************************************************************************************
** 函數名稱: void cls_lcd(unsigned char dat)
** 功能描述: 繪圖模式初始化并按輸入數據填寫繪圖RAM
** 輸   入: unsigned char dat
** 調用模塊: LCD_Write_Command();LCD_Write_DATA();
****************************************************************************************/
void cls_lcd(unsigned char dat)
{
    unsigned char i,j,k;
    LCD_Write_Command(0x34);
    LCD_Write_Command(0x36);
    for(i=0;i<2;i++)
    {                                      //上下屏選擇
        for(j=0;j<32;j++)
        {                                  //豎向掃描
            LCD_Write_Command(0x80+j);     //寫豎向地址
            if(i==0)
            {                              //如果在上半屏
                LCD_Write_Command(0x80);   //寫橫向首地址
            }
            else                           //如果在下半屏
            {
                LCD_Write_Command(0x88);   //寫橫向首地址
            }
            for(k=0;k<16;k++)              //橫向AC自加
            {
                LCD_Write_DATA(dat);       //填數據
            }
        }
    }
}
/***************************************************************************************
** 函數名稱: void LCD_DrawingPoint(unsigned char xp,unsigned char yp,bit dat)
** 功能描述: 指定坐標點畫點
** 輸   入: unsigned char xp,unsigned char yp,bit dat  X,Y坐,dat 寫1或0擦除
** 調用模塊: LCD_Write_Command();LCD_Write_DATA();LCD_Read_dat_I(&rx,&ry);
****************************************************************************************/
void LCD_DrawingPoint(unsigned char xp,unsigned char yp,bit dat)
{
    unsigned char xd,rx,ry;
    xd=xp/0x10;                                   //計算橫坐標AC步進
    xp%=0x10;                                     //計算AC地址位偏移
xp++;
    if(yp>31)
    {                                             //如果yp大于31選下半屏
        yp-=32;                                   //計算yp在下半屏的豎向坐標
        yp+=0x80;                                 //地址命名
        xd+=0x88;                                 //下半屏起點地址是0x88,地址命名
    }
    else
    {                                             //選上半屏
        yp+=0x80;                                 //地址命名
        xd+=0x80;                                 //上半屏起點地址是0x80,地址命名
    }
    rx=xd;ry=yp;                                  //取AC數據函數需要兩個參數返回數據,且參數公用地址,所以使用零時變量
    LCD_Read_dat_I(&rx,&ry);                      //取當前字節數據
    LCD_Write_Command(yp);                        //重指定當前y地址
    LCD_Write_Command(xd);                        //重指定當前x地址
    if(dat)
    {                                             //如果是畫點
        if(xp<=8)
        {                                         //如果當前畫點坐標在AC地址數據對應的高字節(取余計算結果與字節移位方向相反)
            LCD_Write_DATA(rx|(0x01<<(8-xp)));//讀取的高位數據與翻轉的指定位進行與操作后寫入高位
            LCD_Write_DATA(ry);                    //讀取的低位數據原樣寫回
  }
  else
        {                                         //如果當前畫點坐標在AC地址數據對應的低字節(取余計算結果與字節移位方向相反)
            LCD_Write_DATA(rx);                   //讀取的高位數據原樣寫回
            LCD_Write_DATA(ry|(0x01<<(16-xp)));   //讀取的低位數據與指定位進行或操作后寫入低位
        }
    }
    else
    {                                              //如果是擦除圖像
        if(xp<=8)
        {                                          //如果當前畫點坐標在AC地址數據對應的高字節(取余計算結果與字節移位方向相反)
            LCD_Write_DATA(rx&~(0x01<<(8-xp)));//讀取的高位數據與翻轉的指定位進行與操作后寫入高位
            LCD_Write_DATA(ry);                    //讀取的低位數據原樣寫回
        }
        else
        {                                          //如果當前畫點坐標在AC地址數據對應的低字節(取余計算結果與字節移位方向相反)
            LCD_Write_DATA(rx);                    //讀取的高位數據原樣寫回
            LCD_Write_DATA(ry&~(0x01<<(16-xp)));   //讀取的低位數據與翻轉的指定位進行與操作后寫入低位
        }
    }
}


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

使用道具 舉報

沙發
ID:220385 發表于 2017-7-17 20:25 | 只看該作者
謝謝樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 热99在线 | 2020天天操 | 欧美精品v国产精品v日韩精品 | 北条麻妃一区二区三区在线视频 | 国产高清视频一区 | 超碰精品在线观看 | 亚洲精品99| 日韩欧美在线视频 | 九九热精品视频 | 精品国产色 | 成人精品国产一区二区4080 | 熟女毛片| 欧美第一区 | 久久精品成人一区 | 欧美一级免费看 | 毛片在线免费 | 99在线视频观看 | 中文在线一区二区 | 亚洲精品自在在线观看 | 国产小网站 | 久久久久国产精品午夜一区 | 99久久婷婷国产综合精品电影 | 欧美一区2区三区3区公司 | 99精品久久99久久久久 | 成人在线观看亚洲 | 欧美国产精品 | 一区二区三区欧美大片 | 精品欧美一区二区三区久久久 | 精品一二区| 亚洲综合色站 | 亚洲444kkkk在线观看最新 | 亚洲精品一区二区三区蜜桃久 | 91看片在线观看 | 操射视频 | 国产精品久久久久久亚洲调教 | 自拍偷拍精品 | 人人操日日干 | 国产精品污www一区二区三区 | 91精品久久久 | 国产成人免费视频网站高清观看视频 | 国产午夜精品一区二区 |