标题:
Proteus仿真单片机C语言,按设置键while跳不出去
[打印本页]
作者:
2248373991
时间:
2022-3-23 11:26
标题:
Proteus仿真单片机C语言,按设置键while跳不出去
批注 2022-03-23 112611.png
(27.7 KB, 下载次数: 42)
下载附件
2022-3-23 11:26 上传
void SetFun(void) //进入设置参数子函数
{
if(SetKey==0) //设置按键
{
if(Set1<2) Set1++; //设置按键次数累计
else Set1=0;
}
switch(Set1) //根据设置按键次数,指向对应设置位置
{
case 0:
wr_com(0x80);
wr_dat(' ');
wr_com(0x88);
wr_dat(' ');
break;//清除设置符号
case 1:
wr_com(0x80);
wr_dat('>');
wr_com(0x88);
wr_dat(' ');
break;//指向设置下限
case 2:
wr_com(0x80);
wr_dat(' ');
wr_com(0x88);
wr_dat('>');
break;//指向设置上限
}
while(SetKey==0);//等待按键松开
}
/*主函数*/
uchar global_state = 0;
uchar count_num = 0; //输入的数字个数
void main()
{
uchar i;
uchar passwd;
uchar key_value = 0;
uchar temp_key_value = 0xff;
Lock = 1; //刚上电 锁是需要保持闭合
Timer0_init(); //定时器初始化
lcd_init(); //LCD1602初始化
while(1) //进入不断循环
{
temp_key_value = Calkey_scan(); //读取矩阵按键的键值
if(temp_key_value != 0xff)
{
key_value = temp_key_value;
}
switch(global_state)
{
case 0: //初始化状态
display1(); //显示欢迎语句 -- "welcome"
display5(); //显示Current T=
Read_Temperature(); //读取温度值
display7(); //显示温度
if(SetKey==0) //设置键
{
if(SetKey==0)
{
while(1)
{
display5(); //显示Current T=
display6(); //显示上下限
Read_Temperature(); //读取温度值
display7(); //显示温度
display8(); //显示上下限温度
SetFun(); //指针>
if(SetKey==0) //再次点击设置键
{
if(SetKey==0) break;
}
}
}
}
if(key_value == 13) //存包按键被按下
{
key_value = 0xff; //将按键值清除
Lock = 0; //开锁
clear(); //清屏,准备下一屏的显示
display3(); //显示关门提示语 -- "close door!"
delay(1900); //等待关门 大约3秒
Lock = 1; //关门
clear(); //清屏,准备下一屏的显示
global_state = 1; //切换运行状态
passwd = TL0; //采用定时器寄存器的值作为密码
genPasswd[0] = passwd/100; //存储密码
genPasswd[1] = passwd%100/10;
genPasswd[2] = passwd%10;
genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
}
if(key_value == 14) //取包按键被按下
{
key_value = 0xff; //将按键值清除
clear(); //清屏,准备下一屏的显示
global_state = 2; //切换运行状态
count_num = 0; //清除数字按键变量
for(i = 0;i < 4;i++) //清空输入的密码数组
inpPasswd[i] = ' '-0x30;
}
break;
case 1: //密码生成状态
display2(); //显示密码生成界面
delay(1900); //等待大约3秒
global_state = 0; //返回到初始界面
clear(); //清屏,准备下一屏的显示
break;
case 2: //输入密码状态
display4(); //显示输入密码界面
if((key_value >= 0) && (key_value <= 9)) //如果按下的为0-9的数字按键
{
if(count_num <= 3) //如果按键次数小于4次
{
inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
count_num++;
}
key_value = 0xff; //将按键值清除
}
if(key_value == 15) //清除按键被按下
{
key_value = 0xff; //将按键值清除
for(i = 0;i < 4;i++)
inpPasswd[i] = ' '-0x30; //清除刚刚输入的密码
count_num=0;
}
if(key_value == 16) //确认按键被按下
{
key_value = 0xff; //将按键值清除
for(i = 0;i < 4;i++)
{
if(inpPasswd[i] != genPasswd[i])
break;
}
if(i == 4) //密码输入正确
{
LEDRED = 1; //红灯熄灭
LEDGREEN = 0; //绿灯亮
Lock = 1; //开锁
delay(1900); //等待大约3秒
Lock = 0; //关锁
LEDGREEN = 1; //绿灯熄灭
}
else //密码输入错误
{
LEDRED = 0; //红灯亮
LEDGREEN = 1; //绿灯熄灭
Lock = 0; //关锁
delay(1900); //等待大约3秒
LEDRED = 1; //红灯熄灭
}
clear(); //清屏,准备下一屏的显示
global_state = 0; //返回到初始界面
}
break;
}
}
}
复制代码
作者:
lkc8210
时间:
2022-3-23 16:25
不要用while(1)套while(1)
作者:
huskyhong
时间:
2022-3-23 16:37
你这程序都不全,SetKey这个值在哪里改变?没有中断或者rtos的话怎么可能跳的出去?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1