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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4397|回復: 4
打印 上一主題 下一主題
收起左側(cè)

比較全的lcd12864 51單片機并口驅(qū)動

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:162136 發(fā)表于 2017-10-3 13:33 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
包括以下程序,算比較全的程序,除了卷動外
void LCD12864_Init(void);                                                                //初始化
void LCD12864_RBY(void);                                                                //讀忙碌標記位
void LCD12864_WCmd(uchar cmd);                                                        //寫命令
void LCD12864_WDat(uchar dat);                                                        //寫數(shù)據(jù)
void LCD12864_Pos(uchar x,uchar y);                                                //位置
void LCD12864_WnDat(uchar* pBuff,uchar bytes);                        //寫多個數(shù)據(jù)bytes=0:到‘\0’停,bytes!=0:數(shù)量
void LCD12864_InverseDDRam(uchar line);                                        //DDRam 反白顯示
void LCD12864_DisDec(unsigned long number,uchar width);        //十進制顯示一個數(shù),width 為位數(shù)
void LCD12864_DisHex(unsigned long number,uchar width);        //十六進制顯示一個數(shù),width 為位數(shù)

void LCD12864_ClrGDRam(void);                                                                                //清繪圖 GDRAM
uchar LCD12864_RDat(void);                                                                                        //讀數(shù)據(jù)
void LCD12864_WGDRam(uchar x,uchar y,uchar mode);                                        //寫入一個點到 GDRAM 繪圖
void LCD12864_InverseGDRam(uchar sx,uchar sy,uchar ex,uchar ey);        //GDRam 反白顯示
void LCD12864_DrawLine(uchar x1, uchar y1, uchar x2, uchar y2);                //畫線
void LCD12864_DrawRectangle(uchar x1, uchar y1, uchar x2, uchar y2);//畫矩形
void LCD12864_DrawCircle(uchar x,uchar y,uchar r);                                        //在指定位置畫一個指定大小的圓
void LCD12864_DrawChar(uchar x,uchar y,uchar ascii,uchar size);                //畫 ASCII 字符
void LCD12864_DrawnChar(uchar x,uchar y,uchar* pBuff,uchar bytes,uchar size);//畫多個 ASCII 字符

void LCD12864_WCGRamLine(uchar addr,uint num);                                                //寫入 1 個 16 位數(shù)據(jù)到 CGRam
void LCD12864_WCGRamBlock(uchar addr,uchar* pBuff,uchar mode);                //寫入 16*16 位,一個塊的數(shù)據(jù)
void LCD12864_DisCGRam(uchar addr);                                                                        //顯示 CGRam 字符(自造字符)
void LCD12864_InverseCGRam(uchar addr,uchar mode);                                        //CGRam 反白顯示

lcd12864.jpg (62.54 KB, 下載次數(shù): 95)

lcd2864

lcd2864

lcd12864 帶中文字庫 并口驅(qū)動.zip

