设置 | 登录 | 注册

目前共有10篇帖子。

【程序】STM32F103C8T6最小系統板連接8位74HC595驅動的數碼管模塊並顯示數字

1楼 巨大八爪鱼 2016-11-21 22:50
2楼 巨大八爪鱼 2016-11-21 22:55
【接線】
PC13口接數碼管模塊的DIO端(數據端),圖中為紅線。該I/O口與板上自帶的綠色S1 LED燈相連。
PC14口接數碼管模塊的RCLK端(輸出控制端),圖中為橙線。
PC15口接數碼管模塊的SCLK端(數據輸入移位控制端),圖中為黃線。
深綠線為電源正極,電壓為3.3V。
褐線為電源負極。
3楼 巨大八爪鱼 2016-11-21 22:56
【程序】
#include <stm32f10x.h>

#define _BV(n) (1 << (n))

uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

void delay(void)
{
    uint32_t i;
    for (i = 0; i < 20000; i++);
}

void SerIn(uint8_t data)
{
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        GPIOC->BRR = _BV(15);
        if (data & 0x80)
            GPIOC->BSRR = _BV(13);
        else
            GPIOC->BRR = _BV(13);
        GPIOC->BSRR = _BV(15);
        data <<= 1;
    }
}

void ParOut(void)
{
    GPIOC->BRR = _BV(14);
    GPIOC->BSRR = _BV(14);
}

int main(void)
{
    uint8_t i = 0;
   
    // CNF=00: push-pull, MODE=11: 50MHz
    RCC->APB2ENR |= 0x10; // 開啟PC時鐘
    GPIOC->CRH = 0x33300000; // PC13~15設為輸出
   
    while (1)
    {
        SerIn(seg8[i + 1]); // 要顯示的數字
        SerIn(_BV(7 - i)); // 位選, _BV(0)為最右邊
        ParOut();
       
        delay();
        i++;
        if (i > 7)
            i = 0;
    }
}
4楼 巨大八爪鱼 2016-11-21 22:57
5楼 巨大八爪鱼 2016-11-21 22:59
6楼 巨大八爪鱼 2016-11-21 23:00
用JLink下載時,注意一定要選擇Erase Full Chip(擦除整個晶片),並且要勾上Reset and Run(否則燒寫後需要按復位鍵程序才能運行)。
7楼 巨大八爪鱼 2016-11-21 23:01

Debug裡面要選擇J-LINK選項。
8楼 巨大八爪鱼 2016-11-21 23:03
9楼 巨大八爪鱼 2016-11-22 22:42
【0000~9999循環計數】
#include <stm32f10x.h>

#define _BV(n) (1 << (n))

uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

uint16_t num = 1970;

void delay(void)
{
    uint32_t i;
    for (i = 0; i < 20000; i++);
}

void SerIn(uint8_t data)
{
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        GPIOC->BRR = _BV(15);
        if (data & 0x80)
            GPIOC->BSRR = _BV(13);
        else
            GPIOC->BRR = _BV(13);
        GPIOC->BSRR = _BV(15);
        data <<= 1;
    }
}

void ParOut(void)
{
    GPIOC->BRR = _BV(14);
    GPIOC->BSRR = _BV(14);
}

int main(void)
{
    uint8_t i = 0;
   
    // CNF=00: push-pull, MODE=11: 50MHz
    RCC->APB2ENR |= 0x10; // 開啟PC時鐘
    GPIOC->CRH = 0x33300000; // PC13~15設為輸出
   
    while (1)
    {
        SerIn(seg8[num % 10000 / 1000]);
        SerIn(_BV(3));
        ParOut();
        delay();
       
        SerIn(seg8[num % 1000 / 100]);
        SerIn(_BV(2));
        ParOut();
        delay();
       
        SerIn(seg8[num % 100 / 10]);
        SerIn(_BV(1));
        ParOut();
        delay();
       
        SerIn(seg8[num % 10]);
        SerIn(_BV(0));
        ParOut();
        delay();
       
        i++;
        if (i > 100)
        {
            i = 0;
            num++;
            if (num >= 10000)
                num = 0;
        }
    }
}
10楼 巨大八爪鱼 2016-11-22 22:43
【矩陣鍵盤顯示數字,行PA0~3,列PA4~7】
#include <stm32f10x.h>

#define _BV(n) (1 << (n))

uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

uint8_t num = 0;

void delay(void)
{
    uint32_t i;
    for (i = 0; i < 20000; i++);
}

void SerIn(uint8_t data)
{
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        GPIOC->BRR = _BV(15);
        if (data & 0x80)
            GPIOC->BSRR = _BV(13);
        else
            GPIOC->BRR = _BV(13);
        GPIOC->BSRR = _BV(15);
        data <<= 1;
    }
}

void ParOut(void)
{
    GPIOC->BRR = _BV(14);
    GPIOC->BSRR = _BV(14);
}

void display(void)
{
    SerIn(seg8[num % 100 / 10]);
    SerIn(_BV(1));
    ParOut();
    delay();
       
    SerIn(seg8[num % 10]);
    SerIn(_BV(0));
    ParOut();
    delay();
}

void keyscan(void)
{
    uint8_t row, col, val;
    GPIOA->CRL = 0x22228888; // PA0~3設為帶上下拉輸入, PA4~7設為Push-Pull且速度為2MHz的輸出
    GPIOA->ODR = 0x0f; // PA0~3設為上拉輸入,並在PA4~7口輸出低電平
    if ((GPIOA->IDR & 0x0f) != 0x0f) // 檢查PA0~3是否有低電平輸入,如果有則說明有按鍵按下,且按鍵出現在有低電平輸入的那一行
    {
        display();
        if ((GPIOA->IDR & 0x0f) != 0x0f)
        {
            // 讀行數
            row = ~GPIOA->IDR & 0x0f;
            if (row == 4)
                val = 8;
            else if (row == 8)
                val = 12;
            else
                val = (row - 1) * 4;
           
            // 線反轉
            GPIOA->CRL = 0x88882222;
            GPIOA->ODR = 0xf0;
            display(); // ODR要等待一段時間才能成功改變輸出
           
            // 讀列數
            col = (~GPIOA->IDR >> 4) & 0x0f;
            if (col != 0)
            {
                if (col == 4)
                    val += 3;
                else if (col == 8)
                    val += 4;
                else if (col == 2)
                    val += 2;
                else
                    val++;
                num = val;
            }
           
            // 等待按鍵釋放
            while ((GPIOA->IDR & 0xf0) != 0xf0)
                display();
        }
    }
}

int main(void)
{
    // CNF=00: push-pull, MODE=11: 50MHz
    RCC->APB2ENR = 0x14; // 開啟PA、PC時鐘
    GPIOC->CRH = 0x33300000; // PC13~15設為輸出
   
    while (1)
    {
        display();
        keyscan();
    }
}

内容转换:

回复帖子
内容:
用户名: 您目前是匿名发表。
验证码:
看不清?换一张
©2010-2025 Purasbar Ver3.0 [手机版] [桌面版]
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。