STC8H8K64U 学习笔记 - 数码管

环境说明

该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。

  • 芯片:STC8H8K64U
  • 烧录软件:stc-isp-v6.92G
  • 编码工具:天问

引脚说明

  • P0_0:蜂鸣器,按频率发音,1:高,0:低
  • P0_1:电动马达,0:停,1:动
  • P5_3:小蓝灯,0:灭,1:亮
  • P2_7:1 号 LED 灯,0:亮,1:灭
  • P2_6:2 号 LED 灯,0:亮,1:灭
  • P1_5:3 号 LED 灯,0:亮,1:灭
  • P1_4:4 号 LED 灯,0:亮,1:灭
  • P2_3:5 号 LED 灯,0:亮,1:灭
  • P2_2:6 号 LED 灯,0:亮,1:灭
  • P2_1:7 号 LED 灯,0:亮,1:灭
  • P2_0:8 号 LED 灯,0:亮,1:灭
  • P5_1:1 号按键,0:按下,1:弹起
  • P5_2:2 号按键,0:按下,1:弹起
  • P5_3:3 号按键,0:按下,1:弹起
  • P5_4:4 号按键,0:按下,1:弹起
  • P3_4:矩阵键盘第 1 行引脚
  • P3_5:矩阵键盘第 2 行引脚
  • P4_0:矩阵键盘第 3 行引脚
  • P4_1:矩阵键盘第 4 行引脚
  • P0_3:矩阵键盘第 1 列引脚
  • P0_6:矩阵键盘第 2 列引脚
  • P0_7:矩阵键盘第 3 列引脚
  • P1_7:矩阵键盘第 4 列引脚

数码管

数码管设计为共阳,也就是在低电平的时候会点亮 LED 灯。十六进制的位和LED灯的对应如下:

DP G F E   D C B A
 1 1 1 1   1 1 1 1
DP 为右下角的圆点,其他位置零的时候会点亮 LED 灯,字母和实物对应关系:
      A    
  ┌───────┐  
  │       │  
 F│       │B 
  │   G   │  
  ├───────┤  
  │       │  
 E│       │C 
  │   D   │  
  └───────┘  DP

数字 0 —— 9 对应的十六进制:

十进制十六进制十进制十六进制
00xC050x92
10xF960x82
20xA470xF8
30xB080x80
40x9990x90

从0到9依次闪频

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/delay.h"

// 声明宏变量
#define NIX_DI		P4_4	// 数据输入
#define NIX_SCK		P4_2	// 移位寄存器
#define NIX_RCK		P4_3	// 锁存寄存器

// num: 控制显示的什么内容
// idx: 控制显示哪几个显示
void Nixie_show(unsigned char num, unsigned char idx) {
    char i; // --操作,有可能有负数,用char,不用无符号
    // 显示什么内容
    for(i = 7; i >= 0; i--) {
        // 取出第i位给数据引脚赋值
        NIX_DI = (num & (1 << i)) >> i;
        // 移位电平变化 0 -> 1,适当延时
        NIX_SCK = 0;
        _nop_();
        NIX_SCK = 1;
        _nop_();
    }

    // 第几个数码管显示
    for(i = 7; i >= 0; i--) {
         // 取出第i位给数据引脚赋值
        NIX_DI = (idx & (1 << i)) >> i;
        // 移位电平变化 0 -> 1,适当延时
        NIX_SCK = 0;
        _nop_();
        NIX_SCK = 1;
        _nop_();
    }

    // 锁存,更新到电路
    // 锁存电平变化 0 -> 1,适当延时
    NIX_RCK = 0;
    _nop_();
    NIX_RCK = 1;
    _nop_();
}

// num 对应的内容在数组的位置(索引),配合自定义码表
// idx  显示在屏幕上的位置(1 -> 8)
void Nixie_display(unsigned char num, unsigned char idx) {
    Nixie_show(num, 1 << (idx - 1));
}

