找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

改了一下单片机程序,还能帮我看看么?

[复制链接]
admin 发表于 2012-9-2 21:19:39 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管 0-9
#define uchar unsigned char
#define uint unsigned int
uchar Dis_Shiwei;//定义十位
uchar Dis_Gewei; //定义个位
sbit we0=P2^0;//位定义,此处为38译码器
sbit we1=P2^1;
sbit we2=P2^2;
uint num1,num2,key1,key2;
uchar flag;//按键标志位
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(uint cnt)
{
while(--cnt);
}
/******************************************************************/
/* 键盘扫描程序 */
/******************************************************************/
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
flag++; //有按键加1
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
return(0xff); //返回该值
}
/***************************显示****************************************/
void main(void)
{
while(flag==0) //一旦有按键,跳出该函数
{
we0=0;//000亮第一个数码管001亮第二个,动态扫描
we1=0;
we2=0;
P0=tab[num1];
delay(300);

we0=1;
we1=0;
we2=0;
P0=tab[num2];
delay(300);
key1=keyscan();
switch(key1)
{
case 0x7e:num1=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:num1=1;break;//1
case 0x7b:num1=2;break;//2
case 0x77:num1=3;break;//3
case 0xbe:num1=4;break;//4
case 0xbd:num1=5;break;//5
case 0xbb:num1=6;break;//6
case 0xb7:num1=7;break;//7
case 0xde:num1=8;break;//8
case 0xdd:num1=9;break;//9
}
}
delay(30000);//延迟防止对第二次按键的干扰
while(flag==1)
{
key2=keyscan();
switch(key2)
{
case 0x7e:num2=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:num2=1;break;//1
case 0x7b:num2=2;break;//2
case 0x77:num2=3;break;//3
case 0xbe:num2=4;break;//4
case 0xbd:num2=5;break;//5
case 0xbb:num2=6;break;//6
case 0xb7:num2=7;break;//7
case 0xde:num2=8;break;//8
case 0xdd:num2=9;break;//9
}


while(flag==2)
{
we0=0;
we1=0;
we2=0;
P0=tab[num1];
delay(300);

we0=1;
we1=0;
we2=0;
P0=tab[num2];
delay(300);
}
}
}
程序要求是第一次按键后第一个数码管显示其按键值,再次按下按键第二个数码管显示按键值,但是为什么会出现第一次按下后第一个数码管灭掉,第二个数码管亮0呢,而且再次按下后2管的示数又变成了我两次按键的值呢?
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-29 12:44 , Processed in 0.048530 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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