|
下面開始搞,搞一個相位激光測距儀
0.png (39.19 KB, 下載次數: 266)
下載附件
2016-4-14 22:51 上傳
源碼下載:
完整代碼 備份 15-7-13.zip
(398.12 KB, 下載次數: 306)
2016-4-14 22:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
全部的軟件代碼都在這里了
5厘米到40米量程
精度1毫米
然后做了個視頻演示
還寫了一個上位機 遠距離測試
然后又寫了個上位機 近距離測試
0.png (112.67 KB, 下載次數: 246)
下載附件
2016-4-14 22:46 上傳
1.png (108.82 KB, 下載次數: 222)
下載附件
2016-4-14 22:46 上傳
其實也不算是自己動手做因為本來就是成品模塊
2.png (189.49 KB, 下載次數: 213)
下載附件
2016-4-14 22:46 上傳
好吧看來大家更關注模塊哪兒買的,那我把模塊的鏈接放在上面來吧
模塊從淘寶就找到了兩家,一家是550 一家是260
550元的激光測距模塊
260元的國產測距模塊 40米 150Mhz我買的是260的量程40米,
550的量程30米,精度高0.5mm而已,另外也就多了個讀id什么的,反正測距只要知道多少長度就夠了,沒必要多花那么多錢
借用賣家的圖片
3.png (192.12 KB, 下載次數: 221)
下載附件
2016-4-14 22:46 上傳
使用串口通信發指令就行了
測量量程: 5厘米到40米
精度檢測: 1毫米錯誤檢測: 無返回信號錯誤, 距離太近錯誤
7.jpg (198.84 KB, 下載次數: 204)
下載附件
2016-4-14 22:46 上傳
玩了一天玩透了,先上幾張圖大家批評批評,
用黑色的卷尺擋住激光接收口.不讓模塊收到激光,提示沒信號
8.jpg (211.97 KB, 下載次數: 200)
下載附件
2016-4-14 22:46 上傳
測量結果沒錯誤的界面
7.jpg (112.67 KB, 下載次數: 219)
下載附件
2016-4-14 22:47 上傳
8.jpg (199.57 KB, 下載次數: 225)
下載附件
2016-4-14 22:47 上傳
9.jpg (195.99 KB, 下載次數: 211)
下載附件
2016-4-14 22:47 上傳
正確的測量結果
既然不是技術貼,那也別裝那個技術范兒,扯扯淡,大家就會玩了,
這個模塊不便宜,話說為何要買這個模塊,其實也是閑的蛋疼,
我的目的是從頭到尾做一個激光測距儀,
不過經過查閱資料,發現這個東西是雙光路,不太明白什么叫雙光路,所以花錢買一個拆拆看吧,
不得不吐槽的是: 模塊260,一個山寨激光測距儀才150
有沒有壇友犧牲一下買個淘寶上的150元激光測距儀,拆開看看內部什么樣?
不過這個模塊的做工確實很渣渣,雙光路就是倆塑料導光片,
從壇子里看有拆的什么徠的激光測距儀,做工真是秒殺
6.jpg (136.37 KB, 下載次數: 205)
下載附件
2016-4-14 22:47 上傳
---------------------------------------------------------------------------------------------
這個模塊賣家也除了提供一份指令表,什么也沒有,真是蛋疼,那怕是給個單片機例子呢
無奈了,既然是串口,那就上串口助手吧
然后我發現rxd會重復出現主機發來的指令,比較蛋疼,
0.png (27.81 KB, 下載次數: 215)
下載附件
2016-4-14 22:48 上傳
然后借助示波器查看數據出現的先后順序,才發現,原來是模塊 是根據不同的指令返回應答
有的指令返回應答后還會重復一次指令表示收到(猜測的)
然后有的指令是直接返回一個應答就完了
然后把賣家給的指令表我又重新擴充了一下,并截取了一些數據,然后根據表現我給他定義了三個模式
模式1 打開激光 瞄準后在測距 28字節數據包
$00023335&$0003260130&$00023335&$0006210000008613& 表示0.086米
模式2 單詞測量 28字節數據包
$00023335&$0006210000006390& 表示0.063米
模式3測100次 38*100字節的數據包
$001624999900000106000001180000004711& 表示0.04711米
這樣的話,內存占用很大, 單片機選用了 60s2,128的ram然后又1024的xdata區,
這個xdata之前是放置的5110液晶屏顯存(為了顯示4行12x12)的字符
其實控制這個模塊是很簡單的,往里面丟ascii就可以了,像什么呢?對就是gsm和gprs模塊
模塊有錯誤檢測功能,距離太近和收不到激光,賣家的文檔里有好多種錯誤代碼,但是實際上我只遇見了2種錯誤,
可能還要繼續玩玩才能知道
晚整理一下把代碼發上來
1.png (198.91 KB, 下載次數: 206)
下載附件
2016-4-14 22:48 上傳
源碼在這里,硬件連接很簡單了,從代碼里一看就知道
main.c
- #include <reg51.h>
- #include"Nokia5110lcd.h"
- //有興趣可以加qq924958394一起交流
- #define uchar unsigned char
- #define uint unsigned int
- sbit led=P1^7; //ok
- sbit k2=P2^5;
- sbit k3=P2^6;
- sbit k4=P2^7;
- uint Sysec;
- uchar ErrorCode;
- uchar stringLenth;//串口收到的字符串長度,單次測量收到28字節 連續測量38個字節
- #define maxSbufLenth 38 //根據測量模式設置緩存大小
- uchar aciiCount; //收到的字符數計算
- uchar multipleTestShift; //連續測量要減去一個偏移量10字節
- uchar uartSbuf[38]={"$00023335&$0006210000000000&"};//第20位是距離的十位數 21是個位數,后面是小數
- uchar xdata laserOn[12] ={"$0003260130&"};
- uchar xdata singleTest[10] ={"$00022123&"};
- uchar xdata multipleTest[10] ={"$00022426&"};
- void Timer0Init(void) //50毫秒@6.000MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x58; //設置定時初值
- TH0 = 0x9E; //設置定時初值
- TF0 = 0; //清除TF0標志
- //TR0 = 1; //定時器0開始計時
- ET0=0;
- EA=1;
- }
- void UartInit(void) //115200bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x40; //定時器1時鐘為Fosc,即1T
- AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
- TMOD &= 0x0F; //清除定時器1模式位
- TMOD |= 0x20; //設定定時器1為8位自動重裝方式
- TL1 = 0xFD; //設定定時初值
- TH1 = 0xFD; //設定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
- ES=1;
- EA=1;
- }
- /*********** ***發送字符(ASCII)函數*** **********/
- void sendAscii(uchar *b)
- {
- ES = 0; //關串口中斷
- for (b; *b!='\0';b++)
- {
- SBUF = *b;
- while (TI!=1); //等待發送完成
- TI = 0; //清除發送中斷標志位
- }
- ES = 1; //開串口中斷
- }
- void clearUartSbuf()
- {
- uchar i;
- for (i=0;i<aciiCount;i++)
- {
- uartSbuf[i]='0';
- }
- }
- uchar checkError()
- {
- uchar dat;
- if (uartSbuf[20]=='0' && uartSbuf[21]=='0' && uartSbuf[22]=='0' && uartSbuf[23]== '1' ){
- if ( uartSbuf[24]=='5')dat=15; //距離太近1542
- if (uartSbuf[24]=='6')dat=16;//收不到信號1643
-
-
-
- }
- else dat=0;
- return dat;
- }
- void main()
- {
- uchar test;
- UartInit();
- Lcd5110Init(); //初始化LCD模塊
- Lcd5110Clear(); //清屏幕
- while (1)
- {
- if (k4==0)
- {
- while (k4==0);
- sendAscii("$0003260130&");//打開激光
- }
- if (k3==0){
- while (k3==0);
- ErrorCode=0;
- stringLenth=28;
- aciiCount=0;//接收38個字符串就夠了
- sendAscii("$00022123&");//單次測量 或者 關閉連續測量
- }
- if (k2==0){
- while (k2==0);
- stringLenth=38;
- aciiCount=0;//接收28個字符串就夠了
- sendAscii("$00022426&");//開始連續測量
- }
- // Lcd5110String8x12(1,0,"1");
- // Lcd5110String8x12(0,0,"0");
- // Lcd5110String8x12(2,0,"2");
- // Lcd5110String8x12(3,0,"3");
- // Lcd5110String8x12(1,9,"3");
- // Lcd5110String6x8(1,28,"15-12-5");
- //Lcd5110String8x12(0,30,"06-27");
- //Lcd5110ShowHZ12X12(1,0,1); //
- //Lcd5110String(1,54,"12:30");
- // Lcd5110String(2,0,"QQ:924958394");
- //Lcd5110show8x16AscAtAddr(0,17,'8');
- //Lcd5110show8x16AscAtAddr(3,17,'8');
- // Lcd5110DispHundredIn12x12(0,28,test);
- // Lcd5110show6x8AscWithNoAddr(32+16+1); // 要顯示數字 32是之前指針減去的 ,+16是數字區的偏移量
- // Lcd5110show6x8AscWithNoAddr(48+2);
- // Lcd5110DispHundredIn6x8(2,28,test);
- // Lcd5110String6x8(2,50,"48");
- //Lcd5110DisplayAscii8x12AtAddr(0,25,94+32+2);
- Lcd5110ChineseString16x16(0,0,"激光測距儀");
- Lcd5110String6x8(2,0,"15-7-12 17:35");
- Lcd5110ShowHZ12X12(2,0,0); // 距
- Lcd5110ShowHZ12X12(2,12,1); //離
- //Lcd5110String8x12(2,24,"00.125");
- Lcd5110ShowHZ12X12(2,72,9); // 米
- ErrorCode=checkError();
- if (ErrorCode==0)
- {
- Lcd5110String8x12(3,0,"OK ");
- Lcd5110ShowHZ12X12(3,25,0); // 距離無誤
- Lcd5110ShowHZ12X12(3,37,1); //
- Lcd5110ShowHZ12X12(3,49,4); //
- Lcd5110ShowHZ12X12(3,61,3); //
- }
- if (ErrorCode==15)
- {
- //clearUartSbuf();
- Lcd5110String8x12(3,0,"Err");
- Lcd5110ShowHZ12X12(3,25,0); // 距離太近
- Lcd5110ShowHZ12X12(3,37,1); //
- Lcd5110ShowHZ12X12(3,49,7); //
- Lcd5110ShowHZ12X12(3,61,8); //
- }
- if (ErrorCode==16)
- {
- //clearUartSbuf();
- Lcd5110String8x12(3,0,"Err");
- Lcd5110ShowHZ12X12(3,25,4); // 距離太近
- Lcd5110ShowHZ12X12(3,37,5); //
- Lcd5110ShowHZ12X12(3,49,6); //
- Lcd5110ShowHZ12X12(3,61,15); //
- }
- Lcd5110SetXY(24,3);
- Lcd5110show6x8AscWithNoAddr(uartSbuf[20]);
- Lcd5110show6x8AscWithNoAddr(uartSbuf[21]);
- Lcd5110show6x8AscWithNoAddr('.');
- Lcd5110show6x8AscWithNoAddr(uartSbuf[22]);
- Lcd5110show6x8AscWithNoAddr(uartSbuf[23]);
- Lcd5110show6x8AscWithNoAddr(uartSbuf[24]);
- Lcd5110show6x8AscWithNoAddr(uartSbuf[25]);
- Lcd5110show6x8AscWithNoAddr(uartSbuf[26]);
- //Lcd5110String8x12(3,0,"12345");
- }
- }
- void uartRec()interrupt 4{
- ES=0;//關閉中斷
- if (RI)
- {
- RI=0;
- uartSbuf[aciiCount]=SBUF;
- aciiCount++;
- if (aciiCount>stringLenth) //根據各個模式截取合適長度的字符串
- {
- aciiCount=0;
- }
- }
- if (TI)
- {
- TI=0;
- }
- ES=1;
- }
- void t0() interrupt 1
- {
- static char i;
- TL0 = 0x58; //設置定時初值
- TH0 = 0x9E; //設置定時初值
- i++;
- if (i==20)
- {
- i=0;
- Sysec++;
- }
- }
復制代碼
nokia5110lcd.c
- /*
- 1把控制器的 8位一個地址共6地址的方式,使用軟件的方式重新劃分為12位一個地址共4地址的方式進行12x12漢字顯示目前只能能第0行往第3行顯示
- 任意順序的顯示部分還沒做
- 2只能上下對齊顯示 這樣只需要占用48byte的內存,如果任意地址錯行顯示,那就得需要168byte ,需要用iic存儲器或者內置存eeprom,速度又太慢
- 3實現任意位置顯示12高字體的顯示,原理是從程序中分配一塊內存 84*4字節, 分別用來存儲四個半高數據,在初始化的時候把336個字節初始化位0即可
- */
- #include <reg51.h>
- #include"Nokia5110Lcd.h"
- #include "lcd5110font.c"
- #include<intrins.h>
- #define nop() _nop_()
- #define uchar unsigned char
- #define uint unsigned int
- sbit res = P2^4; //復位,0復位
- sbit sce = P2^3; //片選
- sbit dc = P2^2; //1寫數據,0寫指令
- sbit sdin = P2^1; //數據
- sbit sclk = P2^0; //時鐘
- uchar xdata Y0Ram[84]; //第0行漢字的臨時緩存
- uchar xdata Y1Ram[84];
- uchar xdata Y2Ram[84];
- uchar xdata Y3Ram[84];
- void delay(int t)
- {
- uchar i;
- while(t--)
- {
- for(i=0;i<125;i++)
- {}
- }
- }
- void Lcd5110WriteDta(uchar dat)
- {
- unsigned char i;
- sce=0;
- dc=1;
- for(i=0;i<8;i++)
- {
- if(dat&0x80)
- sdin=1;
- else
- sdin=0;
- dat=dat<<1;
- sclk=0;
- nop();
- sclk=1;
- }
- dc=1;
- sce=1;
- sdin=1;
- }
- void Lcd5110WriteCMD(uchar dat)
- {
- unsigned char i;
- sce=0;
- dc=0;
- for(i=0;i<8;i++)
- {
- if(dat&0x80)
- sdin=1;
- else
- sdin=0;
- dat=dat<<1;
- sclk=0;
- nop();
- sclk=1;
-
- }
- dc=1;
- sce=1;
- sdin=1;
- }
- /*---------------------------------------
- LCD_init: 3310LCD初始化
- 編寫日期:20080918
- ----------------------------------------- */
- void Lcd5110Init(void)
- {
- char i;
- // res=0;
- // delay(10);
- // res=1; //以上三句 不用也行
- Lcd5110WriteCMD(0x21 );//初始化Lcd,功能設定使用擴充指令
- Lcd5110WriteCMD(0x9c );//設定液晶偏置電壓
- //Lcd5110WriteCMD(0xc0);//設定液晶偏置電壓 //調試用 顯示全黑
- Lcd5110WriteCMD(0x02 );//溫度校正
- Lcd5110WriteCMD(0x13 );//1:48
- Lcd5110WriteCMD(0x20 );//使用基本指令
- Lcd5110WriteCMD(0x0C );//設定顯示模式,正常顯示
- for(i=0;i<84;i++)
- {
- Y0Ram[i]=Y1Ram[i]=Y2Ram[i]=Y3Ram[i]=0;
- }
- }
- /*-------------------------------------------
- LCD_set_XY: 設置LCD坐標函數
- 輸入參數:X:0-83 Y:0-5
- 編寫日期:20080918
- ---------------------------------------------*/
- void Lcd5110SetXY(uchar X,Y)
- {
- Lcd5110WriteCMD(0x40 | Y );// 垂直方向 0-5
- Lcd5110WriteCMD(0x80 | X );// 水平方向0-83
- }
- /*------------------------------------------
- LCD_clear: LCD清屏函數
- 編寫日期:20080918
- --------------------------------------------*/
- void Lcd5110Clear(void)
- {
- unsigned char t;
- unsigned char k;
- Lcd5110SetXY(0,0);
- for(t=0;t<6;t++)
- {
- for(k=0;k<84;k++)
- Lcd5110WriteDta(0x00);
- }
- }
- /*---------------------------------------------
- LCD_write_shu: 顯示8(寬)*16(高)點陣列數字字母符號等半角類
-
- addr:寫入地址
- hang: 第幾行 對于6*8點陣 實際5*7留有空邊,字高8個點, 屏幕一共6行 豎著48個點
- dd:字符
- -----------------------------------------------*/
- void Lcd5110Write6x8AtAddr(uchar hang, addr, dat)
- {
- unsigned char i;
-
- dat=dat-32; //ascii轉換為字庫偏移地址
- Lcd5110SetXY(addr, hang-1);// 某行的某個地址 行1-6地址0-83
- for(i=0; i<6;i++)
- {
- Lcd5110WriteDta(Ascii6x8[dat*6+i]);
- }
-
- }
- void Lcd5110show6x8AscWithNoAddr(uchar dat)//顯示一個6*8點陣
- {
- uchar i;
- dat-=32;
- for(i=0; i<6;i++)
- Lcd5110WriteDta(Ascii6x8[dat*6+i]);
- }
-
- void Lcd5110String6x8(uchar hang , addr, uchar *p)
- {
-
- Lcd5110SetXY(addr, hang);// 列,頁
-
- while(*p!='\0')
- {
- Lcd5110show6x8AscWithNoAddr(*p++);
- }
- }
- void Lcd5110show8x16AscAtAddr(uchar hang,addr, dat)
- {
- uchar i ;
- dat-=32;
- Lcd5110SetXY(addr,hang);
- for(i=0; i<8;i++)
- Lcd5110WriteDta(Ascii8x16[dat*16+i]);
- Lcd5110SetXY(addr,hang+1);
- for(i=8; i<16;i++)
- Lcd5110WriteDta(Ascii8x16[dat*16+i]);
- }
-
- /*
- 行 范圍 1-6一共6行,但在行=6的時候會顯示不全
- */
- void Lcd5110String8x16(uchar hang , addr, uchar *p)
- {
- //不再用8*16的ascii了,直接屏蔽掉,想用的時候在解除屏蔽即可
- uchar dat;
- while(*p!='\0')
- {
- dat =*p;
- Lcd5110show8x16AscAtAddr(hang-1 ,addr, dat);
- *p++;
- addr+=8;
- }
- }
- /*---------------------------------------------
- 顯示一個16*16的漢字
- hang: 1-6行
- addr:這一行的第幾個像素
- dat,要顯示 字庫中第幾個數
- -----------------------------------------------*/
- void Lcd5110ShowHZ16X16(uchar hang,addr, dat)
- {
- // 現在不用16的漢字,都用12的,直接屏蔽掉,
- unsigned char i;
-
- Lcd5110SetXY(addr, hang);// 列,頁
- for(i=0; i<16;i++)
- {
- Lcd5110WriteDta(CH16x16[dat*32+i]);
- }
-
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=16; i<32;i++)
- {
- Lcd5110WriteDta(CH16x16[dat*32+i]);
- }
- }
-
- void Lcd5110DisplayAscii8x12AtAddr(uchar hang,addr, dat)
- {
-
- uchar i, LocalHalfWidth,LocalFullWidth; //半寬字體,全寬字體
- LocalHalfWidth=8;//8*12的字體,光看上面一半8字節
- LocalFullWidth=16;//8*12的字體,上下兩行就是16字節
-
- dat-=32;
- if(hang==0)//按照4行顯示,首行為0,地址就是0-3行,不是控制器的地址
- {
- Lcd5110SetXY(addr, hang);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]);
- }
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Y0Ram[addr+i-LocalHalfWidth]=Ascii8x12[dat*LocalFullWidth+i]; //第0行的下半部分12個字節存起來
- Lcd5110WriteDta(Y0Ram[addr+i-LocalHalfWidth] | Y1Ram[addr+i-LocalHalfWidth]<<4 );
- }
- }
- if(hang==1)
- {
- Lcd5110SetXY(addr, hang);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Y1Ram[addr+i]=Ascii8x12[dat*LocalFullWidth+i];//第1行上半部分存起來
- Lcd5110WriteDta(Y1Ram[addr+i]<<4 | Y0Ram[addr+i]);
- }
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]<<4 | Ascii8x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4 );
- }
- }
- if(hang==2)//按照4行顯示,首行為0,地址就是0-3行,不是控制器的地址
- {
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]);
- }
- Lcd5110SetXY(addr, hang+2);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Y2Ram[addr+i-LocalHalfWidth]=Ascii8x12[dat*LocalFullWidth+i]; //第0行的下半部分12個字節存起來
- Lcd5110WriteDta(Y2Ram[addr+i-LocalHalfWidth] | Y3Ram[addr+i-LocalHalfWidth]<<4 );
- }
- }
- if(hang==3)//按照4行顯示的話,地址就是0-3行
- {
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Y3Ram[addr+i]=Ascii8x12[dat*LocalFullWidth+i];//第1行上半部分存起來
- Lcd5110WriteDta(Y3Ram[addr+i]<<4 | Y2Ram[addr+i]);
- }
- Lcd5110SetXY(addr, hang+2);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]<<4 | Ascii8x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4);
- }
- }
- }
- void Lcd5110String8x12(uchar hang,addr,uchar *p)
- {
- uchar dat;
- while(*p!='\0')
- {
- dat =*p;
- Lcd5110DisplayAscii8x12AtAddr(hang ,addr, dat);
- *p++;
- addr+=8;
- //delay(6000); //調試用 慢動作
- }
- }
- /*---------------------------------------------
- 顯示一個12*12的漢字
- hang: 0-3行
- addr:這一行的第幾個像素
- dat,要顯示 字庫中第幾個數
- -----------------------------------------------*/
- void Lcd5110ShowHZ12X12(uchar hang,addr, dat)
- {
- uchar i, LocalHalfWidth,LocalFullWidth; //半寬字體,全寬字體
- LocalHalfWidth=12;//12*12的字體,光看上面一半12字節
- LocalFullWidth=24;//12*12的字體,上下兩行就是24字節
- if(hang==0)//按照4行顯示,首行為0,地址就是0-3行,不是控制器的地址
- {
- Lcd5110SetXY(addr, hang);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]);
- }
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Y0Ram[addr+i-LocalHalfWidth]=CH12x12[dat*LocalFullWidth+i]; //第0行的下半部分12個字節存起來
- Lcd5110WriteDta(Y0Ram[addr+i-LocalHalfWidth] | Y1Ram[addr+i-LocalHalfWidth]<<4 );
- }
- }
- if(hang==1)
- {
- Lcd5110SetXY(addr, hang);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Y1Ram[addr+i]=CH12x12[dat*LocalFullWidth+i];//第1行上半部分存起來
- Lcd5110WriteDta(Y1Ram[addr+i]<<4 | Y0Ram[addr+i]);
- }
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]<<4 | CH12x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4 );
- }
- }
- if(hang==2)//按照4行顯示,首行為0,地址就是0-3行,不是控制器的地址
- {
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]);
- }
- Lcd5110SetXY(addr, hang+2);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Y2Ram[addr+i-LocalHalfWidth]=CH12x12[dat*LocalFullWidth+i]; //第0行的下半部分12個字節存起來
- Lcd5110WriteDta(Y2Ram[addr+i-LocalHalfWidth] | Y3Ram[addr+i-LocalHalfWidth]<<4 );
- }
- }
- if(hang==3)//按照4行顯示的話,地址就是0-3行
- {
- Lcd5110SetXY(addr, hang+1);// 列,頁
- for(i=0; i<LocalHalfWidth;i++) //上半部分 12個像素
- {
- Y3Ram[addr+i]=CH12x12[dat*LocalFullWidth+i];//第1行上半部分存起來
- Lcd5110WriteDta(Y3Ram[addr+i]<<4 | Y2Ram[addr+i]);
- }
- Lcd5110SetXY(addr, hang+2);// 列,頁
- for(i=LocalHalfWidth; i<LocalFullWidth;i++) //下半部分 12個像素
- {
- Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]<<4 | CH12x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4);
- }
- }
- }
- void DispOneChs16x16(uchar hang,addr,uchar *dat)
- {
- uchar i,j;
- for(j=0; j<2;j++)
- {
- Lcd5110SetXY(addr, hang+j);// 列,頁
- for(i=0; i<16;i++)
- Lcd5110WriteDta(dat[16*j+i]);
-
- }
- }
- /* */
- void DispOneChsFromTable16x16(uchar hang,addr, uchar *dat)
- {
- uchar i;
- for(i=0;i<LenthOfGbk16;i++) //索引
- {
- if( (GBK16[i].Index[0] == dat[0]) && (GBK16[i].Index[1] == dat[1])) break;
- }
- switch (hang)
- {
- case 0:hang=0;break;
- case 1:hang=2;break;
- case 2:hang=4;break;
- default:break;
- }
- DispOneChs16x16(hang,addr,GBK16[i].Matrix);
-
- }
- void Lcd5110ChineseString16x16(uchar hang,addr,uchar *dat)
- {
- while(*dat)
- {
- DispOneChsFromTable16x16(hang,addr,dat);
- addr+=16;
- dat+=2;
-
- }
- }
- /*使用一個6x8的字體顯示一個3位整數*/
- void Lcd5110DispHundredIn6x8(uchar hang,addr, int dat)
- {
- Lcd5110SetXY(addr,hang);
- Lcd5110show6x8AscWithNoAddr(48+dat/100);
- Lcd5110show6x8AscWithNoAddr(48+dat%100/10);
- Lcd5110show6x8AscWithNoAddr(48+dat%100%10);
- }
- //hang,地址,傳入
- void Lcd5110DispHundredIn12x12(uchar hang,addr,int dat)
- {
- Lcd5110DisplayAscii8x12AtAddr(hang,addr,48+dat/100);
- Lcd5110DisplayAscii8x12AtAddr(hang,addr+8,48+dat%100/10);
- Lcd5110DisplayAscii8x12AtAddr(hang,addr+16,48+dat%100%10);
-
- }
復制代碼
|
|