亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? volume_16f876a_v30a_debug.c

?? pic單片機做的六聲道音量控制板的程序。很不錯的資料
?? C
字號:
#include  <pic.h>
#include  <string.h>
#include  <stdio.h>
#include  <stdlib.h>


#define PIC_CLK 20000000
#include "delay_alternative_enhanced_precision.h"

//__CONFIG(WDTDIS & XT & UNPROTECT & LVPDIS);	// freq. clock 4MHz
//__CONFIG(WDTDIS & HS & UNPROTECT & LVPDIS);	// freq. clock 20MHz
__CONFIG(WDTDIS & PWRTEN & HS & UNPROTECT & DEBUGDIS & BORDIS & LVPDIS); 

#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))

static bit CSL     @ PORTBIT(PORTA, 0);
static bit DAT     @ PORTBIT(PORTA, 1);
static bit CLK     @ PORTBIT(PORTA, 2);
static bit IR      @ PORTBIT(PORTB, 0);

static bit WEN     @ PORTBIT(PORTA, 3);

static bit VUP     @ PORTBIT(PORTB, 1);
static bit VDW     @ PORTBIT(PORTB, 2);

static bit ENC_A   @ PORTBIT(PORTB, 4);
static bit ENC_B   @ PORTBIT(PORTB, 5);

static bit LCD_RS  @ PORTBIT(PORTA, 2);
static bit LCD_RW  @ PORTBIT(PORTA, 4);
static bit LCD_EN  @ PORTBIT(PORTA, 5);


//******************************************************************************
//* function declarationis & global variables
//******************************************************************************
void        DelayMs(unsigned char);
void        write_SPI(unsigned int, unsigned int);
void        LCD_init(void);
void        LCD_write_str(int, int, char *, int);
void        LCD_write_data(unsigned char);
void        LCD_write_cmd(unsigned char);
void        LCD_wait_busy(void);
int         byteToInt(unsigned char, unsigned char) ;
int         intToByte(int, unsigned char *, unsigned char *);
void        save_vol(int, int);
void        set_volume(int, int);
void        itoa(int, char *, int);
void        uitoa(unsigned int, char*, int);
signed char rc5_receive(unsigned int *, unsigned int *) ;
signed char encoder(void);
void DelayBigUs(unsigned int cnt);
void DelayBigMs(unsigned int cnt) ;


unsigned char byte1, byte2, byte3, byte4;
char          tmp[30];


unsigned int RC5addr = 0, RC5data = 0;

#define LOGO      "AUDIODESIGNGUIDE"
#define VOLUME    "Volume      dB"
#define MAX_VOL	  (255)
#define MIN_VOL	  (0)
#define INC_VOL   (2)
#define MAX_VDB	  (31)
#define MIN_VDB	  (-95)
#define INC_VDB   (1)


