51单片机按键计数数码管显示

文章目录

概要

51单片机只用一个数码管,开始显示值为0,按一次显示值加一次,用十六进制0~F循环计数。

按键使用外部中断工作方式,数码管为共阴极数码管公共端接地(共阳极数码管公共端接电源,然后取反输出Nixie =~ NixieTable[i];)

代码

#include <REGX52.H>
#include <intrins.h>
#define u8 unsigned char  //定义字符类型
#define u16 unsigned int
#define Nixie  P2   //定义IO口P2	
u8 i= 0;
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void Delay(u16 xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
void init()//初始化,即打开各中断开关
{
     IT0=1;//外部中断0为跳变沿触发方式
     EA=1;//开总中断
     EX0=1;//打开外部中断0
}
void main()
{
	init();	  //初始化
	while(1)
	{
		Nixie = NixieTable[i];
	}
}
void int0() interrupt 0  //外部中断0的执行程序。
{ 				  			
	i = i+1;
	i &=0x0f;
	Delay(50);//延时
}

仿真

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
实现51单片机按键计数并在LCD1602显示,可以按照以下步骤进行: 1. 确定按键接口和LCD1602接口的引脚连接方式。 2. 初始化LCD1602,设置数据口和控制口,开启显示和设置光标位置。 3. 初始化按键引脚,设置为输入模式。 4. 在主循环中,不断检测按键引脚的状态,如果为按下状态,则计数器加1,并在LCD1602上显示计数器的值。 以下是示例代码: ```c #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS = P3^5; // LCD1602控制口 sbit RW = P3^6; sbit E = P3^4; sbit K1 = P1^0; // 按键引脚 sbit K2 = P1^1; sbit K3 = P1^2; sbit K4 = P1^3; uchar code table[]="Count:"; // 显示字符串 uchar count = 0; // 计数器 void delay(uint xms) // 延时函数 { uint i, j; for (i = xms; i > 0; i--) { for (j = 110; j > 0; j--); } } void LCD_write_com(uchar com) // 写命令 { RS = 0; RW = 0; E = 1; P0 = com; _nop_(); E = 0; } void LCD_write_data(uchar dat) // 写数据 { RS = 1; RW = 0; E = 1; P0 = dat; _nop_(); E = 0; } void LCD_init() // LCD1602初始化 { LCD_write_com(0x38); // 8位数据,2行,5x7字符点阵 LCD_write_com(0x0c); // 显示开,光标不显示 LCD_write_com(0x06); // 光标右移,字符不移动 LCD_write_com(0x01); // 显示清屏 LCD_write_com(0x80); // 光标起始位置 } void display_count() // 显示计数器 { uchar i; LCD_write_com(0x80+0x06); // 光标移动到第2行第7个字符位置 for (i = 0; i < 6; i++) { LCD_write_data(table[i]); // 先显示"Count:" } LCD_write_data(count+'0'); // 显示计数器的值 } void main() { LCD_init(); // 初始化LCD1602 while (1) { if (K1 == 0) { // 检测按键是否按下 delay(5); // 延时去抖 if (K1 == 0) { count++; // 计数器加1 display_count(); // 显示计数器 while (!K1); // 等待按键释放 } } if (K2 == 0) { // 检测按键是否按下 delay(5); // 延时去抖 if (K2 == 0) { count = 0; // 计数器清零 display_count(); // 显示计数器 while (!K2); // 等待按键释放 } } } } ``` 在上述代码中,通过P1口连接4个按键,分别用于增加计数器、清零计数器、暂停计数、继续计数。每当按下增加计数按键时,计数器加1,并将计数器的值显示在LCD1602上;当按下清零计数按键时,计数器清零,并将计数器的值显示在LCD1602上。同时,为了避免按键的抖动现象,需要引入一定的延时去抖机制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学渣_小强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值