单片机/MCU论坛
直播中

循迹123

6年用户 5经验值
私信 关注
[问答]

【求助】遇到了一个错误,怎么调都不行,网上查也没有例子,帮帮忙*ERROR :can’t initialize .bad type or class

我是把74HC595锁存器控制四位数码管的程序放进了原来的程序,之前两个程序都是没有错误的,但是放进去之后keil把我定义的常数数组报错,很不解,希望大佬帮我调一下程序,万分感谢
  • QQ图片20180319222115.png

    测试.rar (2018-3-19 22:13 上传)

    21.92 KB, 下载次数: 59

回帖(7)

苏文龙

2018-3-19 22:13:59


#include
#include



***it si=P3^5;                 //数码管三位数据线
***it sck=P3^6;
***it rck=P3^7;


//函数声明
void delay(unsigned int j);
unsigned char KEY_SCAN(void);
unsigned char seg_diaplay(void);
void middle(void);
void mod(void);
void open_gun(void);
void delay(unsigned int j);
void capcharge(void);
void display_595(unsigned int dat,unsigned int wei)                //少了;?

code  char  mima[]={1,2,3};        // *ERROR :can’t initialize .bad type or class 试图初始化位或sfr  
举报

循迹123

2018-3-19 22:21:59
截的错误的图。。
举报

循迹123

2018-3-19 22:22:37

#include
#include



***it si=P3^5;                 //数码管三位数据线
***it sck=P3^6;
***it rck=P3^7;


//函数声明
void delay(unsigned int j);
unsigned char KEY_SCAN(void);
unsigned char seg_diaplay(void);
void middle(void);
void mod(void);
void open_gun(void);
void delay(unsigned int j);
void capcharge(void);
void display_595(unsigned int dat,unsigned int wei)

code  char  mima[]={1,2,3};        // *ERROR :can’t initialize .bad type or class 试图初始化位或sfr                         


unsigned int code wei_1[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//控制显示位置的数组,从左向右数,需要在第几个数码管显示内容就填几,从1开始,wei[0]什么也不显示。
unsigned int code table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管 段码  共阳数码管


bit open;                                     //开机状态
char num;              //储存每次扫描的结果

char jiamima[4];                        //输入的密码数组    密码最多为4位
char len;


/*******************************
*                    延时函数
*******************************/
void delay(unsigned int j)  
{
  unsigned int i;
  for(i = 0;i }

/*******************************
*                    扫描矩阵键盘
*******************************/
unsigned char KEY_SCAN()
{
        unsigned char key_buf;                        //暂时存储P1口状态
    unsigned char key_state;                //存储按键状态
        P2 = 0x70;                                //高四位高电平,第四位低电平
        key_buf = P2;                        //读取P1口状态
        if(key_buf != 0x70)
        {
                delay(1000);                        //延时消抖
                if(P2 == key_buf)        //再次判断是否有按键按下
                {
                        key_state = key_buf;        //高四位状态存入key_state
                        P2 = 0x0f;                        //高四位低电平,第四位高电平
                        key_buf = P2;                //读取P1口状态
                        key_state = key_state | key_buf;        //低四位状态存入key_state
                       
                while(1)
                {
                        if(P2 != key_buf)
                        return key_state;                //返回该按键坐标值(请允许我用坐标形容这个值)
                }
                }
                else
                        return 0;                        //如果没有按键按下,返回0
        }
        else
                return 0;                        //如果没有按键按下,返回0
}

/*******************************
*                    按键赋值
*******************************/
unsigned char seg_diaplay()
{
        unsigned char x;                //存储字符在数组中对应的编号
        unsigned char table_num;
        x=KEY_SCAN();
        switch(x)
        {
                case 0x6e:        table_num = 1;break;       
                case 0x5e:        table_num = 2;break;       
                case 0x3e:        table_num = 3;break;
                case 0x6d:        table_num = 4;break;
                case 0x5d:        table_num = 5;break;
                case 0x3d:        table_num = 6;break;
                case 0x6b:        table_num = 7;break;
                case 0x5b:        table_num = 8;break;
                case 0x3b:        table_num = 9;break;
                case 0x67:        table_num = 0;break;
                case 0x57:        table_num = 10;break;
                case 0x37:        table_num = 11;break;
               
                default: table_num = 12;                        //如有其它坐标值,不作处理
        }
        if(table_num<=11)
        {
                return table_num;       
        }
        else
                return 12;
}


/*******************************
*                    按键中间过程转换
*******************************/
void middle()
{

   num=seg_diaplay(); //按键赋值
  
   if(open==0)          //执行开机密码程序
      open_gun();
   else                           //执行开机之后的操作
          mod();          //执行功能
      
   

     
}


/*******************************
*                    开机程序
*******************************/
void open_gun()
{
        char k;
        bit j;
        j=0;
        if (num!=12)
        {
                  if(len<=3)
                {
               
                        if(num!=11)
                        {
                                jiamima[len]=num;
                                len++;
                                
                                display_595(num,len);//显示密码
                               
                               

                         }
                         else
                         {
                                for(k = 0;k<3;k++)
                                {
                                        if(jiamima[k]!=mima[k])
                                        {
                                                j=1;
                                        }
                                }
                                if(j==1)
                                {
                                        jiamima[k]=0;
                                        len=0;
                                }
                                else
                                {
                                        open=1;

                                        P1=0X00;
                                        len=0;
                                        for(k = 0;k<3;k++)
                                        {
                                                jiamima[k]=0;
                                               
                                        }
                                }
                         }
                }
                else
                {
                        for(k = 0;k<3;k++)
                        {
                                jiamima[k]=0;
                                len=0;
                        }       
                }
               
        }

}

/*******************************
*                    数码管显示程序       
    display_595(9,6);//在第6个数码管显示9
*******************************/
void display_595(unsigned int dat,unsigned int wei)
{
     unsigned int i,k;
     unsigned int wei1,dat1;      
      for(i=0;i<8;i++)            //先移 片选码;低位在前,高位在后。
         {
    wei1=wei_1[wei];
              si=(wei1<        sck=0;
       _nop_();
       _nop_();
       sck=1; //当sck上升沿时,si改变有效
         }
        for(k=0;k<8;k++)            //后移段码
         {
    dat1=table[dat];
              si=(dat1<        sck=0;
       _nop_();
       _nop_();
       sck=1; //当sck上升沿时,si改变有效
         }
   rck=0;
      _nop_();
      _nop_();
          rck=1;                       //上升沿时移位寄存器的数据进入数据存储寄存器   
}


/*******************************
*                    主程序
*******************************/
void main()
{

open=0;                        //开机


while(1) //循环扫描
{

middle();                 //处理扫描按键

  }




}
举报

h1654155956.5608

2018-3-20 17:14:53
引用: 小S咯 发表于 2018-3-20 09:26
#include
#include

你说的估计是正解。
举报

苏文龙

2018-3-21 08:33:48
引用: zhifubao 发表于 2018-3-20 17:14
你说的估计是正解。

说实话,我看到这里发现少了;,下面就没有继续看了,不知道下面还有没有。。
2 举报

李雷

2018-3-21 09:13:50
这中问题经常会出现,所以要养成良好的编码习惯。
举报

嘟嘟

2018-3-21 11:19:50

C语言错误

本帖最后由 我会告诉你真名 于 2018-3-21 11:24 编辑

额,确实是缺少个分号造成
举报

更多回帖

发帖
×
20
完善资料,
赚取积分