void main()
{
    int          vol;
    int          vdb;
    int          volume_up   = 0;
    int		 volume_down = 0;
  
	
    TRISA   = 0b00000000;  // All port A are output
    TRISB   = 0b11111111;  // All port B are input
    TRISC   = 0b00000000;  // All post C are output
	
    ADCON1  = 0x06;	   // All posts AN4-7 to digital

    PORTA   = 0b00000000;
    PORTC   = 0b00000000;


    DAT = 0;
    CLK = 0;
    WEN = 1;
    CSL = 1;

    //##################################################
    //# starup interrupts
    //##################################################
    INTEDG = 0;
    INTE = 1;
    GIE = 1;

    DelayMs(50);

    //##################################################
    //# display startup
    //##################################################
    LCD_init();

    strcpy(tmp, LOGO);
    LCD_write_str( 1, 1, tmp, 16);

    //##################################################
    //# get and set last saved volume level
    //################################################## 	
    byte1 = EEPROM_READ(0x00);
    byte2 = EEPROM_READ(0x01);
    byte3 = EEPROM_READ(0x02);
    byte4 = EEPROM_READ(0x03);

    vol = byteToInt(byte1, byte2);
    vdb = byteToInt(byte3, byte4);

    if (vol == -1 || vdb == -1)
    {
        vol = MIN_VOL;
        vdb = MIN_VDB;
    }
    set_volume(vol, vdb);


    //##################################################
    //# main loop
    //################################################## 	
    while(1)
    {
    	volume_up = volume_down = 0;

        //##################################################
        //# get data from infrared receiver
        //################################################## 	
	// 20: rc5 cd remote 10100 

	if (RC5addr == 20)
	{
	    // 16: volume + 10000
	    // 17: volume - 10001

	    switch (RC5data)
	    {
		case 16:
		   volume_up = 1;
		   break;

		case 17:
		   volume_down = 1;
		   break;
	    }
	    RC5data = 0;
	    RC5addr = 0;
	}
	//##################################################
        //# get input from button
        //################################################## 	
	if (VUP == 0) volume_up   = 1;
	if (VDW == 0) volume_down = 1;

	//##################################################
        //# get input from encder
        //################################################## 	
#ifdef NO_ENCODER
	switch(encoder())
	{
	    case 1:
		volume_up = 1;
		break;

	    case -1:
		volume_down = 1;
		break;
	}
#endif
        //##################################################
        //# elaborate input
        //################################################## 	
        if (volume_up)
        {
	    if (vol < (MAX_VOL - INC_VOL))
	    {
		vol += INC_VOL;
		vdb += INC_VDB;
	    }
	    else
	    {
		vol = MAX_VOL;
		vdb = MAX_VDB;
	    }
	    set_volume(vol, vdb);
 
	    save_vol(vol, vdb);

	    volume_up = 0;
	}
        else if (volume_down)
        {
	    if (vol > INC_VOL)
	    {
		vol -= INC_VOL;
		vdb -= INC_VDB;
	    }
	    else
	    {
		vol = 0;
		vdb = -95;
	    }
	    set_volume(vol, vdb);
 
	    save_vol(vol, vdb);

	    volume_down = 0;
	}
    }
}

//*********************************************************************
//* LCD read and write
//*********************************************************************
void LCD_init()
{
    char * ptr, curr;
    char   LCDstr[] = { 0x3c, // 111100: 8bits, 2lines, 5x10dots
			0x01, // clear display
			0x0c, // 1100: display on, cursor off
			0x06, // 110: auto-increment
			0x00 };

    ptr = LCDstr;

    while(*ptr)
    {
        LCD_write_cmd(*ptr);

	ptr++;
    }
}

void LCD_wait_busy()
{
    unsigned char busy;
    int           retry = 1000;

    TRISC = 0xff;
    LCD_RS = 0;		
    LCD_RW = 1;		// read
    asm("nop");
    asm("nop");

    do {
	    LCD_EN = 1;

	    asm("nop");
	    asm("nop");

	    busy = PORTC & 0x80;
	    LCD_EN = 0;
    } while (busy && retry-- > 0);

    TRISC = 0x00;
}

void LCD_write_cmd(unsigned char c)
{
    LCD_wait_busy();

    LCD_RW = 0;
    LCD_RS = 0;		
    PORTC  = c;
    LCD_EN = 1;
    LCD_EN = 0;
}

void LCD_write_data(unsigned char c)
{
    LCD_wait_busy();

    LCD_RW = 0;
    LCD_RS = 1;		
    PORTC  = c;
    LCD_EN = 1;
    LCD_EN = 0;
}

void LCD_write_str(int line, int pos, char * str, int len)
{
    char 	  * ptr;
    unsigned char  curr;
    int i;


    //*************************************************
    // set the posistion and line
    //*************************************************
    if (line == 1)
	curr = 0b10000000 + (pos - 1);
    else
	curr = 0b11000000 + (pos - 1);

    LCD_write_cmd(curr);

    //*************************************************
    // send the string
    //*************************************************
    ptr = str;

    for(i = 0; *ptr && i < len; i++)
    {
        LCD_write_data(*ptr);

	ptr++;
    }
}


void DelayMs(unsigned char cnt)
{
    unsigned char	i;

    do {
	i = 4;

	do {
		DelayUs(250);
	    } while(--i);
    } while(--cnt);
}


