制作出来的实物图如下:
单片机源程序如下:
#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)
|