11.13 KB, 下載次數(shù): 38, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:162136 發(fā)表于 2017-10-6 12:34 | 只看該作者
//十進制顯示一個數(shù)
//number(32位數(shù)) 范圍: 0-4294967295(0xffffffff)
//width 為所占寬度
//width 范圍: 0-10
void LCD12864_DisDec(unsigned long number,uchar width)        //十進制顯示一個數(shù),width 為所占寬度
{
        uchar i,num,fign = 0;
        unsigned long temp = 1;
        if((width == 0) || (width > 10)) return;                        //顯示寬度(倍數(shù))超范圍直接返回
        if((width == 10) && (number > 999999999))                        //如果顯示到 10 位并且有數(shù)值
        {
                LCD12864_WDat((number / 1000000000) + '0');
                width--;
                fign = 1;                                                                                //表示前面已有非 0 值
        }
        i = width-1;
        while(i--) temp *= 10;                                                                //顯示余下最多 9 位
//        if(number / temp) fign = 1;                                                        //表示前面已有非 0 值
        for(i=width; i>1; i--)
        {
                num = ((number % (temp*10)) / temp);
                if(fign | num)                                                                        //前面有非 0 值或者當前是非 0 值
                {
                        LCD12864_WDat(num + '0');
                        fign = 1;
                }
                else LCD12864_WDat(' ');                                                //前面到當前都是非 0 值,顯示空格
                temp /= 10;
        }
        LCD12864_WDat((number %10) + '0');                                        //最小位顯示
}
//十六進制顯示一個數(shù)
//number(32位數(shù)) 范圍: 0x00000000-0xffffffff(4294967295)
//width 為所占寬度
//width 范圍: 0-8
void LCD12864_DisHex(unsigned long number,uchar width)        //十六進制顯示一個數(shù),width 為所占寬度
{
        uchar i,temp,fign;
        if((width ==0) || (width >8)) return;                                //顯示寬度(倍數(shù))超出直接返回
        if(number & 0xf0000000) fign=1;
        else fign = 0;
        for(i = width -1; i>0; i--)
        {
                temp = (number >> (i*4)) &0x0f;
                if(fign | temp)
                {
                        if(temp >9) temp = temp -10+ 'A';
                        else temp = temp + '0';
                        LCD12864_WDat(temp);
                        fign = 1;
                }
                else LCD12864_WDat(' ');                                                //前面到當前都是非 0 值,顯示空格
        }
        temp = (number & 0x0f);
        if(temp >9) temp = temp -10+ 'A';
        else temp = temp + '0';
                LCD12864_WDat(temp);
}
更正兩個函數(shù)。
回復

使用道具 舉報

板凳
ID:162136 發(fā)表于 2017-10-7 11:07 | 只看該作者
加一個卷動函數(shù)
//GDRam 卷動
//sx: 起始位置 x (列)坐標
//sy: 起始位置 y (行)坐標
//ex: 結束位置 x (列)坐標
//ey: 結束位置 y (行)坐標
//mode: 卷動方向
//mode = 0: 向上卷動
//mode != 0: 向下卷動
void LCD12864_ScrollGDRamLine(uchar sx,uchar sy,uchar ex,uchar ey,uchar mode)//GDRam 卷動行
{
        uchar s_dat[16];                                                                        //記錄起始行數(shù)據(jù)
        uchar t_dat[16];                                                                        //臨時數(shù)據(jù)
        uchar i;
        short dir;                                                                                        //方向
        uchar scroll_val = mode &0x3f;                                                //卷動量
        uchar sx_bit,ex_bit;                                                                //位置塊中的偏移位
        uchar block_dis;                                                                        //塊的差距
        uchar sx_block,ex_block;                                                        //起始和結束位置所在的塊
        uint *ps = (uint*)s_dat;                                                        // 8 強制轉(zhuǎn)換 為 16 位數(shù)據(jù),方便移位
        uint *pt = (uint*)t_dat;                                                        // 8 強制轉(zhuǎn)換 為 16 位數(shù)據(jù),方便移位
        uint s_bit,e_bit;                                                                        //頭尾位置數(shù)據(jù)
        uint temp;                                                                                        //臨時數(shù)據(jù)
        if(mode==0) dir = 1;                                                                //方向
        else
        {
                i = ey;                                                                                        //起始位置和結束位置互換
                ey = sy;
                sy = i;
                dir = -1;                                                                                //方向
        }
        sx_bit = sx & 0x0f;                                                                        //位偏移量(1 塊里有 16 個位)
        ex_bit = ex & 0x0f;
        sx_block = sx >> 4;                                                                        //塊的位置
        ex_block = ex >> 4;                                                                        //塊的位置
        block_dis = ex_block - sx_block;                                        //兩塊的差距量
///////       讀出起始位置        //////////////////////////////////////////////////////
        LCD12864_WCmd(0X34);                                                                //擴展指令,關GDRAM顯示
        i = sy;
        LCD12864_WCmd(0X80+(i&0x1f));                                                //行坐標
        if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);                        //下半屏列坐標(以塊為單位)
        else LCD12864_WCmd(0X80+sx_block);                                        //上半屏列坐標(以塊為單位)
        i = LCD12864_RDat();                                                                //假讀(讀出不確定數(shù)據(jù))
        i = 0;
        do
        {
                s_dat[i++] = LCD12864_RDat();                                        //高 8 位數(shù)據(jù)
                s_dat[i++] = LCD12864_RDat();                                        //低 8 位數(shù)據(jù)
        }while(i <= (block_dis<<1));
        s_bit = 0xffff >> sx_bit;                                                        //去掉不用互換的前頭
        e_bit = 0xffff << (15- ex_bit);                                        //去掉不用互換的后尾
        while(1)
        {
////////         讀出次行        /////////////////////////////////////////////////////
                i = sy+dir;
                LCD12864_WCmd(0X80+(i&0x1f));                                        //行坐標
                if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);                //下半屏列坐標(以塊為單位)
                else LCD12864_WCmd(0X80+sx_block);                                //上半屏列坐標(以塊為單位)
                i = LCD12864_RDat();                                                        //假讀(讀出不確定數(shù)據(jù))
                i = 0;
                do
                {
                        t_dat[i++] = LCD12864_RDat();                                //高 8 位數(shù)據(jù)
                        t_dat[i++] = LCD12864_RDat();                                //低 8 位數(shù)據(jù)
                }while(i <= (block_dis<<1));
