久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 733|回復: 6
打印 上一主題 下一主題
收起左側(cè)

51單片機+2片HC595四位LED數(shù)碼管計數(shù)器C代碼

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:33548 發(fā)表于 2025-3-13 22:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用模塊廠家資料+豆包+自己修改生成的51單片機+2片HC595四位LED數(shù)碼管計數(shù)器C代碼,可實現(xiàn)點動增加或減小1,長按連續(xù)加1或連續(xù)減1。實際調(diào)試OK,在此分享給大家。


/*51單片機+2片HC595四位LED數(shù)碼管計數(shù)器C代碼*/
//11.0592MHz
//可實現(xiàn)點動增加或減小1,長按連續(xù)加1或連續(xù)減1.

#include <REG51.H>
#include <intrins.h>  // 引入_nop_()函數(shù)頭文件
#define uchar unsigned char
#define uint unsigned int

unsigned char code LED_0F[] =
{// 0     1     2     3    4     5     6     7    8     9     A     b    C    d     E    F    -
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};

uint count;
static unsigned char key_delay = 0;
sbit DIO = P1^0;              //串行數(shù)據(jù)輸入
sbit RCLK  = P1^1;            //時鐘脈沖信號——上升沿有效
sbit SCLK = P1^2;             //打入信號————上升沿有效
sbit UP_KEY=P2^0;             //增加按鍵
sbit DOWN_KEY=P2^1;           //減小按鍵
sbit CLE_KEY=P2^2;            //清零按鍵

uchar LED[8];     //用于LED的8位顯示緩存
uchar display_index = 0;  // 當前顯示的數(shù)位索引

// 調(diào)試用 LED 引腳定義
sbit DEBUG_LED = P3^7;
sbit KEY_DEBUG_LED = P3^6;

// 將計數(shù)值拆分成每一位并更新到LED數(shù)組中
void update_LED()
{
    LED[0] = count % 10;  // 個位
    LED[1] = (count % 100) / 10;  // 十位
    LED[2] = (count % 1000) / 100;  // 百位
    LED[3] = count / 1000;  // 千位
}

void LED_OUT(uchar X)   // LED單字節(jié)串行移位函數(shù)
{
    uchar i;
    for(i = 8; i >= 1; i--)
    {
        if (X & 0x80)
            DIO = 1;
        else
            DIO = 0;
        X <<= 1;
        SCLK = 0;
        SCLK = 1;
    }
}

// 延時函數(shù),單位為毫秒
void delay_ms(uint ms)
{
    uint i, j;
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 123; j++)
        {
            _nop_();
        }
    }
}

void key()
{
    static bit up_key_pressed = 0;  // 增加按鍵按下標志
    static bit down_key_pressed = 0;  // 減小按鍵按下標志
    static uint up_key_delay_count = 0;  // 增加按鍵延時計數(shù)
    static uint down_key_delay_count = 0;  // 減小按鍵延時計數(shù)

    /* 加鍵處理 */
    if(UP_KEY == 0)
    {
        delay_ms(20);  // 消抖延時
        if(UP_KEY == 0)
        {
            if(!up_key_pressed)  // 按鍵首次按下
            {
                count++;
                if(count > 9999)
                    count = 9999;
                up_key_pressed = 1;  // 設置按鍵按下標志
                up_key_delay_count = 0;  // 重置延時計數(shù)
            }
            else  // 按鍵已按下
            {
                up_key_delay_count++;
                if(up_key_delay_count >= 5)  // 延時5次,可根據(jù)需要調(diào)整
                {
                    count++;
                    if(count > 9999)
                        count = 9999;
                    up_key_delay_count = 0;  // 重置延時計數(shù)
                }
            }
        }
    }
    else
    {
        up_key_pressed = 0;  // 按鍵松開,清除標志
    }

    /* 減鍵處理 */
    if(DOWN_KEY == 0)
    {
        delay_ms(20);  // 消抖延時
        if(DOWN_KEY == 0)
        {
            if(!down_key_pressed)  // 按鍵首次按下
            {
                if (count > 0) {
                    count--;
                }
                down_key_pressed = 1;  // 設置按鍵按下標志
                down_key_delay_count = 0;  // 重置延時計數(shù)
            }
            else  // 按鍵已按下
            {
                down_key_delay_count++;
                if(down_key_delay_count >= 5)  // 延時5次,可根據(jù)需要調(diào)整
                {
                    if (count > 0) {
                        count--;
                    }
                    down_key_delay_count = 0;  // 重置延時計數(shù)
                }
            }
        }
    }
    else
    {
        down_key_pressed = 0;  // 按鍵松開,清除標志
    }

    /* 清除鍵處理 */
    if(CLE_KEY == 0)
    {
        delay_ms(20);  // 消抖延時
        if(CLE_KEY == 0)
        {
            count = 0;  // 清零計數(shù)
            update_LED(); // 及時更新顯示緩存
        }
    }
}

// 定時器0初始化函數(shù)
void Timer0_Init() {
    TMOD |= 0x01;  // 設置定時器0為模式1(16位定時器)
    TH0 = (65536 - 2000) / 256;  // 定時2ms
    TL0 = (65536 - 2000) % 256;
    ET0 = 1;  // 使能定時器0中斷
    EA = 1;   // 使能總中斷
    TR0 = 1;  // 啟動定時器0
}

