用51单片机矩阵键盘控制数码管显示数字

用51单片机矩阵键盘控制数码管显示数字

#include<reg51.h>//头文件
#define keys P1//宏定义矩阵键盘
#define smg P0//宏定义数码管
sbit SMGA=P2^2;//位定义
sbit SMGB=P2^3;
sbit SMGC=P2^4;
unsigned int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f
                     ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管字形码
unsigned int k;
void delay()//延时函数
{
    unsigned char a,b;
	for(a=0;a<200;a++)
	for(b=0;b<200;b++);
}
void jzjp()//矩阵键盘函数
{
	unsigned int i=0;
	//unsigned int k; 本人遇到的错误,在该函数下定义的k,导致主函数中用k时出现错误,应在整体下定义
	keys=0x0f;//行列扫描,高四位输出低电平,低四位输出高电平
	if(keys!=0x0f)//如果keys不等于该值则说明有按键按下
	{
		delay();//按键消抖
		if(keys!=0x0f)//确实按下按键,第四位不全为1
		{
			switch(keys)//列判断
			{
				case(0x07):k=0;break;//对应列按键按下时矩阵键盘对应的数,并存储于k
				case(0x0b):k=1;break;
				case(0x0d):k=2;break;
				case(0x0e):k=3;break;
			}
			keys=0xf0;
			switch(keys)//行判断
			{
				case(0x70):k=k;break;//对应行按键按下时矩阵键盘对应的数,并存储于k
				case(0xb0):k=k+4;break;
				case(0xd0):k=k+8;break;
				case(0xe0):k=k+12;break;
			}
				//扫描过程,如果case(0x07)时第一列按键按下,k=0,break跳出switch,
				//行判断,case(0x70)时第一行按键按下,k=k,跳出switch
				// 如果case(0x0b)时第二列按键按下,k=1,break跳出switch,
				//行判断,case(0xb0)时第二行按键按下,k=k+4(第一个按键向后数4个)跳出switch。。
             while((i<50)&&(keys!=0xf0))//按键总是按着不松开超过一定时间时强制退出,从新扫描显示你所按着不动的按键
			 {
			  	delay();
				i++;	
			 }
		}

	}
				
}
void main()//主函数
{
	while(1)
	{
	SMGA=0;//Y0非输出端对应的数码管显示
	SMGB=0;
	SMGC=0;
	jzjp();
	smg=table[k];//数码管显示
	}
}

注:

  1. 该开发板矩阵键盘接于P1口
  2. 该程序时用矩阵键盘控制的最后一个动态数码管,3-8译码器的输入端接于P2口的2,3,4端,P0口接数码管驱动端。
  • 26
    点赞
  • 218
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
C51程序编程可以实现单片机数码管显示和按键设计。以下是一个示例程序,实现了一个简单的计数器,通过按键控制加减和清零操作,同时在数码管上显示计数器的值。 ``` #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit key_add = P0^0; //加键 sbit key_sub = P0^1; //减键 sbit key_clr = P0^2; //清零键 sbit LED1 = P2^0; //数码管第一位 sbit LED2 = P2^1; //数码管第二位 sbit LED3 = P2^2; //数码管第三位 sbit LED4 = P2^3; //数码管第四位 uchar code table[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //数码管码表 uint num = 0; //计数器值 void delayms(uint x) //延时函数 { uint i,j; for (i=x; i>0; i--) for (j=110; j>0; j--); } void display() //数码管显示函数 { LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; //先全部清零 if (num >= 1000) {LED1 = 1; P0 = table[num/1000]; delayms(2);} //千位 if (num >= 100) {LED2 = 1; P0 = table[num%1000/100]; delayms(2);} //百位 if (num >= 10) {LED3 = 1; P0 = table[num%100/10]; delayms(2);} //十位 LED4 = 1; P0 = table[num%10]; delayms(2); //个位 } void main() { while (1) { if (key_add == 0) {delayms(10); if (key_add == 0) num++; while (!key_add);} if (key_sub == 0) {delayms(10); if (key_sub == 0) num--; while (!key_sub);} if (key_clr == 0) {delayms(10); if (key_clr == 0) num = 0; while (!key_clr);} display(); } } ``` 在这个程序中,我们定义了三个按键和四个数码管控制引脚。数码管显示使用了一个码表,将数字转换为对应数码管控制码。在主函数中,通过不断循环检测按键状态和更新计数器值,然后调用数码管显示函数实现显示。需要注意的是,由于数码管具有一定的刷新速度,所以需要添加适当的延时以保证显示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值