| 
				打卡等级:以坛为家I打卡总天数:297最近打卡:2025-10-31 10:12:10   高级会员 
 
 
	积分673 
 | 
 
 发表于 2025-4-6 19:26:09
|
显示全部楼层 
| 这是我在网上买的模块,根据它提供的资料,结合AI生成的。
 用模块厂家资料+豆包+自己修改生成的STC89C51单片机+TM1652 5位LED二键增减计数器,实际调试OK,献给大家。
 //51单片机+TM1652二按键增减计数5位LED显示C代码//
 //普通显示,无中断,调试OK
 #include "REG51.h"
 unsigned char KEY_NUM = 0;
 typedef unsigned char u8;
 typedef unsigned int u16;
 u16 count = 0;    //按键计数值
 sbit up = P3^6;   //增加按键
 sbit down = P3^7;     //减少按键
 
 sbit D_out = P0^0;    //模拟UART数据输出端,连接TM1652数据输入端D_in
 const u8 CODE[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};  //共阴数码管0~F字型码
 
 void Delay52us()  //@11.0592MHz
 {
 unsigned char i;
 i = 21;
 while (--i);
 }
 
 void Delay5ms()  //@11.0592MHz
 {
 unsigned char i, j;
 i = 9;
 j = 244;
 do
 {
 while (--j);
 } while (--i);
 }
 
 void Delay104us()  //@11.0592MHz
 {
 unsigned char i;
 i = 45;
 while (--i);
 }
 
 void tm1652_send_data(u8 sdat)    //向TM1652发送数据
 {
 unsigned char i = 0, sfalg = 0;
 //起始位
 D_out = 0;
 Delay52us();    //保持52us
 
 //发送8位数据
 for (i = 0; i < 8; i++)
 {
 if (sdat & 0x01)
 {
 D_out = 1;
 sfalg++;
 }
 else
 {
 D_out = 0;
 }
 Delay52us();
 sdat >>= 1;
 }
 
 //校验位,按照发送数据中1的个数来判断
 if (sfalg % 2 == 0)
 {
 D_out = 1;
 }
 else
 {
 D_out = 0;
 }
 Delay52us();
 //停止位
 D_out = 1;
 Delay104us();
 }
 
 void TM_Digtal_Display(u16 num)
 {
 tm1652_send_data(0x08);
 // 确保能正确显示五位数
 tm1652_send_data(CODE[num / 10000]);
 tm1652_send_data(CODE[num % 10000 / 1000]);
 tm1652_send_data(CODE[num % 1000 / 100]);
 tm1652_send_data(CODE[num % 100 / 10]);
 tm1652_send_data(CODE[num % 10]);
 Delay5ms();
 tm1652_send_data(0x18);        //向TM1652发送显示控制命令
 tm1652_send_data(0xFE);      //设置位占空比为 15/16,设置段驱动电流为 8/8,最大亮度。
 }
 
 // 延时函数,用于按键消抖
 void delay(unsigned int time)
 {
 unsigned int i, j;
 for (i = 0; i < time; i++)
 for (j = 0; j < 123; j++);
 }
 
 //主函数
 void main()
 {
 u16 delaytick = 0;
 // 开机显示00000
 TM_Digtal_Display(0);
 while (1)
 {
 // 检测上按键是否按下
 if (up == 0) {
 delay(20);  // 消抖
 if (up == 0)
 {
 if (count < 99999) {
 count++;
 }
 while (up == 0) {
 delay(10); // 持续检测按键释放,避免重复触发
 }
 delay(20); // 释放后再次消抖
 }
 }
 
 // 检测下按键是否按下
 if (down == 0) {
 delay(20);  // 消抖
 if (down == 0) {
 if (count > 0) {
 count--;
 }
 while (down == 0)
 {
 delay(10); // 持续检测按键释放,避免重复触发
 }
 delay(20); // 释放后再次消抖
 }
 }
 
 if (++delaytick == 50) // 提高显示刷新频率
 {
 delaytick = 0;
 TM_Digtal_Display(count);
 }
 Delay5ms();
 }
 }
 
 | 
 
  |