设计一个单片机C51程序,实现功能是,1、按KEY1只有红灯亮,KEY2只有黄灯亮,KEY3只有绿灯亮。2、开始右数码管显示0,每按KEY1一次数码管显示加1,至9后再循环。先已经编好程序,第一个实现,但第二个总弄不对。感觉问题很简单,就是差一点,高手帮我看一下。
/*-------------------------------------------------------------
key.h 头文件
功能:三独立键处理函数
--------------------------------------------------------------*/
#ifndef _KEY_H_
#define _KEY_H_
#include <reg51.h>
#define uchar unsigned char
#define ENTER 0x03 //定义键号
#define UP 0x01
#define DOWN 0x02
sbit UP_key = P1^0; //键引脚
sbit DOWN_key = P1^1;
sbit ENTER_key =P1^2;
/*------------------------------------------------------------------------------------
功能:毫秒延时函数
参数:当晶振为11.0592MHz时,x为ms数,误差都为16us;x=1000为1秒
------------------------------------------------------------------------------------*/
void delayms(unsigned int x)
{
unsigned char j;
while(x--)
{
for(j=0;j<123;j++){;}
}
}
/*--------------------------------------------------------------------
功能:获取键号
返回:键号
--------------------------------------------------------------------*/
uchar KeyscanNUM(void)
{
uchar key;
UP_key=1; DOWN_key=1; ENTER_key=1;
if (UP_key==0) {delayms(10);key=UP;}
if (DOWN_key==0) {delayms(10);key=DOWN;}
if (ENTER_key==0) {delayms(10);key=ENTER;}
return key;
}
#endif
下面是主程序
#include "key.h"
sbit LED_RED=P3^0;
sbit LED_YELLOW=P3^1;
sbit LED_GREEN=P3^2;
sbit LED1=P2^7;
sbit LED0=P2^6;
uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar ledbuf[2];
uchar num;
/*---------------------------------------------------
键处理子函数
功能:按UP键红灯亮,按ENTER键黄灯亮,按DOWN键绿灯亮
----------------------------------------------------*/
void KeyProc(uchar key)
{
switch (key)
{
case UP:{LED_RED=0; LED_YELLOW=1; LED_GREEN=1; num=num+1; }break;
case DOWN:{LED_RED=1; LED_YELLOW=0; LED_GREEN=1;}break;
case ENTER:{LED_RED=1; LED_YELLOW=1; LED_GREEN=0;}break;
}
}
//*主程序
void main (void)
{
uchar key;
while (1)
{
key=KeyscanNUM();
if (key==UP||key==DOWN||key==ENTER)
{
KeyProc(key);
key=0;
}
P2=dispcode[num];
}
}
#include "key.h"
sbit LED_RED=P3^0;
sbit LED_YELLOW=P3^1;
sbit LED_GREEN=P3^2;
sbit LED1=P2^7;
sbit LED0=P2^6;
uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar ledbuf[2];
/*---------------------------------------------------
键处理子函数
功能:按UP键红灯亮,按ENTER键黄灯亮,按DOWN键绿灯亮
----------------------------------------------------*/
//*主程序
void main (void)
{
uchar num;
uchar key;
while (1)
if(UP_key==0)
{
delayms(10);
if(UP_key==0)
{
LED_RED=0; LED_YELLOW=1; LED_GREEN=1;
LED1=0; P0=dispcode[num]; LED0=1;
num++;
if(num==10) num=0;
while(!UP_key);
}
}
}
单片机C51实现按键一次数码管加1程序问题。高手进。
高手进。 设计一个单片机C51程序,实现功能是,1、按KEY1只有红灯亮,KEY2只有黄灯亮,KEY3只有绿灯亮。2、开始右数码管显示0,每按KEY1一次数码管显示加1,至9后再循环。先已经编好程序,第一个实现,但第二个总弄不对。感觉问题很简单,就是差一点,高手帮我看一下。... 展开 #include "key.h"sbit LED_R...
c51单片机按键每按一次同时数码管显示数字加一是什么?
\\x0d\\x0a用外部中断,\\x0d\\x0a每中断一次,中断服务程序将数组元素加一P0=Shuzu[ax++](或指针加一:P0=*P++)\\x0d\\x0a以上假设P0口驱动数码管!\\x0d\\x0a至于数码管使用的是共阳还是共阴,就把相对的数值存在数组中!\\x0d\\x0a-\\x0d\\x0a外部中断0的中断程序入口\\x0d\\x0avoid TI_0() interrupt ...
用51单片机做一个键盘,按一下数码管加1,可是无论我怎么消抖动,总是有...
你可以在去抖程序里加入检测松手程序例如 ………if(!key) \/\/检测键盘是否按下 delay():\/\/去抖延时一般是50ms if(!key)\/\/再次检测键盘是否按下 ×××++: \/\/这里写数码管加"1"程序 while(key);\/\/加入写句,目的是等待key变为原来的状态才会执行下一条指令!希望可以帮到你!
c51单片机按键每按一次同时数码管显示数字加一是什么?
建立一个数组,用于存放 0-9的段码。int Shuzu[]={---};如果会用指针 int *P;P=Shuzu; \/\/指针指向数组!用外部中断,每中断一次,中断服务程序将数组元素加一P0=Shuzu[ax++](或指针加一:P0=*P++)以上假设P0口驱动数码管!至于数码管使用的是共阳还是共阴,就把相对的数值存在数组...
51单片机设计一个程序:按键每按一次,数码管加1;当数码管加到9后又...
]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(){ uint16 i=1000;while(i--);} void main(){ uchar n ;P2=0xfe;P1=0xff;while(1){ if(k1==0){ if(n>=9) n=0;else n++;P1=shuzu[n];while(!k1);delay();while(!k1);} } } ...
51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示_百度...
3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。5、这里改成的是代表数字0的代码,如图所示。6、最后写好代码后,将生成的hex文件写进单片机,数码管显示的数字就变成0了。
51单片机按键控制数码管数字加减问题
void keyScan() \/\/1*5按键扫描函数 { P3 = P3 | 0xf8; \/\/P3高5位置1,设置为输入,默认为高电平 0xf8=11111000 keyValue = P3;if((keyValue & 0xf8) != 0xf8) { \/\/判断是否有按键按下 delay(20); \/\/延时肖抖 keyValue = P3;if((keyValue & 0xf8) != 0xf8) ...
51单片机汇编语言按键控制数码管加1加到999
思路是对的,细节描述有问题,算法描述要严谨。为什么要99时清零啊,这可能就是错误的地方了。系统初始化时,清除使用到的寄存器!!然后,当需要加1时做如下动作 寄存器a = a+1 如果寄存器a == 100,{寄存器b=b+1;寄存器a = 0} 这样就可以了,b中的1代表100,a中的1就是1 ...
请教高手,用51单片机独立按键控制数码管数字加减,为什么在按下独立按...
数码管一般都是动态扫描的,利用人眼的视觉暂留做的,你按下按键的时候,肯定有延时消抖,延时的时候就影响了数码管显示,所以数码管刷新的慢了,人眼就能分辨出来亮和灭的状态...解决办法 1、改进按键扫描 2、改进数码管显示 3、用嵌入式系统 以上三选一即可解决 ...
c51单片机按键控制数码管循环加1、减1电路设计
if(key==k1) { if(s<9) s++; esle s=0;}else if(key==k2) {if(s>0) s--; esle s=9;}主要程序应该就这是这样,key为键值,s为显示在数码管上的值