/////////         數(shù)據(jù)互換       //////////////////////////////////////////////////
                i = 0;
                do                                                                                                //全部數(shù)據(jù)互換
                {
                        temp = ps[i];
                        ps[i] = pt[i];
                        pt[i] = temp;
                }while(++i <= block_dis);
                temp = (ps[0] & s_bit) | (pt[0] & (~s_bit));        //更換不用互換的前頭和后尾
                pt[0] = (pt[0] & s_bit) | (ps[0] & (~s_bit));
                ps[0] = temp;
                temp = (ps[block_dis] & e_bit) | (pt[block_dis] & (~e_bit));
                pt[block_dis] = (pt[block_dis] & e_bit) | (ps[block_dis] & (~e_bit));
                ps[block_dis] = temp;
/////////        把次行數(shù)據(jù)到首行地址        /////////////////////////////////////////
                i = sy;
                LCD12864_WCmd(0X80+(i&0x1f));                                        //行坐標
                if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);                //下半屏列坐標(以塊為單位)
                else LCD12864_WCmd(0X80+sx_block);                                //上半屏列坐標(以塊為單位)
                for(i=0;i>0;i--);                                                                //延時
                i=0;
                do
                {
                        LCD12864_WDat(s_dat[i++]);                                        //高 8 位數(shù)據(jù)
                        LCD12864_WDat(s_dat[i++]);                                        //低 8 位數(shù)據(jù)
                }while(i <= (block_dis<<1));                                                                                                                                                                                                                           
/////////         再次數(shù)據(jù)互換       //////////////////////////////////////////////////
                if(ey != sy)                                                                        //沒到最后一行
                {
                        i = 0;
                        do                                                                                        //全部數(shù)據(jù)互換
                        {
                                temp = ps[i];
                                ps[i] = pt[i];
                                pt[i] = temp;
                        }while(++i <= block_dis);
                }
//////////       把起始行數(shù)據(jù)寫到尾行地址      //////////////////////////////////////////
                else                                                                                        //到最后一行                                                                                                       
                {
                        i = sy;
                        LCD12864_WCmd(0X80+(i&0x1f));                                //行坐標
                        if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);        //下半屏列坐標(以塊為單位)
                        else LCD12864_WCmd(0X80+sx_block);                        //上半屏列坐標(以塊為單位)
                        i=0;
                        do
                        {
                                LCD12864_WDat(t_dat[i++]);                                //高 8 位數(shù)據(jù)
                                LCD12864_WDat(t_dat[i++]);                                //低 8 位數(shù)據(jù)
                        }while(i <= (block_dis<<1));
                        break;                                                                                //完成返回
                }
                sy += dir;                                                                                //下一行地址
        }       
        LCD12864_WCmd(0x36);                                                                //開繪圖顯示
        LCD12864_WCmd(0x30);                                                                //基本指令模式
}
回復

使用道具 舉報

