找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2537|回复: 25
收起左侧

Keil报错C247,是不是数值不能直接赋予变量值

  [复制链接]
ID:298743 发表于 2024-5-9 10:48 | 显示全部楼层 |阅读模式
keil报错,是不能直接赋予数组dat[5]={dat1,dat2,dat3,dat4,datL};这样的变量值吗?
void led_hc595_drive(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL)
{
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};
unsigned char i,j;

for(j = 0;j < 5;j++)
{
unsigned char temp = dat[j];
for(i=0;i<8;i++)
{
HC595_DS=(temp&0x80)?1:0;
HC595_SH_CP=0;
HC595_SH_CP=1;
temp<<=1;
}
}
HC595_ST_CP = 0;//上升沿 移位寄存器的数据移到存储寄存器
HC595_ST_CP = 1;


HC595_SH_CP = 0;//拉低,提高抗干扰
HC595_ST_CP = 0;
HC595_DS = 0;

}
回复

使用道具 举报

ID:277550 发表于 2024-5-9 12:59 | 显示全部楼层
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};改成定义和赋值分开
回复

使用道具 举报

ID:161164 发表于 2024-5-9 13:23 | 显示全部楼层
是数组不能直接用变量初始化
回复

使用道具 举报

ID:298743 发表于 2024-5-9 13:24 | 显示全部楼层
devcang 发表于 2024-5-9 12:59
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};改成定义和赋值分开

把定义和赋值分开也不行
回复

使用道具 举报

ID:1109793 发表于 2024-5-9 14:08 | 显示全部楼层
你这绿色背景怎么弄的啊
回复

使用道具 举报

ID:77589 发表于 2024-5-9 14:15 | 显示全部楼层
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL}; 不能在函数内部这样写。
回复

使用道具 举报

ID:607298 发表于 2024-5-9 15:09 | 显示全部楼层
这样试试吧
unsigned char dat[5];
dat[0] = dat1;
dat[1] = dat2;
dat[2] = dat3;
dat[3] = dat4;
dat[4] = datL;
回复

使用道具 举报

ID:1109793 发表于 2024-5-9 15:12 | 显示全部楼层
asdadqw2 发表于 2024-5-9 13:24
把定义和赋值分开也不行

要这样,dat[0] = dat1;dat[1]=……
回复

使用道具 举报

ID:1119939 发表于 2024-5-9 15:47 | 显示全部楼层
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};
回复

使用道具 举报

ID:1119939 发表于 2024-5-9 15:49 | 显示全部楼层
unsigned char dat[5]={0}; dat[0]=dat1;dat[1]=dat2;dat[2]=dat3;dat[3]=dat4;dat[4]=datL;
回复

使用道具 举报

ID:883242 发表于 2024-5-9 16:20 | 显示全部楼层
不能这样赋值,回去看c语言教材。
回复

使用道具 举报

ID:298743 发表于 2024-5-9 17:36 | 显示全部楼层
小H丶 发表于 2024-5-9 15:49
unsigned char dat[5]={0}; dat[0]=dat1;dat[1]=dat2;dat[2]=dat3;dat[3]=dat4;dat[4]=datL;

试过了,不行
回复

使用道具 举报

ID:298743 发表于 2024-5-9 17:36 | 显示全部楼层
xiaobendan001 发表于 2024-5-9 14:08
你这绿色背景怎么弄的啊

不清楚
回复

使用道具 举报

ID:298743 发表于 2024-5-9 17:37 | 显示全部楼层
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;
dat[1] = dat2;
dat[2] = dat3;
dat[3] = dat4;
dat[4] = datL;
回复

使用道具 举报

ID:883242 发表于 2024-5-9 19:10 | 显示全部楼层
asdadqw2 发表于 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;

报什么错?
回复

使用道具 举报

ID:624769 发表于 2024-5-9 19:22 | 显示全部楼层
为啥要弄个数组 给自己找不痛快呢? 直接用指针不香么?

