找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 584|回复: 1
打印 上一主题 下一主题
收起左侧

keil报错:OLED.h(5): error C141: syntax error near 'void', expected ';'

[复制链接]
跳转到指定楼层
楼主
ID:1077835 发表于 2023-5-16 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了好多同样的贴子,解决不了我的问题,代码是之前写OLED的代码,之前可以运行,修改了一下,就报错了,求大佬帮忙一下
可以复制粘贴运行一下,有3的文件:OLED.c、OLED.h、zk16x16.h(字库)


首先是OLED.c文件:

#include <reg52.h>
#include <intrins.h>
#include "zk16x16.h"        //16*18点阵汉字库
#include "OLED.h"


#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define SCL_high  SCL=1                //SCL高电平
#define SCL_low  SCL=0                //SCL低电平
#define SDA_high  SDA_OLED=1                //SDA高电平
#define SDA_low  SDA_OLED=0                //SDA低电平

sbit SDA_OLED = P2^1;
sbit SCL = P2^0;




//I2C总线启动信号
void IIC_Start(void)
{
    SDA_high;
    SCL_high;
    SDA_low;
    SCL_low;       
}

//I2C总线停止信号
void IIC_Stop(void)
{
    SDA_low;
    SCL_high;
    SDA_high;
}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
       
    SCL_high;
    ackbit = SDA_OLED;
    SCL_low;
    return ackbit;
}

//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL_low;
        if(byt & 0x80) SDA_high;
        else SDA_low;
        SCL_high;
        byt <<= 1;
    }
    SCL  = 0;  
}

//延时函数
void delay(unsigned int ms)
{                        
        unsigned int a;
        while(ms)
        {
                a=1800;
                while(a--);
                ms--;
        }
        return;
}

//反显函数
void OLED_ColorTurn(unsigned char i)
{
        if(i==0)
                {
                        OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
                }
        if(i==1)
                {
                        OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
                }
}

//屏幕旋转180度
void OLED_DisplayTurn(unsigned char i)
{
        if(i==0)
                {
                        OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
                        OLED_WR_Byte(0xA1,OLED_CMD);
                }
        if(i==1)
                {
                        OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
                        OLED_WR_Byte(0xA0,OLED_CMD);
                }
}

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!          
void OLED_Clear(void)  
{  
        unsigned char i,n;                    
        for(i=0;i<8;i++)  
        {  
                OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
                OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
                OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
                for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
        } //更新显示
}

//发送一个字节
//向SSD1306写入一个字节。
//mode:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(unsigned char dat,unsigned char mode)
{
        IIC_Start();                                        //IIC起始信号
        IIC_SendByte(0x78);                                //IIC从机地址SA0=0
        IIC_WaitAck();                                        //IIC应答信号
        if(mode){IIC_SendByte(0x40);}        //mode=1,写入数据,0x40写命令
        else{IIC_SendByte(0x00);}                //mode=0,写入命令,0x00写命令
        IIC_WaitAck();                                        //IIC应答信号
        IIC_SendByte(dat);                                //写入具体命令/数据
        IIC_WaitAck();                                        //IIC应答信号
        IIC_Stop();                                                //IIC停止信号
}

//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
        OLED_WR_Byte(0xb0+y,OLED_CMD);                                        //页地址——从0xb0开始(一共8页)
        OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);                //(x&0xf0)——对应x高四位
        OLED_WR_Byte((x&0x0f),OLED_CMD);                                //(x&0x0f)——对应x第四位
}   

