|
下面开始搞,搞一个相位激光测距仪
源码下载:
完整代码 备份 15-7-13.zip
(398.12 KB, 下载次数: 306)
全部的软件代码都在这里了
5厘米到40米量程
精度1毫米
然后做了个视频演示
还写了一个上位机 远距离测试
然后又写了个上位机 近距离测试
其实也不算是自己动手做因为本来就是成品模块
好吧看来大家更关注模块哪儿买的,那我把模块的链接放在上面来吧
模块从淘宝就找到了两家,一家是550 一家是260
550元的激光测距模块
260元的国产测距模块 40米 150Mhz我买的是260的量程40米,
550的量程30米,精度高0.5mm而已,另外也就多了个读id什么的,反正测距只要知道多少长度就够了,没必要多花那么多钱
借用卖家的图片
使用串口通信发指令就行了
测量量程: 5厘米到40米
精度检测: 1毫米错误检测: 无返回信号错误, 距离太近错误
玩了一天玩透了,先上几张图大家批评批评,
用黑色的卷尺挡住激光接收口.不让模块收到激光,提示没信号
测量结果没错误的界面
正确的测量结果
既然不是技术贴,那也别装那个技术范儿,扯扯淡,大家就会玩了,
这个模块不便宜,话说为何要买这个模块,其实也是闲的蛋疼,
我的目的是从头到尾做一个激光测距仪,
不过经过查阅资料,发现这个东西是双光路,不太明白什么叫双光路,所以花钱买一个拆拆看吧,
不得不吐槽的是: 模块260,一个山寨激光测距仪才150
有没有坛友牺牲一下买个淘宝上的150元激光测距仪,拆开看看内部什么样?
不过这个模块的做工确实很渣渣,双光路就是俩塑料导光片,
从坛子里看有拆的什么徕的激光测距仪,做工真是秒杀
---------------------------------------------------------------------------------------------
这个模块卖家也除了提供一份指令表,什么也没有,真是蛋疼,那怕是给个单片机例子呢
无奈了,既然是串口,那就上串口助手吧
然后我发现rxd会重复出现主机发来的指令,比较蛋疼,
然后借助示波器查看数据出现的先后顺序,才发现,原来是模块 是根据不同的指令返回应答
有的指令返回应答后还会重复一次指令表示收到(猜测的)
然后有的指令是直接返回一个应答就完了
然后把卖家给的指令表我又重新扩充了一下,并截取了一些数据,然后根据表现我给他定义了三个模式
模式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种错误,
可能还要继续玩玩才能知道
晚整理一下把代码发上来
源码在这里,硬件连接很简单了,从代码里一看就知道
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);
-
- }
复制代码
|
|