void led_hc595_drive(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL)
{
        unsigned char *p;
        unsigned char i;
       
        p        = &dat1;
        while(p <= &datL)
        {
                for(i=0;i<8;i++)
                {
                        HC595_DS=(*p&0x80)?1:0;
                        HC595_SH_CP=0;
                        HC595_SH_CP=1;
                        *p<<=1;
                }
                p++;
        }
        HC595_ST_CP = 0;//上升沿 移位寄存器的数据移到存储寄存器
        HC595_ST_CP = 1;
       
        HC595_SH_CP = 0;//拉低,提高抗干扰
        HC595_ST_CP = 0;
        HC595_DS = 0;
}
回复

使用道具 举报

ID:1118092 发表于 2024-5-9 19:46 | 显示全部楼层
看着同问题
回复

使用道具 举报

ID:712493 发表于 2024-5-9 20:49 | 显示全部楼层
unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL这个会自己变成连续地址?
回复

使用道具 举报

ID:624769 发表于 2024-5-9 22:17 | 显示全部楼层
fj51hei 发表于 2024-5-9 20:49
unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL这个会 ...

你可以看一下关于传参的设定,只要传参超过3个就一定是独立的连续地址。
回复

使用道具 举报

ID:879348 发表于 2024-5-10 08:51 | 显示全部楼层
定义变量赋值是编译的时候完成的,所以不能赋值变量
回复

使用道具 举报

ID:1109793 发表于 2024-5-10 10:44 | 显示全部楼层
asdadqw2 发表于 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;

定义要写在前边,赋值要写函数里面的吧。
main(){
dat[0] = dat1;
……
while(1);
}
回复

使用道具 举报

ID:77589 发表于 2024-5-10 17:37 | 显示全部楼层
asdadqw2 发表于 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;

可能是编译器的问题,上面写法,我用MDK就能编译通过。
把unsigned char dat[5]={0};修改成unsigned char dat[5];试试。
回复

使用道具 举报

ID:883242 发表于 2024-5-11 22:08 | 显示全部楼层
Longan.Wang 发表于 2024-5-10 17:37
可能是编译器的问题,上面写法,我用MDK就能编译通过。
把unsigned char dat[5]={0};修改成unsigned cha ...

c99标准里面是可以随用随定义变量的。

c89标准变量定义必须在实体语句,比如赋值,前面才可以,有了实体语句就不能再定义变量了。

C51是永远都不可能支持c99标准了。
回复

使用道具 举报

ID:517951 发表于 2024-5-31 08:10 | 显示全部楼层
上面程序完全没必要用到数组, 如果要HC595送20个, 30个,100个unsigned char 数据怎么办, 单片机的栈空间要压爆. 要送的数据长度是可变的怎么办? c51是不支持可变数组的.

可以考虑传指针+数据长度的方法/或者就传一个unsigned char 参数, 也是能解决问题的.
回复

使用道具 举报

ID:421260 发表于 2024-5-31 09:34 | 显示全部楼层

这样写行
unsigned char dat[5]={0};//定义
unsigned char dat1,dat2,dat3,dat4,datL;
//下面几行在程序中运行
dat[0] = dat1;
dat[1] = dat2;
dat[2] = dat3;
dat[3] = dat4;
dat[4] = datL;
回复

使用道具 举报

ID:1121978 发表于 2024-5-31 10:55 | 显示全部楼层
这种错误提示通常是因为在Keil中初始化数组时,dat1, dat2, dat3, dat4等变量的值可能无法直接获取或不符合数据类型要求。你可以尝试分别给数组dat的各个元素赋值来避免这个问题。你可以尝试使用如下方式初始化数组:  dat[0] = dat1; dat[1] = dat2; dat[2] = dat3; dat[3] = dat4; dat[4] = datL; 这通常会避免一些编译错误,希望对你有帮助!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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