 |
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(); } }
|