void interrupt prv_int(void)
{
#define TIME_MIN  (500)
#define TIME_MAX  (1100)
#define TIME_STEP (200)

    int           OnTime, OffTime, i, k;
    unsigned int  data = 0, addr = 0;


    if (INTF == 0) return;

    INTF = 0;


    for (OffTime = 0; !IR && OffTime < TIME_MAX; OffTime += TIME_STEP)
    {
	DelayUs(TIME_STEP);
	tmp[0] = '0';
    }
    if (OffTime > TIME_MAX) return;
    if (OffTime < TIME_MIN) return;

    for (OnTime = 0; IR && OnTime < TIME_MAX; OnTime += TIME_STEP)
    {
	DelayUs(TIME_STEP);
	tmp[1] = '1';
    }
    if (OnTime > TIME_MAX) return;
    if (OnTime < TIME_MIN) return;

    for (k = 0; k < 25; k++)
    {
	if (IR)
	{
	    for (i = 0; IR && i <= OnTime; i += TIME_STEP)
	    {
		DelayUs(TIME_STEP);
	    }
	    tmp[k+2] = '1';
	}
	else
	{
	    for (i = 0; !IR && i <= OffTime; i += TIME_STEP)
	    {
		    DelayUs(TIME_STEP);
	    }
	    tmp[k+2] = '0';
	}
    }
    tmp[k+2] = '\0';

    addr = 0;
    data = 0;

    for (k = 0; k < 5; k++)
    {
	if (tmp[5 + (k * 2)] == '1')
	{
	    addr <<= 1; addr |= 1;
	}
	else
	{
	    addr <<= 1;
	}
    }
    for (; k < 11; k++)
    {
	if (tmp[5 + (k * 2)] == '1')
	{
	    data <<= 1; data |= 1;
	}
	else
	{
	    data <<= 1;
	}
    }
    RC5data = data;
    RC5addr = addr;

    return;
}

void set_volume(int vol, int vdb)
{
    CSL = 0;
    write_SPI(vol, 8);
    write_SPI(vol, 8);
    CSL = 1;

    WEN = 0;
    write_SPI(203, 8);
    write_SPI(vol, 8);
    WEN = 1;

    strcpy(tmp, VOLUME);
    LCD_write_str( 2, 1, tmp, 16);

    //itoa(vol, tmp, 10);
    //LCD_write_str( 2, 1, tmp);

    itoa(vdb, tmp, 10);
    LCD_write_str( 2, 8, tmp, 16);
}

void save_vol(int vol, int vdb)
{
    intToByte(vol, &byte1, &byte2);
    intToByte(vdb, &byte3, &byte4);

    EEPROM_WRITE(0x00, byte1);
    EEPROM_WRITE(0x01, byte2);
    EEPROM_WRITE(0x02, byte3);
    EEPROM_WRITE(0x03, byte4);
}

void write_SPI(unsigned int data, unsigned int n_bit)
{
    unsigned int bit_mask;
    int i;


    bit_mask = 1 << (n_bit - 1);
    
    for (i = 0; i < n_bit; i++)
    {        
        CLK = 0;

        if ((data & bit_mask) == 0)
            DAT = 0;
        else
            DAT = 1;

        CLK = 1;
       
        data <<= 1;
    }
}

//*********************************************************************
//* ENCODER - Checks rotary encoder and returns the following:
//*
//*               0:  no movement
//*              -1:  ccw rotation
//*               1:  cw rotation
//* from http://www.littlefishbicycles.com/preamp
//*********************************************************************
signed char encoder(void)
{
	static unsigned char a, b;
	if (!a & !b) {
		if (ENC_A) {
			a = ENC_A;
			return (-1);
		}
		if (ENC_B) {
			b = ENC_B;
			return (1);
		}
	}
	if (a & !b) {
		if (!ENC_A) {
			a = ENC_A;
			return (1);
		}
		if (ENC_B) {
			b = ENC_B;
			return (-1);
		}
	}
	if (a & b) {
		if (!ENC_A) {
			a = ENC_A;
			return (-1);
		}
		if (!ENC_B) {
			b = ENC_B;
			return (1);
		}
	}
	if (!a & b) {
		if (ENC_A) {
			a = ENC_A;
			return (1);
		}
		if (!ENC_B) {
			b = ENC_B;
			return (-1);
		}
	}
	return (0);
}

int intToByte(int integer, unsigned char * byte1, unsigned char * byte2)
{
    *byte1 = (char)(integer >> 8);
    *byte2 = (char)(integer);

    return 0;
}

int byteToInt(unsigned char byte1, unsigned char byte2) 
{
    int integer;

    integer = byte1;
    integer <<= 8;
    integer |= byte2;

    return integer;
}


#define NUMBER_OF_DIGITS 14   /* space for NUMBER_OF_DIGITS + '\0' */

void uitoa(unsigned int value, char* string, int radix)
{
    unsigned char index, i;

    index = NUMBER_OF_DIGITS;
    i = 0;

    do {
        string[--index] = '0' + (value % radix);
        if ( string[index] > '9') string[index] += 'A' - ':';   /* continue with A, B,.. */
        value /= radix;
    } while (value != 0);

    do {
        string[i++] = string[index++];
    } while ( index < NUMBER_OF_DIGITS );

    string[i] = 0; /* string terminator */
}

void itoa(int value, char* string, int radix)
{
    int val = value;

    if (val < 10 && val > -10)
	*string++ = ' ';

    if (val < 0 && radix == 10)
    {
        *string++ = '-';
        uitoa(-val, string, radix);
    }
    else 
    {
        *string++ = ' ';
        uitoa(val, string, radix);
    }
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线观看地址| 久久久久久久久久久久久久久99 | 美女www一区二区| 亚洲精品免费播放| 国产日韩欧美在线一区| 欧美大黄免费观看| 91精品免费观看| 欧美精品久久久久久久久老牛影院| 99热这里都是精品| 成人动漫在线一区| 91看片淫黄大片一级在线观看| 欧美变态凌虐bdsm| 日本一区二区三区视频视频| 日本不卡一区二区三区高清视频| 亚洲超碰精品一区二区| 午夜精品在线视频一区| 久久不见久久见免费视频1| 国产真实乱子伦精品视频| 国产一区二区三区av电影| 国产+成+人+亚洲欧洲自线| 99久久综合色| 久久久www成人免费毛片麻豆| 日本不卡视频在线观看| 高清国产一区二区三区| 欧美成人r级一区二区三区| 日韩在线a电影| 国产成人精品免费网站| 日本高清不卡视频| 欧美一区三区二区| 国产精品午夜电影| 一区二区三区视频在线观看| 亚洲成人动漫一区| 欧美日韩国产三级| 欧美国产日韩亚洲一区| 亚洲成人av电影| 欧美日韩美女一区二区| 性久久久久久久久久久久| 欧美情侣在线播放| 图片区小说区区亚洲影院| 欧美日韩mp4| 日本不卡123| 精品剧情在线观看| 奇米色777欧美一区二区| 4438x亚洲最大成人网| 日本sm残虐另类| 26uuu色噜噜精品一区| 亚洲男女一区二区三区| 看电影不卡的网站| 久久婷婷综合激情| av电影一区二区| 亚洲综合在线观看视频| 国产一区二区福利视频| 国产欧美日韩亚州综合| 99久久精品国产一区二区三区| 91精选在线观看| 极品美女销魂一区二区三区| 精品污污网站免费看| 中文字幕制服丝袜成人av| 免费一区二区视频| 久久精品在这里| 九色综合狠狠综合久久| 国产精品情趣视频| 日本丶国产丶欧美色综合| 日本一不卡视频| 日本一区二区免费在线观看视频| 色综合久久久久网| 国产欧美精品区一区二区三区 | 精品国产欧美一区二区| 亚洲综合久久av| 欧美tk—视频vk| 91亚洲精品久久久蜜桃| 日韩国产精品久久| 中文字幕在线观看一区| 波多野结衣中文字幕一区| 国产一区二区三区免费看 | 亚洲一区二区三区视频在线播放| 日韩一区二区视频在线观看| 亚洲永久免费av| 精品国产污网站| 欧美综合天天夜夜久久| 亚洲国产aⅴ成人精品无吗| 欧美亚洲综合在线| 午夜影院久久久| 中文子幕无线码一区tr| 91麻豆精品国产自产在线观看一区 | 狠狠色丁香婷婷综合| 亚洲精品成人悠悠色影视| 久久综合九色综合欧美98| 欧美羞羞免费网站| 成人午夜精品一区二区三区| 国产精品欧美综合在线| 日韩美女一区二区三区四区| 色天天综合久久久久综合片| 国产真实乱对白精彩久久| 日韩激情视频网站| 亚洲第一搞黄网站| 亚洲欧美另类在线| 国产日韩精品视频一区| 日韩精品一区二区三区三区免费| 欧美日韩亚洲综合在线| 91免费在线播放| 成人精品免费看| 国产一区二区免费看| 另类小说视频一区二区| 日本亚洲免费观看| 视频在线观看一区| 性做久久久久久久免费看| 亚洲精品乱码久久久久久黑人| 国产精品久久久久久久蜜臀| 久久九九影视网| 国产欧美一区二区精品性色超碰| 久久在线观看免费| 欧美成人一区二区三区| 精品国产一二三| 精品国产乱码久久久久久夜甘婷婷| 国产精品视频一二三| 久久尤物电影视频在线观看| 久久一夜天堂av一区二区三区| 日韩免费视频一区二区| 日韩精品自拍偷拍| 2023国产精品自拍| 国产亚洲女人久久久久毛片| 国产日韩欧美精品在线| 中文字幕乱码久久午夜不卡| 国产精品每日更新在线播放网址| 国产精品午夜春色av| 中文字幕欧美一| 夜夜亚洲天天久久| 亚洲成av人片一区二区三区| 日韩国产精品久久| 国产在线视频一区二区| 国产91色综合久久免费分享| 成人av免费在线| 色婷婷精品久久二区二区蜜臀av| 91成人在线免费观看| 欧美日韩国产系列| xfplay精品久久| 亚洲欧洲精品一区二区精品久久久| 亚洲免费观看高清完整版在线| 亚洲激情六月丁香| 免费看日韩a级影片| 国产成人精品亚洲午夜麻豆| 91色综合久久久久婷婷| 欧美日韩美女一区二区| 久久亚洲二区三区| 亚洲欧美偷拍三级| 麻豆精品一区二区av白丝在线| 国产一区二区三区不卡在线观看| 91在线观看地址| 日韩女优制服丝袜电影| 自拍偷自拍亚洲精品播放| 久久综合色鬼综合色| 国产精品短视频| 日韩av二区在线播放| 国产精一区二区三区| 国产一区在线观看麻豆| 91首页免费视频| 欧美不卡视频一区| 亚洲综合一区在线| 国产一区二区三区高清播放| 在线观看亚洲精品视频| 久久午夜老司机| 日本色综合中文字幕| 99久久精品国产导航| 精品国产三级a在线观看| 一区二区三区在线视频播放| 国产黄色精品网站| 在线不卡欧美精品一区二区三区| 欧美国产国产综合| 另类中文字幕网| 欧美日韩高清不卡| 亚洲色图视频免费播放| 国产一区91精品张津瑜| 欧美伊人久久久久久午夜久久久久| 亚洲一区欧美一区| 国产盗摄一区二区三区| 欧美男男青年gay1069videost| 国产精品久线在线观看| 国产精品1区2区| 日韩一级片在线观看| 亚洲国产综合在线| 色一情一乱一乱一91av| 日本一区二区综合亚洲| 精品一区二区三区视频在线观看| 欧美日韩在线观看一区二区| 亚洲欧美日韩国产综合| 成人永久免费视频| 久久色在线视频| 久久精品国产精品亚洲精品| 欧美一三区三区四区免费在线看 | 中文字幕成人在线观看| 蜜臀av性久久久久av蜜臀妖精| 欧美无砖砖区免费| 亚洲精品久久7777| 色女孩综合影院| 亚洲免费在线看| 91美女片黄在线| 亚洲激情综合网| 欧美日韩免费观看一区三区| 一区二区三区波多野结衣在线观看|