uint8 i = 0;
const length = 10;
const uint8 nums[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void setup() {
  P4M1&=~0x10; P4M0|=0x10;  // P4_4 推挽
  P4M1&=~0x08; P4M0&=~0x08; // P4_3 双向
  P4M1&=~0x04; P4M0&=~0x04; // P4_2 双向

  // 参数1: 控制显示的什么内容
  // 参数2: 控制显示哪几个显示
  // Nixie_show(0xC0, 0xff);
  
  // 参数1: 控制显示的什么内容
  // 参数2: 控制第几个显示
  // Nixie_display(0xf8, 8);
}

void loop() {
  if(i > 9) {
    i = 0;
  }
  if(i == 0 || i == 9) {
    Nixie_show(nums[i], 0xff);
    delay(1000);
  } else {
    Nixie_display(nums[i], i);
    delay(500);
  }
  i++;
}

void main(void) {
  setup();
  while(1){
    loop();
  }
}

从1到8同时显示

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/delay.h"

// 声明宏变量
#define NIX_DI		P4_4	// 数据输入
#define NIX_SCK		P4_2	// 移位寄存器
#define NIX_RCK		P4_3	// 锁存寄存器

// num: 控制显示的什么内容
// idx: 控制显示哪几个显示
void Nixie_show(unsigned char num, unsigned char idx) {
    char i; // --操作,有可能有负数,用char,不用无符号
    // 显示什么内容
    for(i = 7; i >= 0; i--) {
        // 取出第i位给数据引脚赋值
        NIX_DI = (num & (1 << i)) >> i;
        // 移位电平变化 0 -> 1,适当延时
        NIX_SCK = 0;
        _nop_();
        NIX_SCK = 1;
        _nop_();
    }

    // 第几个数码管显示
    for(i = 7; i >= 0; i--) {
         // 取出第i位给数据引脚赋值
        NIX_DI = (idx & (1 << i)) >> i;
        // 移位电平变化 0 -> 1,适当延时
        NIX_SCK = 0;
        _nop_();
        NIX_SCK = 1;
        _nop_();
    }

    // 锁存,更新到电路
    // 锁存电平变化 0 -> 1,适当延时
    NIX_RCK = 0;
    _nop_();
    NIX_RCK = 1;
    _nop_();
}

// num 对应的内容在数组的位置(索引),配合自定义码表
// idx  显示在屏幕上的位置(1 -> 8)
void Nixie_display(unsigned char num, unsigned char idx) {
    Nixie_show(num, 1 << (idx - 1));
}

uint8 i = 0;
const length = 10;
const uint8 nums[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void setup() {
  P4M1&=~0x10; P4M0|=0x10;  // P4_4 推挽
  P4M1&=~0x08; P4M0&=~0x08; // P4_3 双向
  P4M1&=~0x04; P4M0&=~0x04; // P4_2 双向
}

void loop() {
  for(i= 1; i < length - 1; i++) {
    Nixie_display(nums[i], i);
  }
}

void main(void) {
  setup();
  while(1){
    loop();
  }
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STC8H8K64U-45I-TSSOP20是一款STC8系列的芯片型号。根据引用\[1\]中提到的STC8系列的内部资源表,我们可以了解到STC8H8K64U具有丰富的内部资源。同时,根据引用\[2\]中提到的LCD1602的控制命令表,我们可以了解到LCD的读写操作方式。此外,引用\[3\]中提到STC8系列芯片的输出模式,其中STC8H8K64U-45I-TSSOP20属于推挽输出模式。 #### 引用[.reference_title] - *1* [STC8H8K64U单片机学习-0-宏晶STC官网初探](https://blog.csdn.net/qq_41735476/article/details/122291519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STC8H8K64U——LCD1602](https://blog.csdn.net/w541541/article/details/127623787)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [『STC8H8K64U』概述](https://blog.csdn.net/LYX_2937/article/details/128153591)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值