地板
ID:162136 發(fā)表于 2017-10-7 11:57 | 只看該作者
卷動函數(shù):
1:加入了位置限制和
2:修改了方向參數(shù)的傳遞
//GDRam 卷動
//sx: 起始位置 x (列)坐標(0-127)
//ex: 結束位置 x (列)坐標(0-127)
//sy: 起始位置 y (行)坐標(0-63)
//ey: 結束位置 y (行)坐標(0-63)
// 卷動方向:
//ey > sy: 向上卷動
//ey < sy: 向下卷動
void LCD12864_ScrollGDRamLine(uchar sx,uchar sy,uchar ex,uchar ey)//GDRam 卷動行
{
        uchar s_dat[16];                                                                        //記錄起始行數(shù)據(jù)
        uchar t_dat[16];                                                                        //臨時數(shù)據(jù)
        uchar i;
        short dir;                                                                                        //方向
        uchar sx_bit,ex_bit;                                                                //位置塊中的偏移位
        uchar block_dis;                                                                        //塊的差距
        uchar sx_block,ex_block;                                                        //起始和結束位置所在的塊
        uint *ps = (uint*)s_dat;                                                        // 8 強制轉(zhuǎn)換 為 16 位數(shù)據(jù),方便移位
        uint *pt = (uint*)t_dat;                                                        // 8 強制轉(zhuǎn)換 為 16 位數(shù)據(jù),方便移位
        uint s_bit,e_bit;                                                                        //頭尾位置數(shù)據(jù)
        uint temp;                                                                                        //臨時數(shù)據(jù)
        if((sy>127)||(ey>127)||(sx>63)||(ex>63)) return;        //范圍限制
        if(sx > ex)                                                                                        //調(diào)整 x 軸位置
        {
                i = sx;                                                                                        //sx 和 ex 調(diào)換,保證 ex >= sx
                sx = ex;
                ex = i;
        }
        if(sy==ey) return;                                                                        //沒有卷動退出
        else if(ey>sy) dir = 1;                                                                //方向(向上卷動)
        else dir = -1;                                                                                //方向(向下卷動)
        sx_bit = sx & 0x0f;                                                                        //位偏移量(1 塊里有 16 個位)
        ex_bit = ex & 0x0f;
        sx_block = sx >> 4;                                                                        //塊的位置
        ex_block = ex >> 4;                                                                        //塊的位置
        block_dis = ex_block - sx_block;                                        //兩塊的差距量
///////       讀出起始位置        //////////////////////////////////////////////////////
        LCD12864_WCmd(0X34);                                                                //擴展指令,關GDRAM顯示
        i = sy;
        LCD12864_WCmd(0X80+(i&0x1f));                                                //行坐標
        if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);                        //下半屏列坐標(以塊為單位)
        else LCD12864_WCmd(0X80+sx_block);                                        //上半屏列坐標(以塊為單位)
        i = LCD12864_RDat();                                                                //假讀(讀出不確定數(shù)據(jù))
        i = 0;
        do
        {
                s_dat[i++] = LCD12864_RDat();                                        //高 8 位數(shù)據(jù)
                s_dat[i++] = LCD12864_RDat();                                        //低 8 位數(shù)據(jù)
        }while(i <= (block_dis<<1));
        s_bit = 0xffff >> sx_bit;                                                        //去掉不用互換的前頭
        e_bit = 0xffff << (15- ex_bit);                                        //去掉不用互換的后尾
        while(1)
        {
////////         讀出次行        /////////////////////////////////////////////////////
                i = sy+dir;
                LCD12864_WCmd(0X80+(i&0x1f));                                        //行坐標
                if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);                //下半屏列坐標(以塊為單位)
                else LCD12864_WCmd(0X80+sx_block);                                //上半屏列坐標(以塊為單位)
                i = LCD12864_RDat();                                                        //假讀(讀出不確定數(shù)據(jù))
                i = 0;
                do
                {
                        t_dat[i++] = LCD12864_RDat();                                //高 8 位數(shù)據(jù)
                        t_dat[i++] = LCD12864_RDat();                                //低 8 位數(shù)據(jù)
                }while(i <= (block_dis<<1));
