51单片机 ,用C语言编程 通过独立按键控制蜂鸣器和静态数码管,

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-10
51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等

#include //P0是数码管。P1是LED.P2是按键sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2; sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;#define uchar unsigned char#define ulint unsigned long#define Frequency 10//定时器中断时间 = f*T#define Time 1//一个周期1ms#define TubeNumber 6//数码管个数#define KeyLine 4//矩阵按键行数 #define KeyColumn 4//矩阵按键列数 //数码管真值表uchar code LED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//uchar code LED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};/*0~9 A~F (b 、d为小写) H L P U y o */uchar LED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};/*数码管显示缓冲区,0xff确保初始时都不亮.不可写成uchar code LED_Buff[]。code定义变量写入room,不可修改*/// 矩阵按键编号到标准盘码的映射表 uchar code KeyCodeMap[4][4] = { ( 0x31, 0x32, 0x33, 0x26 ), // 数字键 1、数字键 2、数字键 3、向上键( 0x34, 0x35, 0x36, 0x25 ), // 数字键 4、数字键 5、数字键 6、向左键 ( 0x37, 0x38, 0x39, 0x28 ), // 数字键 7、数字键 8、数字键 9、向下键 ( 0x30, 0x1B, 0x0D, 0x27 )}; // 数字键 0、ESC 键 、回车键 、向右键uchar StaFlag[KeyLine][KeyColumn] ={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键是否稳定标志 void StartTime0();void TubeDisplay(ulint sec);ulint pow(x,y);void TubeScan();void KeyAction(uchar keycode);void KeyDriver();void KeyScan();void main (){P1 = 0x08;//使能U3,选择数码管。StartTime0();while(1)KeyDriver();}//定时器0启动函数void StartTime0(){EA = 1;ET0 = 1;TMOD = 0x01;TH0 = (65536 - Time * 100) / 256;TL0 = (65536 - Time * 100) % 256;PT0 = 1;/*定时器0优先中断控制位。IP 这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复值都是0,当我们把某一位设置为1的时候,这一位优先级就比其它位的优先级高了。比如我们设置了 PT0位为1后, 当单片机在主循环或其他中断程序执行时,一旦TO发生中断,作为更高优先级,程序马上执行T0.若在T0程序执行时,其他中断程序发生中断,仍执行TO直到T0中断结束后再执行其他程序。 */ }//中断服务函数 void To_time0()interrupt 1 using 0{static uchar cnt;//记录TO中断次数//static ulint sec;//记录经过秒速//判断是否溢出 if (TF0 == 1){TF0 = 0;TH0 = (65536 - Time * 100) / 256;TL0 = (65536 - Time * 100) % 256;}if (cnt >= Frequency){cnt = 0;//sec++;//Tube_Display(sec);TubeScan();KeyScan();}}//数码管显示函数void TubeDisplay(ulint nom){uchar m = 2;//小数部分位数uchar i;//传输索引//秒速达到上限清零if (nom > pow(10,TubeNumber - m))nom = 0;//分别传输小数部分和整数部分 for(i=0; i= TubeNumber)i=0;//索引递增循环,遍历整个缓冲区} //矩阵按键动作函数void KeyAction(uchar keycode){static ulint result;ulint nom = 0;//输入数字0~9 if ((keycode >= 0x30) && (keycode = 0x25) && (keycode > (4 + l)) & 0x01));//按键消抖 for(l=0; l <KeyLine; l++){if((keybuff [l][c] & 0x0f) == 0x00)//连续4次扫描都为0,判断4*4ms内都是按下状态,可认为按键已稳定按下StaFlag[l][c] = 0;else if ((keybuff [l][c] & 0x0f) == 0x0f)//连续4次扫描都为1,判断4*4ms内都是弹起状态,可认为按键已稳定弹起 StaFlag[l][c] = 1;}for(c=0; c <KeyColumn; c++){switch (c) // 根据索引,释放当前输出脚 拉低下次的根据索引{ case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; }}}

一看问题就知道你什么都不懂,4位的数码管能显示HELLO这5个字母?!

1.数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。

code:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit key1 = P3^4;
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint num;
uchar bai, shi, ge, flag = 0,t0 = 0;

void delay(uchar z);
void display(void);

void main(void)
{
num = 0;
P3 = 0xff;
TMOD = 0x01;
TH0 = (65536-10000) / 256;
TL0 = (65536-10000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;

while(1) {
if(key1 == 0) {
delay(5);
if(key1 == 0) {
flag = 1;
}
while(!key1);
delay(5);
while(!key1);
}

display();
}
}

void display(void)
{
dula = 1;
P0 = table[num / 100];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delay(1);

dula = 1;
P0 = table[num % 100 / 10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delay(1);

dula = 1;
P0 = table[num % 10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfb;
wela = 0;
delay(1);
}
void delay(uchar z)
{
uchar

#include<reg51.h>
#define uchar unsigned char
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbit key=P2^2;
sbit fmq=P2^3;
uchar dat;
void delay()//延时约10毫秒
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<120;j++);
}
main()
{
while(1)
    {
    if(key==0)
        {
        delay();
        if(key==0)
            {
            fmq=0;
            while(key==0);
            fmq=1;
            dat++;
            dat%=10;
            P1=table[dat];
            }
        }
    }
}


#include <REGX51.H> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit buzzer=P2^0; uchar temp[4]={4,0,2,0}; uchar n=1; void delay250uS(void)//延时250us { unsigned char a,b; for(b=19;b>0;b--) for(a=5;a>0;a--); } void main(void) { uchar i=0,n0=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; EA=1; TR0=1; while(1) { n0=n; if(n0!=0) { if(++i==temp[n])i=1; if((i==1)|(i==temp[n]/2))buzzer=~buzzer; delay250uS(); } } } void Timer0Interrupt(void) interrupt 1 { static uchar temp1=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(++temp1==10) { if(++n==4)n=0; } }

卫蘅与陆湛相恋,卫蘅却阴错阳差嫁给了自己有断袖之癖的表哥。三年后陆湛谋划让卫蘅和离,娶了卫蘅。婚后却对卫蘅冷若冰霜,更出言辱骂,本文从和气堂陆湛骂走卫蘅开始。卫蘅与陆湛相恋,卫蘅却阴错阳差嫁给了自己有断袖之癖的表哥。三年后陆湛谋划让卫蘅和离,娶了卫蘅。婚后却对卫蘅冷若冰霜,更出言辱骂,本文从和气堂陆湛骂走卫蘅开始。卫蘅与陆湛相恋,卫蘅却阴错阳差嫁给了自己有断袖之癖的表哥。三年后陆湛谋划让卫蘅和离,娶了卫蘅。婚后却对卫蘅冷若冰霜,更出言辱骂,本文从和气堂陆湛骂走卫蘅开始。卫蘅与陆湛相恋,卫蘅却阴错阳差嫁给了自己有断袖之癖的表哥。三年后陆湛谋划让卫蘅和离,娶了卫蘅。婚后却对卫蘅冷若冰霜,更出言辱骂,本文从和气堂陆湛骂走卫蘅开始。

🤔🤔🤔🤔🤔🤔