按键自加自减的c语言数码管编程,设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码管初始值为0,9加1 后显示0)。...

这篇博客介绍了如何使用C语言编程设计一个单片机系统,该系统通过按键控制数码管显示数值动态加1。程序中包含按键检测、数码管显示函数以及8051单片机的相关功能介绍。通过延时函数实现数码管的动态显示,确保数字不重叠。
摘要由CSDN通过智能技术生成

程序清单如下:

#include < reg51.h >// 51单片机头文件

#define uchar unsigned char// 宏定义,用uchar替代无符号字符型

#define uint  unsigned int// 宏定义,用uint 替代无符号整数型

sbit Key = P2 ^ 7;

uchar Count = 0;

uchar code DataChar[10] = // 定义数码管的段码 '0'~'9'、'-'、' ' 'P'

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

};//延时N毫秒

void DelayNms( uint N )// 利用x、y作简单的自减运算,消耗单片机指令周期,达到延时的目的

{

uint x,y;

for( x=N; x>0; x-- )

for( y=110; y>0; y-- );

}

//数码管显示  // 显示方式为动态扫描,视觉暂留原理

void Display( uchar Num )// *p指向Main函数中的数组ShowNum的首地址

{

P0 = DataChar[ Num ];// 向P0赋段码值

DelayNms(2);// 短暂的延时

P0 = 0x00;// 让数码管熄灭,否则会造成数字重叠

}

void main( void )

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C语言程序,使用了51单片机的定时器和外部中断来实现独立按键长按减的功能,同时通过数码管显示当前的计数值: ```C #include <reg52.h> #define DIGIT_PORT P0 // 数码管段选控制端口 #define KEY_PORT P1 // 按键输入端口 #define KEY_ADD 0x01 // 输入端口 #define KEY_SUB 0x02 // 减键输入端口 unsigned char digit_tbl[10] = { // 数码管显示表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 }; unsigned int count = 0; // 计数器变量 unsigned char cnt_h, cnt_l; // 计数器高低位 void delay_ms(unsigned int t) { // 延时函数 unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void display(unsigned char d1, unsigned char d2, unsigned char d3, unsigned char d4) { // 数码管显示函数 DIGIT_PORT = digit_tbl[d1]; P2 = 0x01; delay_ms(1); DIGIT_PORT = digit_tbl[d2]; P2 = 0x02; delay_ms(1); DIGIT_PORT = digit_tbl[d3]; P2 = 0x04; delay_ms(1); DIGIT_PORT = digit_tbl[d4]; P2 = 0x08; delay_ms(1); } void timer0_isr() interrupt 1 { // 定时器中断服务程序 TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; count++; // 计数器1 cnt_h = count/100; // 计算高位数值 cnt_l = count%100; // 计算低位数值 } void ext0_isr() interrupt 0 { // 外部中断0服务程序 unsigned char key = KEY_PORT & 0x03; // 读取按键状态 if (key == KEY_ADD) { // 键按下 count++; // 计数器1 cnt_h = count/100; // 计算高位数值 cnt_l = count%100; // 计算低位数值 } else if (key == KEY_SUB) { // 减键按下 if (count > 0) // 计数器减1,但不能小于0 count--; cnt_h = count/100; // 计算高位数值 cnt_l = count%100; // 计算低位数值 } else { // 长按键退出 while ((KEY_PORT & 0x03) == 0x00); // 等待按键释放 } } void main() { TMOD = 0x01; // 定时器0工作在模式1 TH0 = (65536-50000)/256; // 定时器初值,50ms中断一次 TL0 = (65536-50000)%256; ET0 = 1; // 允许定时器0中断 EA = 1; // 全局中断允许 TR0 = 1; // 启动定时器0 EX0 = 1; // 外部中断0允许 IT0 = 1; // 外部中断0下降沿触发 while (1) { display(cnt_h/10, cnt_h%10, cnt_l/10, cnt_l%10); // 显示数值 } } ``` 在程序中,使用一个计数器变量`count`来保存当前的计数值,通过外部中断0和定时器0的中断服务程序来实现独立按键长按减的功能。当键按下时,计数器1,当减键按下时,计数器减1,但不能小于0。同时,通过数码管显示函数`display()`将计数值显示在四位数码管上,以便用户观察。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值