因為我的mp4壞了,手機也不太給力,所以自己想用單片機給自己做個鬧鐘,51單片機又太垃圾了,32又沒有學會,就試著用火箭板給自己做個小小的鬧鐘。
實習的時候寫過鬧鐘程序,所以一個下午就把程序給寫出來了,但其中由于有些缺陷,修改了3個下午才調試完成,雖然有些紕漏,但還是挺滿意的。
//這是主函數
- #include <msp430g2553.h>
- #include "wenben.h"
- #include "5110.h"
- char t=0,t1=0;
- /***********TA初始化*********/
- void init_TA()
- {
- TACCTL0 = CCIE; // TACCR0 interrupt enabled
- TACCR0 = 50150;
- TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
- }
- /************ADC10初始化************/
- void init_ADC10()
- {
- ADC10CTL0 = ADC10SHT_3 + ADC10ON + ADC10IE; // /* 4 x ADC10CLKs */ /* ADC10 On/Enable */
- /* ADC10 Sampling Rate 0:200ksps / 1:50ksps */
- ADC10AE0 |= 0x01; // P2.0 ADC option select
- }
- main()
- {
- WDTCTL = WDTPW + WDTHOLD;
- DCOCTL=CALDCO_1MHZ;
- BCSCTL1=CALBC1_1MHZ;
- LCD_init(); //初始化LCD模塊
- LCD_clear(); //清屏幕
- init_TA();
- Port_Init1();
- init_ADC10();
- __bis_SR_register(GIE);
- P1OUT&=0XfF;
- timedisplay();
- while(1)
- { if(t==0)
- {
- locktime();
- timedisplay1();
- }
- Red_Code();
-
- if(t1==0)
- {
- LCD_init(); //初始化LCD模塊
- LCD_clear(); //清屏幕
- Port_Init1();
- timedisplay();
- datado();
- }
- }
- }
- #pragma vector = ADC10_VECTOR //ADC10中斷服務
- __interrupt void adc_isr(void)
- {
- ad_value=ADC10MEM; //將AD采樣值存入ad_value
-
- }
- #pragma vector=TIMER0_A0_VECTOR
- __interrupt void Timer_A (void)
- {
- if(++t==20) //每隔1s計數一次,雖然沒有專門的時鐘芯片準確,但可以用
- {
- t=0;
- timechange();
- if(++t1==120)
- {t1=0;
- }
- }
- }
- // wenben.h
- //顯示字幕數據庫
- unsigned char zimu[]={
- 0xF0,0x08,0x08,0x18,0xE0,0x00,0x1F,0x20,0x20,0x30,0x0F,0x00,/*"0",0*/
- 0x00,0x10,0xF8,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,/*"1",1*/
- 0x70,0x08,0x08,0x08,0xF0,0x00,0x30,0x2C,0x22,0x21,0x30,0x00,/*"2",2*/
- 0x30,0x08,0x88,0x88,0x70,0x00,0x18,0x20,0x20,0x31,0x1E,0x00,/*"3",3*/
- 0x00,0x80,0x60,0xF0,0x00,0x00,0x06,0x05,0x24,0x3F,0x24,0x04,/*"4",4*/
- 0xF8,0x08,0x88,0x88,0x08,0x00,0x19,0x21,0x20,0x31,0x1F,0x00,/*"5",5*/
- 0xE0,0x18,0x88,0x98,0x00,0x00,0x0F,0x31,0x20,0x20,0x1F,0x00,/*"6",6*/
- 0x38,0x08,0x08,0xE8,0x18,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,/*"7",7*/
- 0x70,0x88,0x08,0x88,0x70,0x00,0x1E,0x21,0x21,0x21,0x1E,0x00,/*"8",8*/
- 0xF0,0x08,0x08,0x18,0xE0,0x00,0x01,0x32,0x22,0x31,0x0F,0x00,/*"9",9*/
- 0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,/*":",10*/
- 0x80,0x80,0x00,0x80,0x80,0x00,0x20,0x3F,0x21,0x00,0x3F,0x20,/*"n",11*/
- 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x3D,0x26,0x22,0x3F,0x20,/*"a",12*/
- 0x80,0x80,0x00,0x00,0x80,0x80,0x00,0x07,0x38,0x1C,0x03,0x00,/*"v",13*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,/*".",14*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/
- 0xF0,0x98,0x60,0xE0,0x38,0x00,0x00,0x31,0x0E,0x1F,0x33,0x0C,/*"%",16*/
- 0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,/*"!",17*/
- 0xF0,0x10,0x08,0x08,0x18,0x00,0x1F,0x20,0x20,0x20,0x10,0x00,/*"C",18*/
- 0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00,//0,19//
- 0x08,0xF8,0x88,0xE8,0x18,0x00,0x20,0x3F,0x20,0x03,0x00,0x00,/*"F",20*/
- 0x00,0x00,0xF0,0x00,0x00,0x00,0x01,0x01,0x1F,0x01,0x01,0x00,/*"+",21*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,/*"-",22*/
- 0x40,0x80,0xF0,0x80,0x40,0x00,0x02,0x01,0x0F,0x01,0x02,0x00,/*"*",23*/
- 0x00,0x00,0x80,0x70,0x0C,0x00,0x60,0x1C,0x03,0x00,0x00,0x00,/*"/",24*/
- 0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x23,0x00,/*"e",25*/
- 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x1F,0x20,0xA0,0xFF,0x80,/*"q",26*/
- 0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x00,/*"=",27*/
- 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x23,0x24,0x24,0x39,0x00,/*"s",28*/
- 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0xFF,0xA0,0x20,0x1F,0x00,/*"p",29*/
- };
- unsigned char hanzi[]=
- {
- /*-- 文字: 溫 --*/
- /*-- 宋體9; 此字體下對應的點陣為:寬x高=12x12 --*/
- /*-- 高度不是8的倍數,現調整為:寬度x高度=12x16 --*/
- 0x22,0x44,0x00,0xC0,0x5F,0xD5,0x55,0xD5,0x5F,0xC0,0x00,0x00,0x04,0x02,0x09,0x0F,
- 0x08,0x0F,0x08,0x0F,0x08,0x0F,0x08,0x00,
- /*-- 文字: 度 --*/
- /*-- 宋體9; 此字體下對應的點陣為:寬x高=12x12 --*/
- /*-- 高度不是8的倍數,現調整為:寬度x高度=12x16 --*/
- 0x00,0xFE,0x0A,0x8A,0xBE,0xAA,0xAB,0xAA,0xBE,0x8A,0x0A,0x00,0x08,0x07,0x00,0x08,
- 0x09,0x0A,0x04,0x04,0x0A,0x09,0x08,0x00,
- /*-- 文字: 華 --*/
- /*-- 宋體9; 此字體下對應的點陣為:寬x高=12x12 --*/
- /*-- 高度不是8的倍數,現調整為:寬度x高度=12x16 --*/
- 0x10,0x08,0x7C,0x03,0x10,0x90,0x3F,0x48,0x44,0x42,0x70,0x00,0x01,0x01,0x01,0x01,
- 0x01,0x0F,0x01,0x01,0x01,0x01,0x01,0x00,
- /*-- 文字: 氏 --*/
- /*-- 宋體9; 此字體下對應的點陣為:寬x高=12x12 --*/
- /*-- 高度不是8的倍數,現調整為:寬度x高度=12x16 --*/
- 0x00,0xFE,0x22,0x22,0x22,0x22,0x7E,0xA1,0x21,0x21,0x20,0x00,0x00,0x0F,0x04,0x02,
- 0x00,0x00,0x00,0x01,0x02,0x04,0x0F,0x00,
- 0x00,0x7C,0xC4,0x44,0x7C,0x00,0xFC,0x44,0x44,0xC4,0x04,0x00,0x00,0x3F,0x3F,0x22,
- 0x11,0x00,0x7F,0x44,0x44,0x43,0x20,0x00,/*"距",4*/
- 0x00,0x00,0xF8,0x08,0x58,0x2A,0x3C,0x48,0xE8,0x18,0x04,0x00,0x00,0x7C,0x03,0x13,
- 0x1F,0x13,0x13,0x2B,0x53,0x7E,0x02,0x00,/*"離",5*/
- };
- // 5110屏幕的庫文件
- #define res1 P2OUT|=BIT0; //片選
- #define res0 P2OUT&=~BIT0; //片選
- #define sce1 P2OUT|=BIT1; //復位,0復位
- #define sce0 P2OUT&=~BIT1;
- #define dc1 P2OUT|=BIT2; //1寫數據,0寫指令
- #define dc0 P2OUT&=~BIT2;
- #define sdin1 P2OUT|=BIT3; //數據
- #define sdin0 P2OUT&=~BIT3;
- #define sclk1 P2OUT|=BIT4; //時鐘
- #define sclk0 P2OUT&=~BIT4;
- #define led0 P1OUT&=~BIT6;
- #define led1 P1OUT&=BIT6;
- #define buzz0 P1OUT&=~BIT7;
- #define buzz1 P1OUT&=BIT7;
- #define CPU_F ((double)1000000)
- #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
- #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
- #define uchar unsigned char
- #define uint unsignded int
- #define ulong unsignded long
- #include <math.h>
- /*--------------------------------------------
- LCD_write_byte: 使用SPI接口寫數據到LCD
- 輸入參數:dt:寫入的數據;
- command :寫數據/命令選擇;
- 編寫日期:20080918
- ----------------------------------------------*/
- void LCD_write_byte(unsigned char dt, unsigned char command)
- {
- unsigned char i;
- sce0;
- if(command==1)
- {dc1; }
- else {dc0;}
- for(i=0;i<8;i++)
- {
- if(dt&0x80)
- {sdin1;}
- else
- {sdin0;}
- dt=dt<<1;
- sclk0;
- sclk1;
- }
- dc1;
- sce1;
- sdin1;
- }
- /*---------------------------------------
- LCD_init: 3310LCD初始化
- 編寫日期:20080918
- ----------------------------------------- */
- void LCD_init(void)
- { P2DIR=0Xff;
- P1DIR=0Xff;
- P1OUT=0XFF;
- res0;
- res1;
- LCD_write_byte(0x21,0);//初始化Lcd,功能設定使用擴充指令
- LCD_write_byte(0xd0,0);//設定液晶偏置電壓
- LCD_write_byte(0x20,0);//使用基本指令
- LCD_write_byte(0x0C,0);//設定顯示模式,正常顯示
- }
- /*-------------------------------------------
- LCD_set_XY: 設置LCD坐標函數
- 輸入參數:X:0-83 Y:0-5
- 編寫日期:20080918
- ---------------------------------------------*/
- void LCD_set_XY(unsigned char X, unsigned char Y)
- {
- LCD_write_byte(0x40 | Y, 0);// column
- LCD_write_byte(0x80 | X, 0);// row
- }
- /*------------------------------------------
- LCD_clear: LCD清屏函數
- 編寫日期:20080918
- --------------------------------------------*/
- void LCD_clear(void)
- {
- unsigned char t;
- unsigned char k;
- LCD_set_XY(0,0);
- for(t=0;t<6;t++)
- {
- for(k=0;k<84;k++)
- {
- LCD_write_byte(0x00,1);
- }
- }
- }
- /*---------------------------------------------
- LCD_write_shu: 顯示8(寬)*16(高)點陣列數字字母符號等半角類
- 輸入參數:c:顯示的字符;
- 編寫日期:20080918
- -----------------------------------------------*/
- void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:頁 dd:字符
- {
- unsigned char i;
- LCD_set_XY(row*6, page);// 列,頁
- for(i=0; i<6;i++)
- {
- LCD_write_byte(zimu[c*12+i],1);
- }
- LCD_set_XY(row*6, page+1);// 列,頁
- for(i=6; i<12;i++)
- {
- LCD_write_byte(zimu[c*12+i],1);
- }
- }
- void LCD_write_str(unsigned char row,unsigned char page,unsigned char *s)
- {
- while (*s)
- {
- void LCD_write_shu(unsigned char row,unsigned char page,unsigned char s);
- s++;
- row++;
- }
- }
- //定義全局變量,設置7個鬧鐘,一個時鐘
- char flag1;
- uchar flag2=0;
- int nian=2015;
- char time[6]={0,0,0,1,1,0},set=5;
- uchar yue[12]={31,28,31,30,31,30,31,31,30,30,31};
- char lock[7][3],lockset=3,lockge;
- char displaytime[6];
- int displaynian;
- uchar oclock[7];
- uchar oclockon;
- //每隔一秒會顯示在屏幕上
- void timechange(void)
- {uchar i;
- {
- for(i=0;i<6;i++)
- displaytime[i]=time[i];
- displaynian=nian;
- }
- if(++time[0]>=60)
- {time[0]=0;
- if(++time[1]>=60)
- {time[1]=0;
- if(++time[2]>=24)
- {time[2]=0;
- if(++time[3]==yue[time[4]-1]+1)
- {time[3]=1;
- if(++time[4]>=13)
- {time[4]=1;
- nian++;
- }
- }
- }
- }
- }
- }
- //定時與當前時間相同,鬧鐘響起來
- void locktime()
- { P1OUT=0X8F;
- uchar i;
- for(i=0;i<7;i++)
- {
- if(time[2]==lock[i][2])
- {
- if(time[1]==lock[i][1])
- {
- if(oclock[i]==1)
- {
- P1OUT=0X7F;
- LCD_write_shu(2,2,i);
- oclockon=i;
- }
- }
- }
- }
- }
- void lockdisplay(void)
- {uchar j;
- if(flag1==1)
- {
- for(j=0;j<2;j++)
- if(lock[lockge][j]>=60) lock[lockge][j]=0;
- if(lock[lockge][2]>=24) lock[lockge][2]=0;
- LCD_write_shu(0,0,19);//
-
- {
- LCD_write_shu(4,2,lock[lockge][2]/10);//c
- LCD_write_shu(5,2,lock[lockge][2]%10);//o
- LCD_write_shu(6,2,10);//.
- }
-
- {
- LCD_write_shu(7,2,lock[lockge][1]/10);//e
- LCD_write_shu(8,2,lock[lockge][1]%10);//d
- LCD_write_shu(9,2,10);//f
- }
- {
- LCD_write_shu(10,2,lock[lockge][0]/10);//.
- LCD_write_shu(11,2,lock[lockge][0]%10);//c
- }
- }
-
- }
- //顯示當前時間 完全
- void timedisplay(void)
- {uchar i;
- for(i=0;i<2;i++)
- if(time[i]>=60|time[i]<=0) time[i]=0;
- if(time[2]>=24|time[2]<=0)time[2]=0;
- if(time[3]>yue[time[4]-1]|time[3]<=0)time[3]=1;
- if(time[4]>12|time[4]<=0)time[4]=1;
-
- {
- LCD_write_shu(2,0,nian/1000);//
- LCD_write_shu(3,0,nian%1000/100);//
- LCD_write_shu(4,0,nian%100/10);//c
- LCD_write_shu(5,0,nian%10);//o
- }
- LCD_write_shu(6,0,15);//.
- LCD_write_shu(7,0,time[4]/10);//e
- LCD_write_shu(8,0,time[4]%10);//d
- LCD_write_shu(9,0,15);//f
- LCD_write_shu(10,0,time[3]/10);//.
- LCD_write_shu(11,0,time[3]%10);//c
- // LCD_write_shu(12,0,15);//n*/
- LCD_write_shu(4,2,time[2]/10);//c
- LCD_write_shu(5,2,time[2]%10);//o
- LCD_write_shu(6,2,10);//.
- LCD_write_shu(7,2,time[1]/10);//e
- LCD_write_shu(8,2,time[1]%10);//d
- LCD_write_shu(9,2,10);//f
- LCD_write_shu(10,2,time[0]/10);//.
- LCD_write_shu(11,2,time[0]%10);//c
- // LCD_write_shu(12,2,15);//n*/
-
- {//進行年月日判斷
- if(nian%4 !=0) time[5]=0;
- else if(nian%400==0) time[5]=0;
- else if(nian%4==0) time[5]=1;
- if(time[5]==1)yue[1]=29;
- if(time[5]==0)yue[1]=28;
-
- }
- }
- //x顯示當前時間部分
- void timedisplay1(void)
- { uchar i;
- if(flag1==0)
- {
- for(i=0;i<2;i++)
- if(time[i]>=60|time[i]<=0) time[i]=0;
- if(time[2]>=24|time[2]==0)time[2]=0;
- if(time[3]>yue[time[4]-1]|time[3]<=0)time[3]=1;
- if(time[4]>12|time[4]<=0)time[4]=1;
- if(displaynian!=nian)
- {
- LCD_write_shu(2,0,nian/1000);//
- LCD_write_shu(3,0,nian%1000/100);//
- LCD_write_shu(4,0,nian%100/10);//c
- LCD_write_shu(5,0,nian%10);//o
- }
- if(displaytime[4]!=time[4])
- {
- LCD_write_shu(6,0,15);//.
- LCD_write_shu(7,0,time[4]/10);//e
- LCD_write_shu(8,0,time[4]%10);//d
- LCD_write_shu(9,0,15);//f
- }
- if(displaytime[3]!=time[3])
- {
- LCD_write_shu(10,0,time[3]/10);//.
- LCD_write_shu(11,0,time[3]%10);//c
- // LCD_write_shu(12,0,15);//n*/
- }
-
- {
- LCD_write_shu(4,2,time[2]/10);//c
- LCD_write_shu(5,2,time[2]%10);//o
- LCD_write_shu(6,2,10);//.
- }
-
- {
- LCD_write_shu(7,2,time[1]/10);//e
- LCD_write_shu(8,2,time[1]%10);//d
- LCD_write_shu(9,2,10);//f
- }
-
- {
- LCD_write_shu(10,2,time[0]/10);//.
- LCD_write_shu(11,2,time[0]%10);//c
- // LCD_write_shu(12,2,15);//n*/
- }
-
- }
- }
- //紅外遙控模塊,通過按紅外遙控,修改時間或者鬧鐘,或者顯示當前溫度
- #define KEY_0 0x16 //鍵0
- #define KEY_1 0x0C //鍵1
- #define KEY_2 0x18 //鍵2
- #define KEY_3 0x5E //鍵3
- #define KEY_4 0x08 //鍵4
- #define KEY_5 0x1C //鍵5
- #define KEY_6 0x5A //鍵6
- #define KEY_7 0x42 //鍵7
- #define KEY_8 0x52 //鍵8
- #define KEY_9 0x4A //鍵9
- #define prex 0x44 //電源
- #define nex 0x40 //模式
- #define play_pause 0x43 //靜音
- #define ch_ 0x45 //模式
- #define ch 0x46
- #define cha 0x47 //模式
- #define __ 0x07
- #define _a 0x15
- #define eq 0x09
- #define _100a 0x19
- #define _200a 0x0d
- //紅外接收頭H1838控制腳,單腳控制
- #define RED_IN P1DIR &= ~BIT3 //設置輸入,紅外接收頭接單片機PE3口
- #define RED_OUT P1DIR |= BIT3 //設置輸出
- #define RED_L P1OUT &= ~BIT3 //置低電平
- #define RED_H P1OUT |= BIT3 //置高電平
- #define RED_R (P1IN & BIT3) //讀電平
- uchar KEY_VAL=0;
- uchar code_value=0;
- uchar key_code[4];
- int ad_value;
- //溫度顯示,計算100次,誤差較小
- void datado()
- { long int advalue=0;
- uchar i;
- int IntDegC, IntDegF ;
- for(i=0;i<100;i++)
- {
- ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
- advalue=advalue+ad_value;
- ADC10CTL0 |= ~(ENC + ADC10SC);
- }
- ad_value=(advalue/100);
- IntDegF = ((ad_value - 630) * 761) / 1024;
- IntDegC = ((ad_value - 673) * 423) / 1024;
- if(IntDegC>0)
- LCD_write_shu(1,4,15);
- if(IntDegC<=0)
- {
- IntDegC=-IntDegC;
- LCD_write_shu(1,4,22);
- }
- LCD_write_shu(2,4,IntDegC /10);//
- LCD_write_shu(3,4,IntDegC%10);//
- LCD_write_shu(4,4,18);//c
- LCD_write_shu(5,4,19);//o
- LCD_write_shu(6,4,15);//.
-
- if(IntDegF>0)
- LCD_write_shu(1,4,15);
- if(IntDegF<=0)
- {
- IntDegF=-IntDegF;
- LCD_write_shu(6,4,22);
- }
- LCD_write_shu(7,4,IntDegF/10);//e
- LCD_write_shu(8,4,IntDegF%10);//d
- LCD_write_shu(9,4,20);//f
-
-
-
- }
- //***********************************************************************
- // MSP430IO口初始化
- //***********************************************************************
- void Port_Init1()
- {
- // LED8DIR = 0xFF; //設置IO口方向為輸出
- // LED8 = 0xFF; //P2口初始設置為FF
-
- RED_L;
- RED_IN;
- }
- void switchoclock()
- {
- switch(oclock[lockge])
- {
- case 0:oclock[lockge]=1;LCD_write_shu(0,2,28);break;
- case 1:oclock[lockge]=0;LCD_write_shu(0,2,18);break;
- default:break;
- }
- }
- void setlockortime(void)
- {
-
- if(flag1==0)
- {
- switch(KEY_VAL)
- {
- default:break;
- case '/':++set;if(set>=7) set=1;break;
- case '*':++time[set-1];break;
- }
- if(set==6&KEY_VAL=='+')++nian;
- if(set==6&KEY_VAL=='-')--nian;
- LCD_write_shu(13,2,set);
- timedisplay();
- }
-
- if(flag1==1)
- {
- switch(KEY_VAL)
- {
- default:break;
- case '/':++lockset;if(lockset>=4) lockset=1;break;
- case '*':++lock[lockge][lockset-1];break;
- case 0x40:++lockge;if(lockge>=7)lockge=0;break;
- case 0x44:switchoclock();break;
- }
- lockdisplay();
- LCD_write_shu(13,2,lockset);
- LCD_write_shu(13,0,lockge);
- }
- if(KEY_VAL>0&KEY_VAL<=9)
- {
- switch(oclock[oclockon])
- {
- default:break;
- case 0:oclock[oclockon]=1;break;
- case 1:oclock[oclockon]=0;break;
- }
- }
-
- }
- void startit(void)
- {
- switch(flag1)
- {
- case 0:flag1=1;;break;
- case 1:flag1=0;break;
- default:break;
- }
- }
- //*************************************************************************
- // 遙控器鍵值賦功能值子程序
- //*************************************************************************
- void Key_Icode(void)
- {
- {
- LCD_write_shu(13,2,15);
- LCD_write_shu(0,0,15);
- LCD_write_shu(12,4,15);
- LCD_write_shu(2,2,15);
- LCD_write_shu(13,0,15);
- LCD_write_shu(0,2,15);
- LCD_write_shu(12,2,15);
- LCD_write_shu(2,2,15);
- }
- KEY_VAL=' ';
- switch(key_code[2]) //第3個字節是數據,第4個字節是反碼
- { //為了更穩定,可以加上第4個字節數據的判斷
- case KEY_0:KEY_VAL=0; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_1:KEY_VAL=1; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_2:KEY_VAL=2; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_3:KEY_VAL=3; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_4:KEY_VAL=4; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_5:KEY_VAL=5; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_6:KEY_VAL=6; LCD_write_shu(13,4,KEY_VAL); ;break;
- case KEY_7:KEY_VAL=7; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_8:KEY_VAL=8; LCD_write_shu(13,4,KEY_VAL); break;
- case KEY_9:KEY_VAL=9; LCD_write_shu(13,4,KEY_VAL); break;
- case prex: KEY_VAL=0x44; datado();
- LCD_write_shu(12,4,29);
- LCD_write_shu(13,4,25);
- break;
- case nex :KEY_VAL=0x40;LCD_write_shu(12,4,11);
- LCD_write_shu(13,4,25);
- break;
- case play_pause: datado();
- KEY_VAL=0x43;
- LCD_write_shu(12,4,28);
- LCD_write_shu(13,4,29);break;
- case ch_:KEY_VAL='/';LCD_write_shu(13,4,24); break;
- case ch: KEY_VAL='='; LCD_init(); //初始化LCD模塊
- LCD_clear(); //清屏幕
- Port_Init1();
- P1OUT&=0XfF;
- break;
- case cha:KEY_VAL='*';LCD_write_shu(13,4,23);break;
- case eq: startit();break;
- case _a:KEY_VAL='+';LCD_write_shu(13,4,21);;break;
- case __:KEY_VAL='-';LCD_write_shu(13,4,22);;break;
- case _100a:KEY_VAL=0xa2;LCD_write_shu(12,4,1);
- LCD_write_shu(13,4,21); break;
- case _200a:KEY_VAL=0xa3;LCD_write_shu(12,4,2);
- LCD_write_shu(13,4,21); break;
- default:KEY_VAL=10;break;
- }
- setlockortime();
-
- }
- //*************************************************************************
- // 遙控器解碼子程序
- //*************************************************************************
- void Red_Code()
- {
- uchar i,j,k = 0;
- for(i = 0;i < 19;i++)
- {
- delay_us(400); //延時400us
- if(RED_R) //9ms內有高電平,則判斷為干擾,退出處理程序
- {
- return;
- }
- }
- while(!RED_R); //等待9ms低電平過去
- for(i=0;i<5;i++) //是否連發碼
- {
- delay_us(500);
- if(!RED_R)
- {
- return;
- }
- }
- while(RED_R); //等待4.5ms高電平過去
- for(i = 0;i < 4;i++) //接收4個字節的數據
- {
- for(j = 0;j < 8;j++) //每個字節的數據8位
- {
-
- while(!RED_R); //等待變高電平
- while(RED_R) //計算高電平時間
- {
- delay_us(100);
- k++;
- if(k >22) //高電平時間過長,則退出處理程序
- {
- return;
- }
-
- }
- code_value>>=1; //接受一位數據
- if(k >= 7)
- {
- code_value|=0x80; //高電平時間大于0.56,則為數據1
- }
- k = 0; //計時清零
- }
- key_code[i]=code_value; //四個字節的數據
- }
- Key_Icode(); //調用賦值函數
- // Display_Key(KEY_VAL); //顯示按鍵值
-
- // delay_ms(5);
- }
復制代碼
|