洪嵐峰 發表於 2023-4-30 09:40:44

PIC16F877A

製作含勾錶的三用電表,你所需要的零件包括:

PIC16F877A 微控制器
AC/DC 交直流電表模組
16x2 字元液晶顯示器模組
4 顆按鈕開關
2 個 10K 歐姆電位器
電容:10uF、22pF
晶振:20MHz
電阻:1K、10K、220K、470K

以下是程式碼,使用 CCS C 編譯器:


#include <16F877A.h>
#include <stdlib.h>
#include <lcd.h>

#use delay(crystal=20000000)

// AC/DC 交直流電表模組連結腳位
#bit AC_DC = 0x08.0
#bit AC_DC_SEL = 0x08.1
#bit MEASURE = 0x08.2

// 顯示器模組連結腳位
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_E_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

// 10K 歐姆電位器連結腳位
#define POT1 PIN_A0
#define POT2 PIN_A1

// 按鈕開關連結腳位
#define BUTTON1 PIN_B0
#define BUTTON2 PIN_B1
#define BUTTON3 PIN_B2
#define BUTTON4 PIN_B3

// 電容連結腳位
#define CAPACITOR PIN_C0

float voltage;
char text;

void main()
{
    lcd_init();
    lcd_putc("3 in 1 Multimeter");
    delay_ms(1000);
    lcd_putc("\f");

    while(1)
    {
        // 顯示交直流切換選項
        lcd_gotoxy(1, 1);
        lcd_putc("AC/DC:");
        if(AC_DC_SEL == 0)
        {
            lcd_putc("DC");
        }
        else
        {
            lcd_putc("AC");
        }

        // 顯示電壓值
        if(MEASURE == 1)
        {
            if(AC_DC == 1)
            {
                // 測量交流電壓
                voltage = (float)analog(read_adc()) * 0.0196;
            }
            else
            {
                // 測量直流電壓
                voltage = (float)analog(read_adc()) * 0.0244;
            }

            // 顯示電壓值
            lcd_gotoxy(1, 2);
            sprintf(text, "Voltage:%.2fV", voltage);
            lcd_putc(text);
        }

        // 設定交直流切換按鈕
        if(input(BUTTON1) == 0

    {
        delay_ms(20);
        if(input(BUTTON1) == 0)
        {
            AC_DC_SEL = !AC_DC_SEL;
            delay_ms(50);
        }
    }

    // 設定測量按鈕
    if(input(BUTTON2) == 0)
    {
        delay_ms(20);
        if(input(BUTTON2) == 0)
        {
            MEASURE = !MEASURE;
            delay_ms(50);
        }
    }

    // 設定亮度調整
    if(input(BUTTON3) == 0)
    {
        delay_ms(20);
        if(input(BUTTON3) == 0)
        {
            // 顯示亮度調整提示
            lcd_putc("\f");
            lcd_gotoxy(1, 1);
            lcd_putc("Brightness:");
            lcd_gotoxy(1, 2);
            lcd_putc("Pot 1:    Pot 2:");

            while(input(BUTTON4) == 1)
            {
                // 顯示電位器值
                lcd_gotoxy(10, 2);
                sprintf(text, "%04lu", analog_read(POT1));
                lcd_putc(text);
                lcd_gotoxy(17, 2);
                sprintf(text, "%04lu", analog_read(POT2));
                lcd_putc(text);

                // 設定亮度
                lcd_backlight(1);
                delay_ms(analog_read(POT1) / 4);
                lcd_backlight(0);
                delay_ms(analog_read(POT2) / 4);
            }

            // 顯示回主畫面
            lcd_putc("\f");
        }
    }
}
}



程式碼中使用 `lcd.h` 標頭檔,需在 CCS C 編譯器中設定 Include 路徑。

程式碼中包含以下功能:

1. 顯示器初始化
2. 顯示器顯示 "3 in 1 Multimeter",延遲 1 秒後清除顯示
3. 顯示器顯示交直流切換選項和電壓值
4. 設定交直流切換按鈕,切換 AC/DC 模式
5. 設定測量按鈕,開啟或關閉電壓測量
6. 設定亮度調整按鈕,調整顯示器亮度
7. 顯示器支援亮度調整功能
頁: [1]
查看完整版本: PIC16F877A