7 Segment 4 หลัก กดสวิตช์ เพิ่มและลดตัวเลข

…เป็นโมเดลที่ผมทำไว้นานแล้วเลยเอามาปล่อยเพื่อเป็นกรณีศึกษาต่อน้องๆ นักศึกษา หรือผู้ที่สนใจโดยทั่วไปครับ
หลักการคร่าวๆ คือ จะมีไมโครคอนโทรลเลอร์ FIC16F1939 ต่อเข้ากับ 7 Segment 4 หลัก มีสวิตช์ 2 ปุ่ม ปุ่มแรก กดหนึ่งครั้งจะเพิ่มจำนวนขึ้นทีละ 1 จาก 0 สวิตช์ที่ 2 เมื่อกดจะลดค่าลงทีละ 1 ครับ ตั้งแต่ 0 - 9999

#include <htc.h>
__CONFIG(FOSC_INTOSC & 
WDTE_OFF & 
PWRTE_ON & 
MCLRE_ON & 
CP_OFF & 
CPD_OFF & 
BOREN_OFF & 
CLKOUTEN_OFF & 
IESO_ON & 
FCMEN_ON &

WRT_OFF & 
//VCAPEN_OFF & 
PLLEN_ON & 
STVREN_ON & 
BORV_HI & 
LVP_OFF);

#define _XTAL_FREQ 32000000
#define DSP_7SEG LATD
#define SCAN_DIS1 LATCbits.LATC0
#define SCAN_DIS2 LATCbits.LATC1
#define SCAN_DIS3 LATCbits.LATC2
#define SCAN_DIS4 LATCbits.LATC3
#define SW1	 PORTBbits.RB0
#define SW2        PORTBbits.RB1
#define SW3	PORTBbits.RB2
#define LED1      LATBbits.LATB5
#define LED2      LATBbits.LATB6
#define ON 1;
#define OFF 0;
char const LED_CHR[17]={0x3F,0x06,0x5B,0x4F,0x66,
						0x6D,0x7D,0x07,0x7F,0x6F,
						0x77,0x7C,0x39,0x5E,0x79,
						0x71,0x80};
unsigned int i,j;
unsigned int data2;
unsigned int buff1,buff2,buff3,buff4,temp;

void main(void)
{
OSCCONbits. SPLLEN = 1;
OSCCONbits. IRCF= 14;
OSCCONbits. SCS = 0;
ANSELBbits. ANSB0 = 0;
ANSELBbits. ANSB1 = 0;
ANSELBbits. ANSB2 = 0;
TRISD=0x00;
TRISC=0x00;
TRISB=0x07;
LED1=OFF;
LED2=OFF;
data2=0;
while(1)
{
if(!SW1)
{
 __delay_ms(50);
if(!SW1)
data2++;
}
if(!SW2)
{
__delay_ms(50);
if(!SW2)
 data2--;
}
		
	buff1=(data2/1000);
	temp=(data2%1000);
	buff2=(temp/100);
	temp=temp%100;
	buff3=(temp/10);
	buff4=(temp%10);


DSP_7SEG=LED_CHR[buff1];
SCAN_DIS1=OFF;
__delay_ms(1);
SCAN_DIS1=ON;

DSP_7SEG=LED_CHR[buff2];
SCAN_DIS2=OFF;
__delay_ms(1);
SCAN_DIS2=ON;

DSP_7SEG=LED_CHR[buff3];
SCAN_DIS3=OFF;
__delay_ms(1);
SCAN_DIS3=ON;

DSP_7SEG=LED_CHR[buff4];
SCAN_DIS4=OFF;
__delay_ms(1);
SCAN_DIS4=ON;
__delay_ms(10);

	}

}