打印
[AVR单片机]

OLED写数字 怎么写?

[复制链接]
2708|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SD10A|  楼主 | 2017-11-20 21:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 SD10A 于 2017-11-20 21:13 编辑

@caijie001 /*******************功能描述:显示8*16一组标准ASCII字符串         显示的坐标(x,y),y为页范围0~7****************/
void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char CH[])
{
        unsigned char c=0,i=0,j=0;
        while (CH[j]!='\0')
        {
                c =CH[j]-32;
                if(x>120){x=0;y++;}
                OLED_Set_Pos(x,y);
                for(i=0;i<8;i++)
                OLED_WrDat(F8X16[c*16+i]);
                OLED_Set_Pos(x,y+1);
                for(i=0;i<8;i++)
                OLED_WrDat(F8X16[c*16+i+8]);
                x+=8;
                j++;
        }
}
//8x16数字
unsigned char F8X16[]=         
{
//0(0) 1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9) .(10)

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",0*/

0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"1",1*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*"2",2*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*"3",3*/

0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00,/*"4",4*/

0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*"5",5*/

0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"6",6*/

0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*"7",7*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*"8",8*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00,/*"9",9*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,/*".",10*/
};

unsigned char *P=&F8X16[0];


这个OLED程序是找了个51的程序,然后改写成了AVR  16X16的汉字 显示是没的问题。就是这个8X16的数字显示不了
OLED_P8x16Str(1,1,F8X16[0]);//编译报错。显示指向的是指针
OLED_P8x16Str(1,1,P);//这样写呢  是屏幕上啥都没有
OLED_P8x16Str(1,1,"3");//屏幕上有一块乱码,用汉字取模 4种方式都用过  还是乱码
我该怎么写这个CH[]呢



相关帖子

沙发
dalarang| | 2017-11-20 23:07 | 只看该作者
看起来函数原来调用的应该是ascii字符数组,你把它删减成只有数字了吧。

如果要这样用的话
c =CH[j]-32改为 c =CH[j]-48;

调用的时候直接OLED_P8x16Str(1,1,"1234");
自己需确保字符串内的字符范围是1-9

使用特权

评论回复
板凳
零点飞越| | 2017-11-21 20:37 | 只看该作者
本帖最后由 零点飞越 于 2017-11-21 22:01 编辑

void OLED_P8x16Str(unsigned char x, y,unsigned char index)
{       extern unsigned char F8X16[];//字模生成数组
            unsigned char i=0;               
                if(x>120)x=0,y++;//到边缘,转下一行显示 8*16显示
                OLED_Set_Pos(x,y);
            //显示8*8
                for(i=0;i<8;i++)OLED_WrDat(F8X16[index*16+i]);
                OLED_Set_Pos(x,y+1);
            //再显示8*8
                for(i=0;i<8;i++)OLED_WrDat(F8X16[index*16+i+8]);
       
       
}




使用特权

评论回复
地板
零点飞越| | 2017-11-21 20:51 | 只看该作者
OLED_P8x16Str(1,1,F8X16[0]);
函数原型为void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char CH[])
数据类型不匹配,一个为数组,一个是char类型。

使用特权

评论回复
评论
SD10A 2017-11-22 20:22 回复TA
我之前以为CH[]就是个数组~~~~~~~~~~~~~~ 
评分
参与人数 1威望 +3 收起 理由
SD10A + 3 感谢
5
SD10A|  楼主 | 2017-11-22 12:20 | 只看该作者
dalarang 发表于 2017-11-20 23:07
看起来函数原来调用的应该是ascii字符数组,你把它删减成只有数字了吧。

如果要这样用的话

高手  改成48就好了
感谢    现在有个疑问  1 定义的字符串数组 “ABC”  怎么跟点阵数组联系起来的?
2  改成指针P的形式  比如 写P+0 它把ABC都显示了,其实只需要显示A的   怎么用指针只显示特定的数呢?

使用特权

评论回复
6
SD10A|  楼主 | 2017-11-22 12:20 | 只看该作者
零点飞越 发表于 2017-11-21 20:37
void OLED_P8x16Str(unsigned char x, y,unsigned char index)
{       extern unsigned char F8X16[];//字 ...

太感谢了  我晚上 再试验下 你的方法

使用特权

评论回复
7
coody| | 2017-11-22 19:35 | 只看该作者
直接写点阵啊,跟LCD屏一样的道理。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
SD10A + 1
8
SD10A|  楼主 | 2017-11-22 20:15 | 只看该作者
零点飞越 发表于 2017-11-21 20:37
void OLED_P8x16Str(unsigned char x, y,unsigned char index)
{       extern unsigned char F8X16[];//字 ...


非常感谢  刚刚验证成功。可以写任意一个数字
看网上说左移的运算速度更快,我修改了下,还是能用,但是FLASH空间会增加12B
这个应该是由于unsigned char 左移  转化成 INT 数据造成的吧

for(i=0;i<8;i++)OLED_WrDat(F8X16[(index<<4)+i]);

使用特权

评论回复
9
SD10A|  楼主 | 2017-11-22 20:18 | 只看该作者
dalarang 发表于 2017-11-20 23:07
看起来函数原来调用的应该是ascii字符数组,你把它删减成只有数字了吧。

如果要这样用的话

非常感谢  我有办法 写数组中的任意单个数字了  
方法就是把 x+=8;
                j++; 去掉就可以了    想写整个字符串就加上这句就行了

使用特权

评论回复
10
SD10A|  楼主 | 2017-11-22 20:20 | 只看该作者
零点飞越 发表于 2017-11-21 20:37
void OLED_P8x16Str(unsigned char x, y,unsigned char index)
{       extern unsigned char F8X16[];//字 ...

还有这句 extern unsigned char F8X16[];//字模生成数组   
不能要  编译的时候要报警   注释掉 就能正常使用了

使用特权

评论回复
11
dalarang| | 2017-11-22 21:20 | 只看该作者
SD10A 发表于 2017-11-22 20:18
非常感谢  我有办法 写数组中的任意单个数字了  
方法就是把 x+=8;
                j++; 去掉就可以了   ...

这不扯呢嘛,这两句去掉就死循环了,你压根就没看明白这程序是怎么运行的。
真想去掉就删while (CH[j]!='\0')这句。

C语言中的字符串是以0x00结尾的,也就是'\0'。
那个函数是把字符串按字符输入屏幕,直到遇上\0字符串结束。
真想了解的话去百度下ASCII码表,结合函数仔细研究一下就能明白。

使用特权

评论回复
评论
SD10A 2017-11-22 22:27 回复TA
刚跑完回来 懂了,确实不能少那个 会进入死循环。 
SD10A 2017-11-22 22:08 回复TA
ASCII码表 之前看了 现在用-32 也可以用 就是数组从空格开始就可以了 
SD10A 2017-11-22 22:01 回复TA
我理解的的x y就是横坐标 和纵坐标,他们要是写完一个数,还继续加 就会把字符串的剩下的数都写完 
评分
参与人数 1威望 +1 收起 理由
SD10A + 1 我改了别人的 确实不明白要怎么运行。但是去掉 了 确实就是只显示一个了
12
caijie001| | 2017-11-22 22:57 | 只看该作者
其实OLED 这些底层都有提高的,我很多时候都是直接调用库函数写的,直接用就行了,根据自己需要修改一下就行,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

169

帖子

4

粉丝