#include <reg51.h> #include <intrins.h>

#define LCD_RS P2_0 #define LCD_RW P2_1 #define LCD_EN P2_2 #define LCD_DATA P0

sbit TOUCH_CS = P1^0; sbit TOUCH_CLK = P1^1; sbit TOUCH_DOUT = P1^2; sbit TOUCH_DIN = P1^3;

unsigned char code LCD_INIT_TABLE[] = { 0x38, // 8-bit mode, 2 lines, 5x7 font 0x0C, // Display on, cursor off, blink off 0x06, // Increment cursor 0x01, // Clear display 0x80 // Set cursor to home };

unsigned char code LCD_TABLE[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'V' };

void delay_us(unsigned int us) { while (us--) { nop(); nop(); nop(); nop(); nop(); } }

void delay_ms(unsigned int ms) { while (ms--) { delay_us(1000); } }

void lcd_command(unsigned char command) { LCD_RS = 0; LCD_RW = 0; LCD_DATA = command; LCD_EN = 1; delay_us(1); LCD_EN = 0; delay_us(100); }

void lcd_data(unsigned char data) { LCD_RS = 1; LCD_RW = 0; LCD_DATA = data; LCD_EN = 1; delay_us(1); LCD_EN = 0; delay_us(100); }

void lcd_init() { unsigned char i; for (i = 0; i < sizeof(LCD_INIT_TABLE); i++) { lcd_command(LCD_INIT_TABLE[i]); delay_ms(2); } }

void lcd_print_string(unsigned char *str) { while (*str) { lcd_data(*str++); } }

void lcd_print_number(float number) { unsigned char str[16]; sprintf(str, '%.2f', number); lcd_print_string(str); }

unsigned int touch_read(unsigned char command) { unsigned int data = 0; unsigned char i;

TOUCH_CS = 0;
TOUCH_CLK = 0;

for (i = 0; i < 12; i++) {
    if (command & 0x80) {
        TOUCH_DIN = 1;
    } else {
        TOUCH_DIN = 0;
    }
    
    command <<= 1;
    TOUCH_CLK = 1;
    TOUCH_CLK = 0;
}

TOUCH_CLK = 1;
TOUCH_CLK = 0;

for (i = 0; i < 12; i++) {
    TOUCH_CLK = 1;
    TOUCH_CLK = 0;
    data <<= 1;
    
    if (TOUCH_DOUT) {
        data |= 0x01;
    }
}

TOUCH_CS = 1;
return data;

}

float get_voltage() { unsigned int adc = touch_read(0x80); float voltage = (float)adc * 5.0 / 4095.0; return voltage; }

void main() { lcd_init();

while (1) {
    float voltage = get_voltage();
    lcd_command(0x80);
    lcd_print_number(voltage);
    lcd_data(' ');
    lcd_data('V');
    delay_ms(100);
}

}

该程序通过51单片机读取xpt2046触摸屏芯片的ADC值,并根据ADC值计算出电压值,然后使用51单片机的LCD1602液晶显示电压值。

51单片机与XPT2046触摸屏实现数字电压表程序

原文地址: https://www.cveoy.top/t/topic/o1yU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录