//初始化                                    
void OLED_Init(void)
{
        delay(200);       
        OLED_WR_Byte(0xAE,OLED_CMD); /*关显示*/
       
        OLED_WR_Byte(0x00,OLED_CMD); /*set lower column address*/
        OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/
       
        OLED_WR_Byte(0x40,OLED_CMD); /*01A5A4  A3A2A1A0 从第0行开始显示(设置”显示起始行“)*/
        OLED_WR_Byte(0xB0,OLED_CMD); /*0111 A3A2A1A0 从第0页开始显示(设置”页地址“)*/
       
        OLED_WR_Byte(0x81,OLED_CMD); /*对比度模式设置*/
        OLED_WR_Byte(0xff,OLED_CMD); /*对比度256(共256级)*/
       
        OLED_WR_Byte(0xA1,OLED_CMD); /*向左旋转(反方向)*/
       
        OLED_WR_Byte(0xA6,OLED_CMD); /*不”反白显示“(0x07为反白显示)*/
       
        OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/
        OLED_WR_Byte(0x1F,OLED_CMD); /*占空比duty = 1/32*/
       
        OLED_WR_Byte(0xAD,OLED_CMD); /*DC-DC转换模式*/
        OLED_WR_Byte(0xBB,OLED_CMD); /*显示时DC-DC打开*/
       
        OLED_WR_Byte(0xC8,OLED_CMD); /*列扫描方向*/
       
        OLED_WR_Byte(0xD3,OLED_CMD); /*设置显示偏移(滚屏)*/
        OLED_WR_Byte(0x00,OLED_CMD);
       
        OLED_WR_Byte(0xD5,OLED_CMD); /*设置OSC部门(set osc division)*/
        OLED_WR_Byte(0x80,OLED_CMD);
       
        OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/
        OLED_WR_Byte(0x1f,OLED_CMD);
       
        OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/
        OLED_WR_Byte(0x12,OLED_CMD); //行地址连续显示
       
        OLED_WR_Byte(0xdb,OLED_CMD); /*VCOM设置*/
        OLED_WR_Byte(0x40,OLED_CMD);
       
        OLED_WR_Byte(0x8d,OLED_CMD); /*设置电荷泵使能*/
        OLED_WR_Byte(0x14,OLED_CMD);
       
        OLED_WR_Byte(0xAF,OLED_CMD); /*开显示*/
        OLED_Set_Pos(0,0);//指定坐标(0列,0行)
        OLED_Clear();        //清屏
        delay(200);       
}

//显示8*16
void  OLED_8x16(unsigned char x, y, N)       
{
        unsigned char m;                        //循环计数值
        unsigned int adder=N*16;                        //字模编号
        OLED_Set_Pos(x,y);
        for(m=0;m<8;m++)
        {
                OLED_WR_Byte(Hzk[adder],OLED_DATA);
                adder++;
        }
        OLED_Set_Pos(x,y+1);
        for(m=0;m<8;m++)
        {
                OLED_WR_Byte(Hzk[adder],OLED_DATA);        //跳过右上1/4点阵
                adder++;
        }
}

//显示汉字
void OLED_ShowChinese(unsigned char x, y, N)        //16*16
{
        unsigned char m;                        //循环计数值
        unsigned int adder=N*32;                        //字模编号*32(16*16点阵,每个汉字32字节)
        OLED_Set_Pos(x,y);
        for(m=0;m<16;m++)
        {
                OLED_WR_Byte(Hzk[adder],OLED_DATA);
                adder++;
        }
        OLED_Set_Pos(x,y+1);
        for(m=0;m<16;m++)
        {
                OLED_WR_Byte(Hzk[adder],OLED_DATA);
                adder++;
        }
}

//显示汉字,为了兼容英文,将中文拆成2部分
void  OLED_ShowChinese_L(unsigned char x, y, N)        //左部分
{
        unsigned char m;                        //循环计数值
        unsigned int adder=N*32;                        //字模编号*32(16*16点阵,每个汉字32字节)
        OLED_Set_Pos(x,y);
        for(m=0;m<8;m++)
        {
                OLED_WR_Byte(Hzk[adder],OLED_DATA);
                adder++;
        }
        OLED_Set_Pos(x,y+1);
        for(m=0;m<8;m++)
        {
                OLED_WR_Byte(Hzk[adder+8],OLED_DATA);        //跳过右上1/4点阵
                adder++;
        }
}
void  OLED_ShowChinese_R(unsigned char x, y, N)        //右部分
{
        unsigned char m;                        //循环计数值
        unsigned int adder=N*32+8;                        //字模编号*32(16*16点阵,每个汉字32字节)
        OLED_Set_Pos(x,y);
        for(m=0;m<8;m++)
        {
                OLED_WR_Byte(Hzk[adder],OLED_DATA);
                adder++;
        }
        OLED_Set_Pos(x,y+1);
        for(m=0;m<8;m++)
        {
                OLED_WR_Byte(Hzk[adder+8],OLED_DATA);
                adder++;
        }
}

