static void TFT_DisplayChar(uint16_t x, uint16_t y, uint8_t Font, uint8_t p)
时间: 2023-12-01 17:39:05 浏览: 124
根据提供的引用内容,可以看出这是一段关于TFT显示屏的代码。其中,函数TFT_DisplayChar用于在指定位置显示一个字符。具体来说,它需要传入四个参数:x和y表示字符的左上角坐标,Font表示字符的字体大小,p表示要显示的字符。而static关键字则表示该函数只能在当前文件中使用,不能被其他文件调用。
相关问题
void oled_display_char(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
void oled_display_char(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size) 函数是用来在OLED屏幕上显示字符的。通过传入参数x和y,可以确定字符的位置。参数chr是要显示的字符,参数Char_size则是字符的大小。这个函数可能是用来在一个循环中显示字符的,根据引用中的代码段可以看出,在一个16x4的矩阵中,循环显示字符'b',并且字符大小为16。所以这个函数的作用就是在OLED屏幕的指定位置显示指定字符。
#include "main.h" #include <string.h> #define DIGITAL_NUMBER ( 4 ) typedef struct{ char ch; uint8_t digital_code; }digital_code_t; static uint8_t display_buf[DIGITAL_NUMBER]; static code digital_code_t digital_code[] = { {' ', 0x00},///<固定为不显示 {'0', 0x3f}, {'1', 0x06}, {'2', 0x5b}, {'3', 0x4f}, {'4', 0x66}, {'5', 0x6d}, {'6', 0x7d}, {'7', 0x07}, {'8', 0x7f}, {'9', 0x6f}, {'A', 0x77}, {'b', 0x7c}, {'C', 0x39}, {'d', 0x5e}, {'E', 0x79}, {'F', 0x71}, {'-', 0x40}, {'H', 0x76}, {'L', 0x38}, }; static void send_digital_code(uint8_t pos, uint8_t digital_code) { P2 &= 0xf0; P2 |= (1 << pos); P0 = ~digital_code;///<发段选信号 } void digital_display_poll(void) { static uint8_t digital_channel = 0; send_digital_code(digital_channel, display_buf[digital_channel]); digital_channel = (++digital_channel) % DIGITAL_NUMBER; } static uint8_t find_digital_code(char ch) { uint8_t i; for(i = 0; i < (sizeof(digital_code) / sizeof(digital_code[0])); i++){ if(ch == digital_code[i].ch){ return digital_code[i].digital_code; } } return digital_code[0].digital_code;//} void update_digital_display(char *buf) { uint8_t len; uint8_t i; uint8_t point_num = 0; uint8_t display_len; uint8_t display_pos; if(buf == NULL){ return; } len = strlen(buf); for(i = 0; i < len; i++){ if(buf[i] == '.'){ ++point_num; } } display_len = len - point_num; if(display_len > DIGITAL_NUMBER){ return; } for(i = 0; i < (DIGITAL_NUMBER - display_len); i++){ display_buf[i] = digital_code[0].digital_code; } display_pos = i; for(i = 0; i < len; i++){ if(buf[i] != '.'){ display_buf[display_pos] = find_digital_code(buf[i]); ++display_pos; }else{ display_buf[display_pos - 1] |= 0x80;//display_buf[display_pos - 1] &= 0x7f; } } } 给这段程序加注释
这段程序是一个数字显示模块的驱动程序,通过控制数字管的段选和位选实现数字的显示。下面是注释:
```
#include "main.h"
#include <string.h>
#define DIGITAL_NUMBER ( 4 ) ///<数字管的个数
typedef struct{ ///<数字对应的编码结构体
char ch; ///<数字或字符
uint8_t digital_code; ///<编码值
}digital_code_t;
static uint8_t display_buf[DIGITAL_NUMBER]; ///<数字管的显示缓存
static code digital_code_t digital_code[] = { ///<数字对应的编码表
{' ', 0x00},///<固定为不显示
{'0', 0x3f},
{'1', 0x06},
{'2', 0x5b},
{'3', 0x4f},
{'4', 0x66},
{'5', 0x6d},
{'6', 0x7d},
{'7', 0x07},
{'8', 0x7f},
{'9', 0x6f},
{'A', 0x77},
{'b', 0x7c},
{'C', 0x39},
{'d', 0x5e},
{'E', 0x79},
{'F', 0x71},
{'-', 0x40},
{'H', 0x76},
{'L', 0x38},
};
static void send_digital_code(uint8_t pos, uint8_t digital_code) { ///<发送数字编码到数字管
P2 &= 0xf0;///<清除位选信号
P2 |= (1 << pos);///<设置当前位选信号
P0 = ~digital_code;///<将数字编码取反作为段选信号
}
void digital_display_poll(void) { ///<数字管轮询函数
static uint8_t digital_channel = 0;///<当前位选通道
send_digital_code(digital_channel, display_buf[digital_channel]);///<发送数字编码
digital_channel = (++digital_channel) % DIGITAL_NUMBER;///<更新位选通道
}
static uint8_t find_digital_code(char ch) { ///<根据数字或字符查找其编码值
uint8_t i;
for(i = 0; i < (sizeof(digital_code) / sizeof(digital_code[0])); i++){
if(ch == digital_code[i].ch){
return digital_code[i].digital_code;
}
}
return digital_code[0].digital_code;
}
void update_digital_display(char *buf) { ///<更新数字管显示
uint8_t len;
uint8_t i;
uint8_t point_num = 0;///<小数点个数
uint8_t display_len;///<显示长度
uint8_t display_pos;///<当前显示位置
if(buf == NULL){///<判断输入参数是否合法
return;
}
len = strlen(buf);
for(i = 0; i < len; i++){///<统计小数点个数
if(buf[i] == '.'){
++point_num;
}
}
display_len = len - point_num;///<计算显示长度
if(display_len > DIGITAL_NUMBER){///<长度超过数字管个数则退出
return;
}
for(i = 0; i < (DIGITAL_NUMBER - display_len); i++){///<在前面加空格
display_buf[i] = digital_code[0].digital_code;
}
display_pos = i;
for(i = 0; i < len; i++){
if(buf[i] != '.'){///<不是小数点则查找数字编码值
display_buf[display_pos] = find_digital_code(buf[i]);
++display_pos;
}else{///<是小数点则标记当前数字编码为小数点
display_buf[display_pos - 1] |= 0x80;///<将最高位设置为1
}
}
}
```
阅读全文