给你个参考 display.c
#include "stm8s.h"
#include "display.h"
#define A(a) a ? (GPIOA->ODR |= GPIO_PIN_1):(GPIOA->ODR &= (~GPIO_PIN_1))
#define B(a) a ? (GPIOF->ODR |= GPIO_PIN_4):(GPIOF->ODR &= (~GPIO_PIN_4))
#define C(a) a ? (GPIOC->ODR |= GPIO_PIN_5):(GPIOC->ODR &= (~GPIO_PIN_5))
#define D(a) a ? (GPIOC->ODR |= GPIO_PIN_7):(GPIOC->ODR &= (~GPIO_PIN_7))
#define E(a) a ? (GPIOD->ODR |= GPIO_PIN_0):(GPIOD->ODR &= (~GPIO_PIN_0))
#define F(a) a ? (GPIOA->ODR |= GPIO_PIN_2):(GPIOA->ODR &= (~GPIO_PIN_2))
#define G(a) a ? (GPIOC->ODR |= GPIO_PIN_4):(GPIOC->ODR &= (~GPIO_PIN_4))
#define DP(a) a ? (GPIOC->ODR |= GPIO_PIN_6):(GPIOC->ODR &= (~GPIO_PIN_6))
// 0 1 2 3 4 5 6 7 8 9 P -
const uint8_t display_data[] = {0xFC,0X60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFF,0xF6,0xCE,0x02};
//void Display_b(uint8_t data);
//void Display_3(uint16_t data,uint8_t dp,uint8_t dig);
//显示刷新函数
/*
uint8_t dp == 小数点高有效 3'b000 ~ 3'b111
*/
void Display(uint8_t dp)
{
extern uint8_t dig_1,dig_2,dig_3,display_cnt;
switch(display_cnt)
{
case 0: GPIOD->ODR &= (~GPIO_PIN_7);//DIG3_LOW
A(dig_1 & 0X80);
B(dig_1 & 0X40);
C(dig_1 & 0X20);
D(dig_1 & 0X10);
E(dig_1 & 0x08);
F(dig_1 & 0X04);
G(dig_1 & 0X02);
DP(dp & 0x04);
GPIOD->ODR |= GPIO_PIN_3;//DIG1_HIGH
break;
case 1: GPIOD->ODR &= (~GPIO_PIN_3);//DIG1_LOW
A(dig_2 & 0X80);
B(dig_2 & 0X40);
C(dig_2 & 0X20);
D(dig_2 & 0X10);
E(dig_2 & 0x08);
F(dig_2 & 0X04);
G(dig_2 & 0X02);
DP(dp & 0x02);
GPIOD->ODR |= GPIO_PIN_2;//DIG2_HIGH
break;
case 2: GPIOD->ODR &= (~GPIO_PIN_2);//DIG2_LOW
A(dig_3 & 0X80);
B(dig_3 & 0X40);
C(dig_3 & 0X20);
D(dig_3 & 0X10);
E(dig_3 & 0x08);
F(dig_3 & 0X04);
G(dig_3 & 0X02);
DP(dp & 0x01);
GPIOD->ODR |= GPIO_PIN_7;//DIG3_HIGH
break;
}
display_cnt++;
if(display_cnt == 3)
display_cnt = 0;
}
void Display_Init(void)
{
//PA 1 2
GPIO_Init(GPIOA,(GPIO_Pin_TypeDef)(GPIO_PIN_1 | GPIO_PIN_2), GPIO_MODE_OUT_PP_LOW_FAST);
//PC 4 5 6 7
GPIO_Init(GPIOC,(GPIO_Pin_TypeDef)(GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7), GPIO_MODE_OUT_PP_LOW_FAST);
//PD 0 2 3 7
GPIO_Init(GPIOD,(GPIO_Pin_TypeDef)(GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_7), GPIO_MODE_OUT_PP_LOW_FAST);
//PF 4
GPIO_Init(GPIOF,GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
}
/*
数码管显示数据刷新
uint16_t data == 显示数据 0 ~ 999
*/
void Display_update(uint16_t data)
{
extern uint8_t dig_1,dig_2,dig_3;
dig_1 = display_data[((uint8_t)(data/100))] ;
dig_2 = display_data[((uint8_t)((data%100)/10))];
dig_3 = display_data[((uint8_t)(data%10))];
}
display.h
#include "stm8s.h"
#ifndef DISPLAY_H_
#define DISPLAY_H_
void Display_Init(void);//数码管初始化
void Display(uint8_t dp);//数码管刷新
void Display_update(uint16_t data);//数码管显示数据更新
#endif
我是stm8io冲突没法使用整组io只能这么搞了 每次调用显示函数移位一次每次显示小号69 -71时钟周期