找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 357|回复: 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;

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

使用道具 举报

沙发
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};改成定义和赋值分开

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

使用道具 举报

5#
ID:1109793 发表于 2024-5-9 14:08 | 只看该作者
你这绿色背景怎么弄的啊
回复

使用道具 举报

6#
ID:77589 发表于 2024-5-9 14:15 | 只看该作者
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL}; 不能在函数内部这样写。
回复

使用道具 举报

7#
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;
回复

使用道具 举报

8#
ID:1109793 发表于 2024-5-9 15:12 | 只看该作者
asdadqw2 发表于 2024-5-9 13:24
把定义和赋值分开也不行

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

使用道具 举报

9#
ID:1119939 发表于 2024-5-9 15:47 | 只看该作者
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};
回复

使用道具 举报

10#
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;
回复

使用道具 举报

11#
ID:883242 发表于 2024-5-9 16:20 | 只看该作者
不能这样赋值,回去看c语言教材。
回复

使用道具 举报

12#
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;

试过了,不行
回复

使用道具 举报

13#
ID:298743 发表于 2024-5-9 17:36 | 只看该作者
xiaobendan001 发表于 2024-5-9 14:08
你这绿色背景怎么弄的啊

不清楚
回复

使用道具 举报

14#
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;
回复

使用道具 举报

15#
ID:883242 发表于 2024-5-9 19:10 | 只看该作者
asdadqw2 发表于 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;

报什么错?
回复

使用道具 举报

16#
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;
}
回复

使用道具 举报

17#
ID:1118092 发表于 2024-5-9 19:46 | 只看该作者
看着同问题
回复

使用道具 举报

18#
ID:712493 发表于 2024-5-9 20:49 | 只看该作者
unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL这个会自己变成连续地址?
回复

使用道具 举报

19#
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个就一定是独立的连续地址。
回复

使用道具 举报

20#
ID:879348 发表于 2024-5-10 08:51 | 只看该作者
定义变量赋值是编译的时候完成的,所以不能赋值变量
回复

使用道具 举报

21#
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);
}
回复

使用道具 举报

22#
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];试试。
回复

使用道具 举报

23#
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标准了。
回复

使用道具 举报

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

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

使用道具 举报

25#
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;
回复

使用道具 举报

26#
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 单片机教程网

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