/////////         數(shù)據(jù)互換       //////////////////////////////////////////////////
                i = 0;
                do                                                                                                //全部數(shù)據(jù)互換
                {
                        temp = ps[i];
                        ps[i] = pt[i];
                        pt[i] = temp;
                }while(++i <= block_dis);
                temp = (ps[0] & s_bit) | (pt[0] & (~s_bit));        //更換不用互換的前頭和后尾
                pt[0] = (pt[0] & s_bit) | (ps[0] & (~s_bit));
                ps[0] = temp;
                temp = (ps[block_dis] & e_bit) | (pt[block_dis] & (~e_bit));
                pt[block_dis] = (pt[block_dis] & e_bit) | (ps[block_dis] & (~e_bit));
                ps[block_dis] = temp;
/////////        把次行數(shù)據(jù)到首行地址        /////////////////////////////////////////
                i = sy;
                LCD12864_WCmd(0X80+(i&0x1f));                                        //行坐標
                if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);                //下半屏列坐標(以塊為單位)
                else LCD12864_WCmd(0X80+sx_block);                                //上半屏列坐標(以塊為單位)
                for(i=0;i>0;i--);                                                                //延時
                i=0;
                do
                {
                        LCD12864_WDat(s_dat[i++]);                                        //高 8 位數(shù)據(jù)
                        LCD12864_WDat(s_dat[i++]);                                        //低 8 位數(shù)據(jù)
                }while(i <= (block_dis<<1));                                                                                                                                                                                                                           
/////////         再次數(shù)據(jù)互換       //////////////////////////////////////////////////
                if(ey != sy)                                                                        //沒到最后一行
                {
                        i = 0;
                        do                                                                                        //全部數(shù)據(jù)互換
                        {
                                temp = ps[i];
                                ps[i] = pt[i];
                                pt[i] = temp;
                        }while(++i <= block_dis);
                }
//////////       把起始行數(shù)據(jù)寫到尾行地址      //////////////////////////////////////////
                else                                                                                        //到最后一行                                                                                                       
                {
                        i = sy;
                        LCD12864_WCmd(0X80+(i&0x1f));                                //行坐標
                        if(i&0x20) LCD12864_WCmd(0X80+sx_block+8);        //下半屏列坐標(以塊為單位)
                        else LCD12864_WCmd(0X80+sx_block);                        //上半屏列坐標(以塊為單位)
                        i=0;
                        do
                        {
                                LCD12864_WDat(t_dat[i++]);                                //高 8 位數(shù)據(jù)
                                LCD12864_WDat(t_dat[i++]);                                //低 8 位數(shù)據(jù)
                        }while(i <= (block_dis<<1));
                        break;                                                                                //完成返回
                }
                sy += dir;                                                                                //下一行地址
        }       
        LCD12864_WCmd(0x36);                                                                //開繪圖顯示
        LCD12864_WCmd(0x30);                                                                //基本指令模式
}
回復

使用道具 舉報

5#
ID:438288 發(fā)表于 2019-6-5 09:12 | 只看該作者
我要下來看看,我中文picc編譯不過去,報非法字符
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区视频 | 日本爱爱 | 亚洲伦理自拍 | 91在线观看视频 | 欧美视频在线播放 | 国产在线视频在线观看 | 国产日韩欧美精品一区二区 | 女人av| 精品久久久久国产 | 成人免费观看男女羞羞视频 | 毛片免费看 | 欧美日韩久久 | 精品国产18久久久久久二百 | 男女免费在线观看视频 | 成人在线精品视频 | 91在线免费视频 | 波多野结衣一区二区三区在线观看 | 久久亚洲一区 | 色吧久久 | 欧美色图综合网 | jizz中国日本 | 久久四虎| 国产精品高潮呻吟久久久久 | 国产精品久久久久久久毛片 | 久久激情视频 | 夜夜爽99久久国产综合精品女不卡 | 久久久久久www | 久久精品欧美一区二区三区不卡 | 亚洲综合在线视频 | 亚洲午夜视频在线观看 | 国产午夜精品一区二区三区嫩草 | 日韩精品一区二区三区在线播放 | 久久精品国产久精国产 | 国产精品揄拍一区二区 | 久久久这里都是精品 | 国产日韩一区二区 | 在线视频中文字幕 | 日韩中文字幕视频在线 | 丝袜 亚洲 另类 欧美 综合 | 久久香蕉网| www.国产精|