![]() |
我要下來看看,我中文picc編譯不過去,報非法字符 |
卷動函數(shù): 1:加入了位置限制和 2:修改了方向參數(shù)的傳遞 //GDRam 卷動 //sx: 起始位置 x (列)坐標(biāo)(0-127) //ex: 結(jié)束位置 x (列)坐標(biāo)(0-127) //sy: 起始位置 y (行)坐標(biāo)(0-63) //ey: 結(jié)束位置 y (行)坐標(biāo)(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; //起始和結(jié)束位置所在的塊 uint *ps = (uint*)s_dat; // 8 強(qiáng)制轉(zhuǎn)換 為 16 位數(shù)據(jù),方便移位 uint *pt = (uint*)t_dat; // 8 強(qiáng)制轉(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); //擴(kuò)展指令,關(guān)GDRAM顯示 i = sy; LCD12864_WCmd(0X80+(i&0x1f)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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); //基本指令模式 } |
加一個卷動函數(shù) //GDRam 卷動 //sx: 起始位置 x (列)坐標(biāo) //sy: 起始位置 y (行)坐標(biāo) //ex: 結(jié)束位置 x (列)坐標(biāo) //ey: 結(jié)束位置 y (行)坐標(biāo) //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; //起始和結(jié)束位置所在的塊 uint *ps = (uint*)s_dat; // 8 強(qiáng)制轉(zhuǎn)換 為 16 位數(shù)據(jù),方便移位 uint *pt = (uint*)t_dat; // 8 強(qiáng)制轉(zhuǎn)換 為 16 位數(shù)據(jù),方便移位 uint s_bit,e_bit; //頭尾位置數(shù)據(jù) uint temp; //臨時數(shù)據(jù) if(mode==0) dir = 1; //方向 else { i = ey; //起始位置和結(jié)束位置互換 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); //擴(kuò)展指令,關(guān)GDRAM顯示 i = sy; LCD12864_WCmd(0X80+(i&0x1f)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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)); //行坐標(biāo) if(i&0x20) LCD12864_WCmd(0X80+sx_block+8); //下半屏列坐標(biāo)(以塊為單位) else LCD12864_WCmd(0X80+sx_block); //上半屏列坐標(biāo)(以塊為單位) 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); //基本指令模式 } |
//十進(jìn)制顯示一個數(shù) //number(32位數(shù)) 范圍: 0-4294967295(0xffffffff) //width 為所占寬度 //width 范圍: 0-10 void LCD12864_DisDec(unsigned long number,uchar width) //十進(jìn)制顯示一個數(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 值或者當(dāng)前是非 0 值 { LCD12864_WDat(num + '0'); fign = 1; } else LCD12864_WDat(' '); //前面到當(dāng)前都是非 0 值,顯示空格 temp /= 10; } LCD12864_WDat((number %10) + '0'); //最小位顯示 } //十六進(jìn)制顯示一個數(shù) //number(32位數(shù)) 范圍: 0x00000000-0xffffffff(4294967295) //width 為所占寬度 //width 范圍: 0-8 void LCD12864_DisHex(unsigned long number,uchar width) //十六進(jìn)制顯示一個數(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(' '); //前面到當(dāng)前都是非 0 值,顯示空格 } temp = (number & 0x0f); if(temp >9) temp = temp -10+ 'A'; else temp = temp + '0'; LCD12864_WDat(temp); } 更正兩個函數(shù)。 |
Powered by 單片機(jī)教程網(wǎng)