欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32單片機四位串行,74HC595驅動兩種不同方式數碼管顯示程序
[打印本頁]
作者:
winsssss
時間:
2023-7-14 22:09
標題:
STM32單片機四位串行,74HC595驅動兩種不同方式數碼管顯示程序
制作出來的實物圖如下:
51hei圖片_20230714220400.jpg
(2.45 MB, 下載次數: 38)
下載附件
2023-7-14 22:08 上傳
單片機源程序如下:
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "smg.h"
uint8_t RecBuff[5] = {0, 0, 0, 0, 0};//定義5個數據組個綬沖讀取串口數據,所有數組數據初始化為0
int a=9;
int b=6;
int main(void)
{
OLED_Init();
uart_init(115200);
SMG_Init();
RecBuff[0]=a;
RecBuff[1]=b;
while(1)
{
// SMG_Display(1341);
LED8_Display(3,1);
LED8_Display(2,2);
LED8_Display(1,RecBuff[1]);
LED8_Display(0,RecBuff[0]);
// LED8_Display(3,18);
// LED8_Display(2,18);
// LED8_Display(1,18);
// LED8_Display(0,18);
//delay_ms(1000);
}
}
#include "smg.h"
#include "delay.h"
u8 SMG_Code[] =
{
// 0 1 2 3 4 5 6 7 8 9 A b C d E F - Bleak White Spot
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xBF, 0xFF, 0x00, 0x7F
};//段碼
void SMG_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;//定義結構體變量
RCC_APB2PeriphClockCmd(SMG_PORT_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = SMG_PIN; //要設置的IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //普通輸出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; //50MHz
GPIO_Init(SMG_PORT, &GPIO_InitStructure); /* 初始化GPIO */
GPIO_ResetBits(SMG_PORT, SMG_PIN); //將數碼管端口拉高
}
u8 LED_table[19]={
//共陽數碼管段碼“0123456789AbCdEF熄滅-”
// 0 1 2 3 4 5 6 7 8 9 10(A) 11(B) 12(C) 13(D) 14(E) 15(F) 16(熄滅)17(-) 18(.)
0xC0, 0xF9, 0xA4, 0xB0 ,0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF, 0xBF, 0x7F };
// 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
// 0x40, 0x79, 0x24, 0x30 ,0x19, 0x12, 0x02, 0x78, 0x00, 0x10;
u8 wei_table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//第一位至第八位位碼
/****************************************************************/
//數碼動態顯示函數LED8_Display(),有形參x和y,無返回值
//x表示位選擇,y表示欲顯示的數碼
/****************************************************************/
void LED8_Display(u8 x,u8 y)
{
LED_OUT(LED_table[y]);//送出段碼
LED_OUT(wei_table[x]);//送出位碼
SMG_RCLK=0;
SMG_RCLK=1;//RCLK產生上升沿A4
delay_ms(2);
}
/****************************************************************/
//單字節數據串行移位函數LED_OUT(),有形參outdata用于傳入實際數據
//無返回值
/****************************************************************/
void LED_OUT(u8 outdata)
{
u8 i;
for(i=0;i<8;i++)//循環8次
{
if (outdata & 0x80)//逐一取出最高位 1000 0000 b
SMG_DIO=1;//送出“1”
else
SMG_DIO=0;//送出“0”
outdata<<=1;//執行左移一位操作
SMG_SCLK=0;
SMG_SCLK=1;//SCLK產生上升沿
}
}
void SMG_Output(u8 data)
{
u8 i;
for (i = 0; i < 8; i++)
{
if (data & 0x80)//按位與,先發送高位
{
SMG_DIO = 1;
}
else
{
SMG_DIO = 0;
}
data <<= 1;
SMG_SCLK = 0;
SMG_SCLK = 1; //產生一個上升沿
}
}
void SMG_Display(int num)
{
u8 digit[DIGIT_NUM], i, j;
//將傳入的數字轉換為數組的元素
for (i = 1; i <= DIGIT_NUM; i++)
{
digit[DIGIT_NUM - i] = num % 10;
num /= 10;
}
for (j = i = 1; i <= DIGIT_NUM; i++, j *= 2)
{
SMG_Output(SMG_Code[digit[DIGIT_NUM - i]]); //發送顯示數據
SMG_Output(j); //發送顯示位數
SMG_RCLK = 0;
SMG_RCLK = 1; //產生一個上升沿
delay_ms(2); //保持一定時間,否則數碼管亮度較低
}
}
//int main()
//{
// int Clock_MHz;
// float prev_roll;
// /*定義一個RCC_ClocksTypeDef類型的結構體*/
// RCC_ClocksTypeDef RCC_Clock;
// /*調用RCC_GetClocksFreq獲取系統時鐘狀態*/
// RCC_GetClocksFreq(&RCC_Clock);
// Clock_MHz = RCC_Clock.SYSCLK_Frequency / 1000 / 1000;
//
// uart1_init(460800);
// delay_init(Clock_MHz);
//
// SMG_Init();
// while (1)
// {
// SMG_Display(2021);
// }
//}
復制代碼
Keil代碼下載:
程序.7z
(197.46 KB, 下載次數: 37)
2023-7-15 19:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
主舊
時間:
2023-12-26 16:24
我按照你第一種方法寫的,但是位選沒有起作用,4個數碼管全都亮
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1