环境说明
该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。
- 芯片: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 对应的十六进制:
十进制 | 十六进制 | 十进制 | 十六进制 |
---|---|---|---|
0 | 0xC0 | 5 | 0x92 |
1 | 0xF9 | 6 | 0x82 |
2 | 0xA4 | 7 | 0xF8 |
3 | 0xB0 | 8 | 0x80 |
4 | 0x99 | 9 | 0x90 |
从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();
}
}