// 定時器0中斷服務函數(shù)
void Timer0_ISR() interrupt 1
{
    // 先聲明變量
    unsigned char code *led_table;
    uchar i;

    // 重新加載初值
    TH0 = (65536 - 2000) / 256;
    TL0 = (65536 - 2000) % 256;

    // 顯示當前數(shù)位
    led_table = LED_0F + LED[display_index];
    i = *led_table;

    LED_OUT(i);
    switch (display_index)
    {
        case 0: LED_OUT(0x01); break;
        case 1: LED_OUT(0x02); break;
        case 2: LED_OUT(0x04); break;
        case 3: LED_OUT(0x08); break;
    }

    RCLK = 0;
    RCLK = 1;

    // 更新顯示索引
    display_index = (display_index + 1) % 4;
}

// 主函數(shù)
void main()
{
    count = 0;
    update_LED();
    Timer0_Init();

    while (1)
    {
        key();
        update_LED();
    }
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:126580 發(fā)表于 2025-3-19 19:00 | 只看該作者
可以講講怎么和豆包聯(lián)系起來實現(xiàn)的過程嗎?
回復

使用道具 舉報

板凳
ID:105698 發(fā)表于 2025-3-20 08:24 | 只看該作者
同上,我也想知道。
回復

使用道具 舉報

地板
ID:33548 發(fā)表于 2025-3-22 20:03 | 只看該作者
dtdzlujian 發(fā)表于 2025-3-19 19:00
可以講講怎么和豆包聯(lián)系起來實現(xiàn)的過程嗎?

把要求、硬件配置詳細告訴豆包,豆包會自動生成C代碼,哪些編譯出錯、改進、添加功能、改錯、代碼修改都可以完成
回復

使用道具 舉報

5#
ID:759144 發(fā)表于 2025-3-22 21:10 | 只看該作者
單片機學習中,向無私分享的大神們致敬!
回復

使用道具 舉報

6#
ID:383215 發(fā)表于 2025-3-24 17:24 | 只看該作者
感謝樓主的無私奉獻!但是,個人認為,驅(qū)動四位數(shù)碼管的最佳方案是TM1650,對比兩片HC595驅(qū)動四位數(shù)碼管有以下優(yōu)點:
1、成本更低,買兩片價格最低的HC595至少可以買TM1650兩片以上。
2、電路簡單,兩片HC595驅(qū)動四位數(shù)碼管,HC595的引腳和數(shù)碼管管腳可以任意連接,讓電路更簡單,用軟件確定四個公共端和小數(shù)點在內(nèi)的八個段碼的驅(qū)動,TM1650驅(qū)動公共端的四個管腳和驅(qū)動八個段碼的管腳也是可以任意連接,只是驅(qū)動公共端和段碼的管腳不能搞錯,電路還是比兩片HC595驅(qū)動四位數(shù)碼管更簡單。
3、占用單片機I/O口更少,樓主用兩片HC595驅(qū)動四位數(shù)碼管+三個按鍵,一共用了六個I/O口,用TM1650驅(qū)動四位數(shù)碼管+多個按鍵,僅需兩個I/O口,TM1650驅(qū)動四位數(shù)碼管的同時還可以連接4×7=28個按鍵掃描。
4、占用單片機運行時間更少,TM1650IIC的速度沒有HC595SPI快,但是,TM1650靠內(nèi)部硬件掃描顯示數(shù)碼管,如果只在數(shù)字變動的時候發(fā)一次數(shù)據(jù)給TM1650,單片機的運行效率遠遠高于HC595。
5、TM1650用3.3V和5V驅(qū)動四位數(shù)碼管,亮度幾乎一致,并且有8極亮度可以通過軟件設定。
對于用豆包生成的單片機代碼有質(zhì)疑,假若HC595的引腳和數(shù)碼管的管腳任意連接,TM1650驅(qū)動公共端的四個管腳和驅(qū)動八個段碼的管腳任意連接,豆包生成的單片機代碼可以用嗎?
回復

使用道具 舉報

7#
ID:33548 發(fā)表于 2025-3-25 12:45 | 只看該作者
kmsj 發(fā)表于 2025-3-24 17:24
感謝樓主的無私奉獻!但是,個人認為,驅(qū)動四位數(shù)碼管的最佳方案是TM1650,對比兩片HC595驅(qū)動四位數(shù)碼管有 ...

現(xiàn)在論壇上有我貼上的TM1650驅(qū)動三位和四位LED的代碼,都是調(diào)試成功的。
豆包生成的代碼你只要說的詳細,程序小時生成的代碼基本沒錯,但大了就多少有問題,你可以修改,也可以讓豆包改。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩伦理一区二区 | 国产精品自产拍 | 日韩欧美在线观看 | 在线播放亚洲 | 欧美天堂在线 | 欧美视频在线免费 | 鸳鸯谱在线观看高清 | 狠狠亚洲 | 成人免费在线播放 | 日韩伦理电影免费在线观看 | 欧美老妇交乱视频 | 久久精品亚洲精品国产欧美 | 日韩一区二区三区在线 | 日本欧美在线视频 | 一级片av| 免费看av大片| 欧美黄色网| 国产精品久久久久久久久久 | 亚洲天堂中文字幕 | 亚洲伊人久久综合 | 日韩爱爱网| 免费看国产a | 国产精品美女www爽爽爽 | av黄色在线 | 日韩欧美中文 | 四虎影院欧美 | 中文字幕日韩专区 | 色99视频| 成人高清网站 | 国产欧美一区二区三区在线播放 | 欧美a级成人淫片免费看 | 黄色大片视频 | 这里有精品 | 国产999精品久久久影片官网 | 亚洲v日韩v综合v精品v | 国产视频不卡一区 | 中文字幕在线播放第一页 | 国产二区在线播放 | 精品二区 | 伊人电影院av | 免费久久99精品国产婷婷六月 |