用模塊廠家資料+豆包+自己修改生成的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();
}
}
|