//显示图片
void OLED_BMP(unsigned char x, y, sizex, sizey,unsigned char BMP[])
{
        unsigned int j=0;
        unsigned char i,m;
        sizey=sizey/8+((sizey%8)?1:0);
        for(i=0;i<sizey;i++)
        {
                OLED_Set_Pos(x,i+y);
    for(m=0;m<sizex;m++)
                {      
                        OLED_WR_Byte(BMP[j++],OLED_DATA);                   
                }
        }       
}


OLED.h文件:
#ifndef __OLED_H
#define __OLED_H


void delay_ms(unsigned int ms);
void OLED_Clear(void);
void OLED_WR_Byte(unsigned char dat,unsigned char mode);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_Init(void);
void OLED_ShowChinese(unsigned char x,unsigned char y,unsigned char N);
void  OLED_ShowChinese_L(unsigned char x, y, N);
void  OLED_ShowChinese_R(unsigned char x, y, N);
void OLED_ColorTurn(unsigned char i);
void OLED_DisplayTurn(unsigned char i);
void OLED_BMP(unsigned char x, y, sizex, sizey, unsigned char BMP[]);

void  OLED_8x16(unsigned char x, y, N);

#endif


然后是zk16x16.h:

#ifndef __zk16x16_H
#define __zk16x16_H


unsigned char code Hzk[]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/

0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",1*/

0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/

0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",3*/

0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",4*/

0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/

0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",6*/

0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,/*"7",7*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/

0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
       
0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92, 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,
0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00, 0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,/*"温",10、11*/

0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25, 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,
0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00, 0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*"度",12、13*/

0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92, 0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,
0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00, 0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,/*"湿",14、15*/       

0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,/*"H",16*/

0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"T",17*/

0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,/*"<",18*/

0x04,0x44,0x84,0x14,0x64,0x0F,0x04,0xE4, 0x00,0x08,0x09,0x78,0x04,0x03,0x00,0x3F,
0x24,0x2F,0x24,0x24,0xE4,0x04,0x04,0x00, 0x40,0x40,0x42,0x44,0x43,0x40,0x78,0x00,/*"范",19、20*/

0x00,0xFE,0x02,0x12,0x52,0x52,0x52,0xFE, 0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,
0x52,0x52,0x52,0x12,0x02,0xFE,0x00,0x00, 0x41,0x49,0x51,0x4F,0x40,0xFF,0x00,0x00,/*"围",21、22*/

0x40,0x42,0xCC,0x00,0x00,0xFE,0x82,0x92, 0x00,0x00,0x3F,0x10,0x88,0x7F,0x00,0x1E,
0x92,0xFE,0x92,0x92,0x82,0xFE,0x00,0x00, 0x12,0x12,0x12,0x5E,0x80,0x7F,0x00,0x00,/*"调",23、24*/

0x04,0x74,0xD4,0x54,0xFF,0x54,0xD4,0x74, 0x82,0x89,0x88,0xE8,0x8B,0x88,0x88,0xF9,
0x14,0x08,0x77,0x84,0x44,0x3C,0x04,0x00, 0xA8,0xAA,0xA9,0xA8,0xA9,0x8A,0x82,0x00,/*"整",25、26*/

0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE, 0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,
0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00, 0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00,/*"界",27、28*/

0x02,0x02,0xE2,0x22,0x22,0xF2,0x2E,0x22, 0x00,0x00,0xFF,0x40,0x40,0x7F,0x49,0x49,
0x22,0xE2,0x22,0x22,0xE2,0x02,0x02,0x00, 0x49,0x7F,0x40,0x40,0xFF,0x00,0x00,0x00,/*"面",29、30*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"空格",31*/
}



#endif

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1077835 发表于 2023-5-16 15:06 | 只看该作者
该帖已经自己找到问题了,调用字库的时候,字库的数组少了一个分号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表