10年6个月前IP:北京
821740
3楼

给你个参考 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时钟周期

评论
文号 / 821740

千古风流
名片发私信
学术分 1
总主题 76 帖总回复 2030 楼拥有证书:进士 学者 机友 笔友
注册于 2012/11/16 16:45:34最后登录 2026/10/27 15:36:22
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

null

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的