📄 k1-k4-move-shuma-c51.c
字号:
/*******************************************************************
* *
* ME500单片机开发系统演示程序 - 计按键次数 *
* *
* 8位数码管显示 *
* *
* 版本: V1.0 (2006/11/20) *
* 作者: gguoqing (Email: gguoqing@willar.com) *
* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) *
* 邮箱: support@willar.com *
* *
*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
* *
********************************************************************
* *
* 对独立键进行按键次数计数,8位数码管显示。 *
* K1按下后,进行加1计数,逐个增加显示位。 *
* K2按下后,进行减1计数,逐个减少显示位。 *
* K3暂时没有定义功能。 *
* K4按下后,清计数单元,只有第一位数码管显示0。 *
* 数码管显示的位数随K1和K2按下的次数,增加与减少。 *
* *
*******************************************************************/
#include < reg52.h >
unsigned char k_scan();
unsigned char k_pro();
unsigned char k_new,k_old;
unsigned char k,num,x,n;
unsigned char k_count=0;
unsigned char k1_prog();
unsigned char k2_prog();
unsigned char k4_prog();
void delay(unsigned char m);
void disp_count();
sbit k1=P1^4; sbit k2=P1^5;
sbit k3=P1^6; sbit k4=P1^7;
unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff};
unsigned char data display[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char code scan_bit[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
/********************************************************/
//主程序
/********************************************************/
void main(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
k_old=0x00;
k=0x00;
while(1)
{
disp_count();
k_new=k_scan();
if(k_new!=k_old)
{
for(num=0;num<10;num++) //调显示来做键延时,去抖动
disp_count();
}
if(k_new!=k_old)
{
k=k_pro();
}
switch(k)
{
case 1: k1_prog(); break;
case 2: k2_prog(); break;
case 3: break;
case 4: k4_prog(); break;
default: break;
}
k=0x00;
}
}
/********************************************************/
//K1键功能子程序
/********************************************************/
unsigned char k1_prog()
{
k_count++; //加计数
switch(k_count)
{
case 1: display[0]=0x01; break;
case 2: display[1]=0x02; break;
case 3: display[2]=0x03; break;
case 4: display[3]=0x04; break;
case 5: display[4]=0x05; break;
case 6: display[5]=0x06; break;
case 7: display[6]=0x07; break;
case 8: display[7]=0x08; break;
default:
k_count=8; break;
}
k=0x00;
return(k_count);
}
/********************************************************/
//K2键功能子程序
/********************************************************/
unsigned char k2_prog()
{
if(k_count==0)
{ ; }
else
{
switch(k_count)
{
case 1: display[0]=0x00; break;
case 2: display[1]=0x0a; break;
case 3: display[2]=0x0a; break;
case 4: display[3]=0x0a; break;
case 5: display[4]=0x0a; break;
case 6: display[5]=0x0a; break;
case 7: display[6]=0x0a; break;
case 8: display[7]=0x0a; break;
default:
k_count=0; //键计数单元清零
break;
}
k=0x00;
k_count--; //键计数
return(k_count);
}
}
/********************************************************/
//K4键功能子程序
/********************************************************/
unsigned char k4_prog()
{
display[0]=0x00; //第一位数码管显示0
for(n=1;n<8;n++)
{
display[n]=0x0a; //关闭7个数码管
}
k_count=0; //键计数单元清零
return(k_count);
}
/********************************************************/
//显示子程序
/********************************************************/
void disp_count()
{
for(n=0;n<8;n++)
{
for(x=1;x<8;x++) //如果高位为0,不显示
{
if(display[x]==0x00)
display[x]=0x0a;
}
P0 =LEDData[display[n]] ; //显示段码
P2 =scan_bit[n]; //输出位码
delay(1);
P2 = 0xff; //关闭显示
}
}
/********************************************************/
//判键值子程序
/********************************************************/
unsigned char k_pro()
{
switch (k_new)
{
case 0x01: k=1; break; //K1按下
case 0x02: k=2; break; //K2按下
case 0x04: k=3; break; //K3按下
case 0x08: k=4; break; //K4按下
default: break;
}
return(k);
}
/********************************************************/
//扫描键子程序
/********************************************************/
unsigned char k_scan()
{
P1=0xff;
k_new=0x00;
k_new=(~P1 & 0xf0)>>4;
return(k_new); //无键按下
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -