📄 led.c
字号:
/*****************************************************************************
程 序 名:实验1-按键,数码管,led综合应用【改进版】
开发环境:Keil
编 写 者:杜镇标
功能简述:设计一个单片机电路,2个按键,1位数码管,4个LED,1个按键按下,
数码管自增1(up),另一个按键按下,数码管自减1(down),4个LED
显示数字值。
硬件说明:LS8接在P1.7上,P0.1是8个LED的公共极,本实验要拉低P0.1,
由于按键和数码以及LED显示都公用P1,程序要分时扫描进行,晶体为12MHz
完成日期:2009.4.23
******************************************************************************/
#include <reg51.h>
//定义位操作
sbit ls0=P0^1; //LED公共极
sbit ls1=P0^2; //个位公共极
sbit key=P0^6; //键盘公共线,见原理图
char mun; //读取的键值
#define Dat P1 //数据输出端
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管数字显示表
// 对应显示 0 1 2 3 4 5 6 7 8 9
unsigned char table[]={0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6}; // 四个led二进制显示
// 对应显示 0 1 2 3 4 5 6 7 8 9
//延时----------------------------
Delay(unsigned int t)
{
while(t--);
}
//显示----------------------------
void Display(char mun)
{
unsigned char k,j;
for(k=0;k<50;k++)
{
Dat=table[mun];
ls0=0; //拉低公共线
Delay(10);
ls0=1;
}
for(j=0;j<50;j++)
{
Dat=tab[mun];
ls1=0;
Delay(10);
ls1=1;
}
Dat=0xff; //!!!!因为公用P1,所以个子程序用完P1后要恢复为0xff
}
//--键盘扫描程序--------------------------------------
Scankey()
{
unsigned char i;
key=0; //拉低键盘公共线
if(Dat!=0xff) //有按键按下
{
Delay(1000); //消抖动
if(Dat!=0xff) //的确有键按下
{
i=~Dat; //读取键盘状态,因为键盘按下位=0,抬起=1,所以这里取反便于下面分析
switch(i)
{
case 0x01:mun=mun++;break; //K1
case 0x02:mun=mun--;break; //K2
default: mun=mun;break; //其它双键按下不处理,均=0
}
switch(mun)
{
case -1:mun=9;break; //过小时
case 10:mun=0;break; //过大时
default: mun=mun;break; //其它双键按下不处理,均=0
}
while(Dat!=0xff)
{key=1; //暂时关闭键盘,不干扰显示
Display(mun); //等待按键抬起
key=0; //开启键盘检测
}
}
}
key=1; //释放键盘公共线
}
//--主程序---------------------------------------------------------
main()
{
mun=0; //开机显示"0"
while(1)
{
Display(mun); //显示
Scankey(); //键盘扫描
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -