专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
【求助】遇到了一个错误,怎么调都不行,网上查也没有例子,帮帮忙*ERROR :can’t initialize .bad type or class
2019-07-15 08:48
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
4660
5
1149
我是把74HC595锁存器控制四位数码管的程序放进了原来的程序,之前两个程序都是没有错误的,但是放进去之后keil把我定义的常数数组报错,很不解,希望大佬帮我调一下程序,万分感谢
测试.rar
下载积分: 积分 -1 分
21.92 KB, 下载次数: 2, 下载积分: 积分 -1 分
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
循迹123
2019-07-15 19:48
#include<reg52.h>
#include<string.h>
sbit si=P3^5; //数码管三位数据线
sbit sck=P3^6;
sbit 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<j;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<<i)&0x80;//si是传输数据位 移位寄存器往出移的数据:先出来高位,再出来低位
sck=0;
_nop_();
_nop_();
sck=1; //当sck上升沿时,si改变有效
}
for(k=0;k<8;k++) //后移段码
{
dat1=table[dat];
si=(dat1<<k)&0x80;//si是传输数据位 移位寄存器往出移的数据:先出来高位,再出来低位
sck=0;
_nop_();
_nop_();
sck=1; //当sck上升沿时,si改变有效
}
rck=0;
_nop_();
_nop_();
rck=1; //上升沿时移位寄存器的数据进入数据存储寄存器
}
/*******************************
* 主程序
*******************************/
void main()
{
open=0; //开机
while(1) //循环扫描
{
middle(); //处理扫描按键
}
}
加载中...
查看其它5个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include<reg52.h>
#include<string.h>
sbit si=P3^5; //数码管三位数据线
sbit sck=P3^6;
sbit 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<j;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<<i)&0x80;//si是传输数据位 移位寄存器往出移的数据:先出来高位,再出来低位
sck=0;
_nop_();
_nop_();
sck=1; //当sck上升沿时,si改变有效
}
for(k=0;k<8;k++) //后移段码
{
dat1=table[dat];
si=(dat1<<k)&0x80;//si是传输数据位 移位寄存器往出移的数据:先出来高位,再出来低位
sck=0;
_nop_();
_nop_();
sck=1; //当sck上升沿时,si改变有效
}
rck=0;
_nop_();
_nop_();
rck=1; //上升沿时移位寄存器的数据进入数据存储寄存器
}
/*******************************
* 主程序
*******************************/
void main()
{
open=0; //开机
while(1) //循环扫描
{
middle(); //处理扫描按键
}
}
一周热门 更多>