/********************************************************************
* 文件名 : 独立按键.c
* 描述 : 该程序实现独立按键的判断,按了相应的独立按键后,在LED上进行表现。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void KEY()
{
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay(2); //20毫秒软件防抖
if(KEY1 == 0)
{
LED1 = 0;
LED2 = 1;
LED3 = 1;
}
if(KEY2 == 0)
{
LED1 = 1;
LED2 = 0;
LED3 = 1;
}
if(KEY3 == 0)
{
LED1 = 1;
LED2 = 1;
LED3 = 0;
}
Delay(50); //延时0.5秒再进行下次按键的检测
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
while(1)
{
KEY();
}
}
/********************************************************************
* 文件名 : 数码管字符显示.c
* 描述 : 按下按键,数码管上显示的数字加1。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY = P3^2;
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar i = 0;
P2 = 7;
while(1)
{
P0 = table[i%16]; //这里i%16是防止table中的数据在0--15,不会溢出
if(KEY == 0)
{
i++;
Delay(30); //延时0.3秒,防止按一次按键,程序自加多次的情况
}
}
}
/********************************************************************
* 文件名 : 独立按键.c
* 描述 : 数码管上最开始显示“88”。
按S1,数码管上的值减1.
按S2,数码管上的值加1.
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
uint i=88;
//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的数组可以显示数值外,还可以显示数码管的点
uchar table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uchar temp)
{
uchar j;
for(j=0;j<temp;j++)
{
P0 = table[(i/10)%10];
P2 = 6;
Delay_1ms(5);
P0 = table[i%10];
P2 = 7;
Delay_1ms(5);
}
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay(2); //20毫秒软件防抖
if(KEY1 == 0)
{
Delay(10);
return 1;
}
if(KEY2 == 0)
{
Delay(10);
return 2;
}
if(KEY3 == 0)
{
Delay(10);
return 3;
}
Delay(10);
}
return 0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar temp;
while(1)
{
temp = KEY();
if(temp == 1)
{
i--;
}
if(temp == 3)
{
i++;
}
P0 = 0;
P2 = 6;
P0 = table[(i/10)%10];
Delay_1ms(3);
P0 = 0;
P2 = 7;
P0 = table[i%10];
Delay_1ms(3);
}
}
/********************************************************************
* 文件名 : 独立按键.c
* 描述 : 这个代码相对于初学者比较麻烦一些。
在数码管上显示全是0.
当按下S18,这个时候是选择某一位数码管,数码管会稍微亮一些。
当按下S19或S17, 这时被选择的那位数码管可以进行加减控制。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
//数码管的段码编码
uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar SLED[8]={0};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 16ms * del ,
在延时函数中加入了数码管的操作,
这样按下按键后延时,数码管不会闪烁。
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uchar temp)
{
uchar i,j;
for(j=0;j<temp;j++)
{
for(i=0;i<8;i++)
{
P0 = 0;
P2 = i;
P0 = table[SLED[i]];
Delay_1ms(2);
}
}
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay(2); //20毫秒软件防抖
if(KEY1 == 0)
{
Delay(10);
return 1;
}
if(KEY2 == 0)
{
Delay(10);
return 2;
}
if(KEY3 == 0)
{
Delay(10);
return 3;
}
Delay(10);
return 0;
}
return 0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar temp,i=0,j=0,cs=0;
while(1)
{
temp = KEY();
if(temp == 1)
{
if(SLED[cs] != 0)
{
SLED[cs] = SLED[cs] - 1; //被选数码管的值减1
}
}
if(temp == 2)
{
if(cs != 7)
{
cs++; //被选数码管右移一位
}
else
{
cs = 0;
}
}
if(temp == 3)
{
if(SLED[cs] != 9)
{
SLED[cs] = SLED[cs] + 1; //被选数码管的值加1
}
}
for(i=0;i<8;i++)
{
if(i != cs)
{
P0 = 0;
P2 = i;
P0 = table[SLED[i]];
Delay_1ms(1);
}
else //如果是被选择的那个数码管,进入下面控制
{
P0 = 0;
P2 = i;
P0 = table[SLED[i]];
Delay_1ms(10); //延时时间长一点,这时,数码管更亮
}
}
}
}
/********************************************************************
* 文件名 : 数码管字符显示.c
* 描述 : 按下S19按键,数码管上显示的数字加1。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY = P3^2;
/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar i = 0;
P2 = 0xfe;
while(1)
{
if(KEY == 1)
{
P0 = 0x76; //"H";
}
if(KEY == 0)
{
P0 = 0x38; //"L"
}
}
}
/********************************************************************
* 文件名 : 独立按键.c
* 描述 : 首先,在点阵的中间显示一个点。
当您按独立按键的下方或者左右的时候,点阵会随之移动。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2; //点左移
sbit KEY2 = P3^3; //点下移
sbit KEY3 = P3^4; //点右移
unsigned char tabP0[]={0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00};
unsigned char tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay_1ms(20); //20毫秒软件防抖
if(KEY1 == 0)
{
Delay_1ms(100); //延时0.5秒再进行下次按键的检测
return 1;
}
if(KEY2 == 0)
{
Delay_1ms(100); //延时0.5秒再进行下次按键的检测
return 2;
}
if(KEY3 == 0)
{
Delay_1ms(100); //延时0.5秒再进行下次按键的检测
return 3;
}
return 0;
}
return 0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar i,j,tempP0;
while(1)
{
for(i=0; i<8; i++)
{
if(tabP0[i] != 0)
{
tempP0 = i; //这里的目的是找出现在的点在哪行
}
}
switch(KEY())
{
case 1:
if(tempP0 != 7) //没有到边
{
tabP0[tempP0+1]=tabP0[tempP0]; //把数据传给数组的另一位
tabP0[tempP0]=0x00; //本身的这位清零
}
break;
case 2:
j=tabP0[tempP0]; //把j的值左移一位
j = _crol_(j,1);
tabP0[tempP0]=j;
break;
case 3:
if(tempP0 != 0) //没有到边
{
tabP0[tempP0-1]=tabP0[tempP0]; //把数据传给数组的另一位
tabP0[tempP0]=0x00; //本身的这位清零
}
break;
default:
break;
}
for(i=0;i<8;i++)
{
P0=0;
P2=tabP2[i];
P0=tabP0[i];
Delay_1ms(2);
}
}
}
/********************************************************************
* 文件名 : 点阵显示.c
* 描述 : 按下相应的独立按键,会在数码管上显示相应的左右中
按S19显示左
按S18显示中
按S17显示右
***********************************************************************/
#include <reg52.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
//中 的编
unsigned char code tabP0ZHONG[]={0x00,0x3C,0x24,0x24,0xFF,0x24,0x24,0x3C};
//“左”的
unsigned char code tabP0Z[]={0x00,0x94,0x94,0xF4,0x9F,0x94,0x24,0x44};
//“右”的
unsigned char code tabP0Y[]={0x00,0xF4,0x94,0x94,0x9F,0xF4,0x24,0x44};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uchar i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay_1ms(20); //20毫秒软件防抖
if(KEY1 == 0)
{
Delay_1ms(100); //延时0.1秒再进行下次按键的检测
return 1;
}
if(KEY2 == 0)
{
Delay_1ms(100); //延时0.1秒再进行下次按键的检测
return 2;
}
if(KEY3 == 0)
{
Delay_1ms(100); //延时0.1秒再进行下次按键的检测
return 3;
}
return 0;
}
return 0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
int i,temp,flag;
while(1)
{
temp = KEY();
if(temp != 0) //这里判断是否按键按下,按下后,才改变要显示的值
{
flag = temp; //存标志
}
for(i=0;i<8;i++)
{
P0=0;
P2=tabP2[i];
if(flag == 1)
{
P0=tabP0Z[i]; //显示“左”
}
if(flag == 2)
{
P0=tabP0ZHONG[i]; //显示 中
}
if(flag == 3)
{
P0=tabP0Y[i]; //显示“右”
}
Delay_1ms(2);
}
}
}
/********************************************************************
* 文件名 : 独立按键.c
* 描述 : 该程序实现独立按键的判断,按了相应的独立按键后,
会在数码管上显示最先被按下的值,只有按复位按键或者重新开电才消失。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
//数码管的段码编码
uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay_1ms(20); //20毫秒软件防抖
if(KEY1 == 0)
{
Delay_1ms(200);
return 1;
}
if(KEY2 == 0)
{
Delay_1ms(200);
return 2;
}
if(KEY3 == 0)
{
Delay_1ms(200);
return 3;
}
Delay_1ms(200);
}
return 0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar temp,i=0,j=0,cs=0;
while(1)
{
temp = KEY(); //判断是否有按键按下
if(temp != 0)
{
break; //如果按下,那么退出循环
}
}
P0 = table[temp]; //显示是哪个按键按下了
P2 = 7;
while(1); //程序停止
}
/********************************************************************
* 文件名 : 步进电机.c
* 描述 : 按键的长短键操作。
按了按键后,数码管的值加减1。
如果长按住,会发现数码管快速加减。
***********************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2; //数码管的值加1 "S19"
sbit KEY2 = P3^4; //数码管的值减1 "S17"
uint angle = 100;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Delay_LED()
* 功能 : 延时代码,延时3毫秒,在延时中加入了数码管的显示,防止按键时抖动
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay_LED(uchar del)
{
uchar i;
for(i=0;i<del;i++)
{
P0 = 0x00;
P2 = 7;
P0 = table[angle%10];
Delay(1);
P0 = 0x00;
P2 = 6;
P0 = table[angle/10%10];
Delay(1);
P0 = 0x00;
P2 = 5;
P0 = table[angle/100%10];
Delay(1);
}
}
void KEY(void)
{
if((KEY2 == 0) && (angle > 0)) //按P3.4,数码管的值减1
{
Delay(15);
if((KEY2 == 0) && (angle > 0))
{
angle--;
}
Delay_LED(100);
if((KEY2 == 0) && (angle > 0))
{
Delay_LED(100);
angle--;
if((KEY2 == 0) && (angle > 0))
{
Delay_LED(80);
angle--;
while(1) //进入循环,里面进行长键检测
{
if((KEY2 == 0) && (angle > 0))
{
angle--;
Delay_LED(20);
}
else
{
break;
}
}
}
}
}
if(KEY1 == 0) //按P3.4,数码管的值加1
{
Delay_LED(15);
if(KEY1 == 0)
{
angle++;
}
Delay_LED(100);
if(KEY1 == 0)
{
Delay_LED(100);
angle++;
if(KEY1 == 0)
{
Delay_LED(80);
angle++;
while(1) //进入循环,里面进行长键检测
{
if(KEY1 == 0)
{
angle++;
Delay_LED(20);
}
else
{
break;
}
}
}
}
}
}
main()
{
while(1)
{
KEY();
Delay_LED(1);
}
}