标题:
error C141: syntax error near 'void'求助解决单片机C语言代码错误
[打印本页]
作者:
Remember.
时间:
2021-6-23 19:56
标题:
error C141: syntax error near 'void'求助解决单片机C语言代码错误
编译时在290行处显示(290): error C141: syntax error near 'void',求帮忙改正
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define datasend P0
sbit lcden=P1^2; //LCD 使能端
sbit lcdrs=P1^0; //LCD 数据/指令(H/L)选择端
sbit lcdrw=P1^1;
uchar mytable0[ ]=" Welcometo ";
uchar mytable1[ ]=" Yangzhou Univ.";
uchar code line0[ ]=" 2021-6-24 "; //初始化显示
uchar code line1[ ]=" 00:00:00 ";
uchar code month0[ ]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年月
uchar code month1[ ]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年月
uchar count,hour,minute,second,year=1,month=1,date=1;
uchar slnum; //slnum :定义功能键按下次数变量
void delay (unsigned int z)//延时子函数 z*lms
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_(unsigned char c) //写命令子函数
{
lcdrs=0; //低电平选择为写指令
lcden=0;
datasend=c; //把指令写入P0 口
delay(5);
lcden=1; //开使能
delay(5); //读取指令
lcden=0; //关闭使能
}
void write_data(unsigned char d) //写数据子函数
{
lcdrs=1;//高电平选择为写数据
datasend=d;//把数据写入P0 口
delay(5);
lcden=1;//开使能
delay(5);//读取数据
lcden=0;//关闭使能
}
void write_hms(uchar add,uchar dat) //时分秒写函数 add :输入位置设置变量 dat :输入时分秒数据
{
uchar sw,gw;//定义十位,个位变量
sw=dat/10;
gw=dat%10;
write_(0x80+0x40+add);//从第一行(add)位开始写数据
write_data(0x30+sw);//写入十位
write_data(0x30+gw);//写入个位
}
void write_ymd(uchar add,uchar dat)//年月日写函数 add :输入位置设置变量 dat :输入时分秒数据
{
uchar sw,gw;
sw=dat/10;
gw=dat%10;
write_(0x80+add);//从第一行(add)位开始写数据
write_data(0x30+sw);//写入十位
write_data(0x30+gw);//写入个位
}
void t0() interrupt 1//定时器0中断子程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
void gethms()//时分秒处理子程序
{
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
date++;
}
write_hms(2,hour);//时输出显示
}
write_hms(5,minute);//分输出显示
}
write_hms(8,second);//秒输出显示
}
void getymd( )//年月日处理子程序
{
if(year%4==0)
{
if(date==month1[month-1]+1)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
{
year=1;
}
write_ymd(4,year);
}
write_ymd(7,month);
}
write_ymd(10,date);
}
else
{
if(date==month0[month-1]+1)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
{
year=1;
}
write_ymd(4,year);
}
write_ymd(7,month);
}
write_ymd(10,date);
}
}
void key_process()//按键扫描子程序
{
if(P2==0xf6)//功能键
delay(25);
if(P2==0xf6)//功能键按下
{
while(P2==0xf6);//松手检测
slnum++;//功能键按下计数
TR0=0;//T0定时停止,进入时间调整
switch(slnum)
{
case 1: write_(0x80+0x40+0x09);break;//光标闪烁位定为秒个位
case 2: write_(0x80+0x40+0x06);break;//光标闪烁位定为分个位
case 3: write_(0x80+0x40+0x03);break;//光标闪烁位定为时个位
case 4: write_(0x80+0x0b);//光标闪烁位定为日个位
case 5: write_(0x80+0x08);//光标闪烁位定为月个位
case 6: write_(0x80+0x05);//光标闪烁位定为年个位
}
write_(0x0f);//光标闪烁
if(slnum==7)
{
slnum=0;//按键计数复位
write_(0x0c);//光标停止闪烁
TR0=1;//重新启动定时器
}
}
if(P2==0xee)//时分秒+1模块
{
delay(25);
if(P2==0xee)
{
while(P2==0xee);
switch(slnum)
{
case 1: second++;//秒+
if(second==60) second=0;//复位
write_hms(8,second); //秒输出显示
write_(0x80+0x40+0x09);//光标闪烁位定为秒个位
break;
case 2: minute++;
if(minute==60) minute=0;//复位
write_hms(5,minute); //分输出显示
write_(0x80+0x40+0x06);//光标闪烁位定为分个位
break;
case 3: hour++;
if(hour==24) hour=0; //复位
write_hms(2,hour); //时输出显示
write_(0x80+0x40+0x03);//光标闪烁位定为时个位
break;
case 4: date++;//日+
if(year%4==0)//平闰年判断
break;
{
if(date==month1[month-1]+1)
{
date=1;
}
else
{
if(date==month0[month-1]+1)
{
date=1;
}
}
}
write_ymd(10,date); //日输出显示
write_(0x80+0x0b);//光标闪烁位定为日个位
break;
case 5:month++;//月+
if(month==13) month=1;
if(year%4==0)//判断日和月的配对关系
{
if(date>month1[month-1])
date=month1[month-1];
}
else
{
if(date>month0[month-1])
date=month0[month-1];
}
write_ymd(10,date); //日输出显示
write_ymd(7,month);//月输出显示
write_(0x80+0x08);//光标闪烁位定为月个位
break;
case 6: year++;//年+
if(year==100) year=1;//复位
write_ymd(4,year);//年输出显示
write_(0x80+0x05);//光标闪烁位定为年个位
break;
}
}
}
if(P2==0xde)//时分秒-1模块
{
delay(5);
if(P2==0xde)
{
while(P2==0xde);
switch(slnum)
{
while(P2==0xde);
switch(slnum)
{
case 1:second--;//秒-
if(second==255) second=59; //复位
write_hms(8,second);//秒输出显示
write_(0x80+0x40+0x09);//光标闪烁位定为秒个位
break;
case 2: minute--;
if(minute==255) minute=59;//复位
write_hms(5,minute); //分输出显示
write_(0x80+0x40+0x06);//光标闪烁位定为分个位
break;
case 3: hour--;
if(hour==255) hour=23; //复位
write_hms(2,hour); //时输出显示
write_(0x80+0x40+0x03);//光标闪烁位定为时个位
break;
case 4: date--;//日-
if(year%4==0)//平闰年判断
{
if(date==0)
{
date=month1[month-1];
}
}
else
{
if(date==0)
{
date=month0[month-1];
}
}
write_ymd(10,date); //日输出显示
write_(0x80+0x0b);//光标闪烁位定为日个位
break;
case 5:month--; //月-
if(month==0) month=12;
if(year%4==0) //判断日和月的配对关系
{
if(date>month1[month-1])
date=month1[month-1];
}
{
if(date>month0[month-1])
date=month0[month-1];
}
write_ymd(10,date); //日输出显示
write_ymd(7,month);//月输出显示
write_(0x80+0x08);//光标闪烁位定为月个位
break;
case 6: year--;//年-
if(year==1) year=99;//复位
write_ymd(4,year);//年输出显示
write_(0x80+0x05);//光标闪烁位定为年个位
break;
}
}
}
}
void initialize()//LCD初始化函数
{
uchar num;
lcden=0;
write_(0x38);//设置16x2显示,5x7点阵显示,8位数据接口
write_(0x0c);//00001DCB,D(开关显示),C(是否显示光标),B(光标闪烁,光标不显示)
write_(0x06);//000001N0,N(地址指针+-1)
write_(0x01);//清屏指令 每次显示下一屏容时,必须清屏
write_(0x80+0x10);//第一行显示
for(num=0;num<16;num++)//显示16个字符
{
write_data(mytable0[num]);
delay(10);
}
write_(0x80+0x50);//第二行,从第一格开始显示
for(num=0;num<16;num++)//显示16个字符
{
write_data(mytable1[num]);
delay(10);
}
for(num=0;num<16;num++)
{
write_(0x1c);//0001(S/C)(R/L)**;S/C:高电平移动字符,低电平移动光标;R/L:高电平左移,低电平右移
delay(300);
}
delay(1000);
write_(0x01);//清屏指令 每次显示下一屏内容时,必须清屏
write_(0x80);
for(num=0;num<13;num++)//初始化第一行显示
{
write_data(line0[num]);
delay(50);
}
write_(0x80+0x40);//第二行,顶格显示
for(num=0;num<10;num++)//初始化第二行显示
{
write_date(line1[num]);
delay(50);
}
TMOD=0x01;//定时器0中断初值设置
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1:
ET0=1;
TR0=1;
}
void main()
{
lcdrw=0;
P2=0xfe;
initialize();//初始化
while(1)
{
key_process();//按键扫描
if(count==20)//定时1s运行模块
{
count=0;
gethms();//时分秒数据处理
getymd();//年月日数据处理
}
}
}
复制代码
作者:
angmall
时间:
2021-6-23 20:53
给你改了,对比一下就知道哪里错了。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define datasend P0
sbit lcden=P1^2; //LCD 使能端
sbit lcdrs=P1^0; //LCD 数据/指令(H/L)选择端
sbit lcdrw=P1^1;
uchar mytable0[ ]=" Welcometo ";
uchar mytable1[ ]=" Yangzhou Univ.";
uchar code line0[ ]=" 2021-6-24 "; //初始化显示
uchar code line1[ ]=" 00:00:00 ";
uchar code month0[ ]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年月
uchar code month1[ ]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年月
uchar count,hour,minute,second,year=1,month=1,date=1;
uchar slnum; //slnum :定义功能键按下次数变量
void delay (unsigned int z)//延时子函数 z*lms
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_(unsigned char c) //写命令子函数
{
lcdrs=0; //低电平选择为写指令
lcden=0;
datasend=c; //把指令写入P0 口
delay(5);
lcden=1; //开使能
delay(5); //读取指令
lcden=0; //关闭使能
}
void write_data(unsigned char d) //写数据子函数
{
lcdrs=1;//高电平选择为写数据
datasend=d;//把数据写入P0 口
delay(5);
lcden=1;//开使能
delay(5);//读取数据
lcden=0;//关闭使能
}
void write_hms(uchar add,uchar dat) //时分秒写函数 add :输入位置设置变量 dat :输入时分秒数据
{
uchar sw,gw;//定义十位,个位变量
sw=dat/10;
gw=dat%10;
write_(0x80+0x40+add);//从第一行(add)位开始写数据
write_data(0x30+sw);//写入十位
write_data(0x30+gw);//写入个位
}
void write_ymd(uchar add,uchar dat)//年月日写函数 add :输入位置设置变量 dat :输入时分秒数据
{
uchar sw,gw;
sw=dat/10;
gw=dat%10;
write_(0x80+add);//从第一行(add)位开始写数据
write_data(0x30+sw);//写入十位
write_data(0x30+gw);//写入个位
}
void t0() interrupt 1//定时器0中断子程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
void gethms()//时分秒处理子程序
{
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
date++;
}
write_hms(2,hour);//时输出显示
}
write_hms(5,minute);//分输出显示
}
write_hms(8,second);//秒输出显示
}
void getymd( )//年月日处理子程序
{
if(year%4==0)
{
if(date==month1[month-1]+1)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
{
year=1;
}
write_ymd(4,year);
}
write_ymd(7,month);
}
write_ymd(10,date);
}
else
{
if(date==month0[month-1]+1)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
{
year=1;
}
write_ymd(4,year);
}
write_ymd(7,month);
}
write_ymd(10,date);
}
}
void key_process()//按键扫描子程序
{
if(P2==0xf6)//功能键
delay(25);
if(P2==0xf6)//功能键按下
{
while(P2==0xf6);//松手检测
slnum++;//功能键按下计数
TR0=0;//T0定时停止,进入时间调整
switch(slnum)
{
case 1: write_(0x80+0x40+0x09);break;//光标闪烁位定为秒个位
case 2: write_(0x80+0x40+0x06);break;//光标闪烁位定为分个位
case 3: write_(0x80+0x40+0x03);break;//光标闪烁位定为时个位
case 4: write_(0x80+0x0b);//光标闪烁位定为日个位
case 5: write_(0x80+0x08);//光标闪烁位定为月个位
case 6: write_(0x80+0x05);//光标闪烁位定为年个位
}
write_(0x0f);//光标闪烁
if(slnum==7)
{
slnum=0;//按键计数复位
write_(0x0c);//光标停止闪烁
TR0=1;//重新启动定时器
}
}
if(P2==0xee)//时分秒+1模块
{
delay(25);
if(P2==0xee)
{
while(P2==0xee);
switch(slnum)
{
case 1: second++;//秒+
if(second==60) second=0;//复位
write_hms(8,second); //秒输出显示
write_(0x80+0x40+0x09);//光标闪烁位定为秒个位
break;
case 2: minute++;
if(minute==60) minute=0;//复位
write_hms(5,minute); //分输出显示
write_(0x80+0x40+0x06);//光标闪烁位定为分个位
break;
case 3: hour++;
if(hour==24) hour=0; //复位
write_hms(2,hour); //时输出显示
write_(0x80+0x40+0x03);//光标闪烁位定为时个位
break;
case 4: date++;//日+
if(year%4==0)//平闰年判断
break;
{
if(date==month1[month-1]+1)
{
date=1;
}
else
{
if(date==month0[month-1]+1)
{
date=1;
}
}
}
write_ymd(10,date); //日输出显示
write_(0x80+0x0b);//光标闪烁位定为日个位
break;
case 5:month++;//月+
if(month==13) month=1;
if(year%4==0)//判断日和月的配对关系
{
if(date>month1[month-1])
date=month1[month-1];
}
else
{
if(date>month0[month-1])
date=month0[month-1];
}
write_ymd(10,date); //日输出显示
write_ymd(7,month);//月输出显示
write_(0x80+0x08);//光标闪烁位定为月个位
break;
case 6: year++;//年+
if(year==100) year=1;//复位
write_ymd(4,year);//年输出显示
write_(0x80+0x05);//光标闪烁位定为年个位
break;
}
}
}
if(P2==0xde)//时分秒-1模块
{
delay(5);
if(P2==0xde)
{
while(P2==0xde);
switch(slnum)
{
// while(P2==0xde); <------??
// switch(slnum) <------??
// { <------??
case 1:second--;//秒-
if(second==255) second=59; //复位
write_hms(8,second);//秒输出显示
write_(0x80+0x40+0x09);//光标闪烁位定为秒个位
break;
case 2: minute--;
if(minute==255) minute=59;//复位
write_hms(5,minute); //分输出显示
write_(0x80+0x40+0x06);//光标闪烁位定为分个位
break;
case 3: hour--;
if(hour==255) hour=23; //复位
write_hms(2,hour); //时输出显示
write_(0x80+0x40+0x03);//光标闪烁位定为时个位
break;
case 4: date--;//日-
if(year%4==0)//平闰年判断
{
if(date==0)
{
date=month1[month-1];
}
}
else
{
if(date==0)
{
date=month0[month-1];
}
}
write_ymd(10,date); //日输出显示
write_(0x80+0x0b);//光标闪烁位定为日个位
break;
case 5:month--; //月-
if(month==0) month=12;
if(year%4==0) //判断日和月的配对关系
{
if(date>month1[month-1])
date=month1[month-1];
}
{
if(date>month0[month-1])
date=month0[month-1];
}
write_ymd(10,date); //日输出显示
write_ymd(7,month);//月输出显示
write_(0x80+0x08);//光标闪烁位定为月个位
break;
case 6: year--;//年-
if(year==1) year=99;//复位
write_ymd(4,year);//年输出显示
write_(0x80+0x05);//光标闪烁位定为年个位
break;
}
}
}
}
void initialize()//LCD初始化函数
{
uchar num;
lcden=0;
write_(0x38);//设置16x2显示,5x7点阵显示,8位数据接口
write_(0x0c);//00001DCB,D(开关显示),C(是否显示光标),B(光标闪烁,光标不显示)
write_(0x06);//000001N0,N(地址指针+-1)
write_(0x01);//清屏指令 每次显示下一屏容时,必须清屏
write_(0x80+0x10);//第一行显示
for(num=0;num<16;num++)//显示16个字符
{
write_data(mytable0[num]);
delay(10);
}
write_(0x80+0x50);//第二行,从第一格开始显示
for(num=0;num<16;num++)//显示16个字符
{
write_data(mytable1[num]);
delay(10);
}
for(num=0;num<16;num++)
{
write_(0x1c);//0001(S/C)(R/L)**;S/C:高电平移动字符,低电平移动光标;R/L:高电平左移,低电平右移
delay(300);
}
delay(1000);
write_(0x01);//清屏指令 每次显示下一屏内容时,必须清屏
write_(0x80);
for(num=0;num<13;num++)//初始化第一行显示
{
write_data(line0[num]);
delay(50);
}
write_(0x80+0x40);//第二行,顶格显示
for(num=0;num<10;num++)//初始化第二行显示
{
write_date(line1[num]);
delay(50);
}
TMOD=0x01;//定时器0中断初值设置
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1:
ET0=1;
TR0=1;
}
void main()
{
lcdrw=0;
P2=0xfe;
initialize();//初始化
while(1)
{
key_process();//按键扫描
if(count==20)//定时1s运行模块
{
count=0;
gethms();//时分秒数据处理
getymd();//年月日数据处理
}
}
}
复制代码
作者:
lyxing
时间:
2021-6-23 21:07
看看290行前函数 {} 这个缺失。
作者:
Remember.
时间:
2021-6-23 23:03
angmall 发表于 2021-6-23 20:53
给你改了,对比一下就知道哪里错了。
大神太厉害了 ,感激不尽!!!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1