昂宝电子-台湾新茂-OB38R08T1基于KEIL5的3按键触摸倒计时例程
单片机源程序如下:
- #include "OB38R08T1.h"
- #define SEGA P0_4
- #define SEGB P0_6
- #define SEGC P1_6
- #define SEGD P3_1
- #define SEGE P1_7
- #define SEGF P0_7
- #define SEGG P1_5
- #define COM1 P1_1
- #define COM2 P1_4
- #define DR P1_0
- const unsigned char LED7Code[]={
- 0xfc, // 0
- 0x50, // 1
- 0xea, // 2
- 0xae, // 3
- 0x1e, // 4
- 0xb6, // 5
- 0xf6, // 6
- 0x2c, // 7
- 0xfe, // 8
- 0xbe, // 9
- 0x00 // mie
- };
- #define TIMER0_VECTOR 1 //TIMER0 Interrupt Vevtor
- #define d_T0MOD 0x01 //TMOD[3:0] TIMER0 Mode setting
- #define d_T1MOD 0x00 //TMOD[7:4] TIMER1 Mode setting
- #define ET2 0x00 //TIMER2 overflow Interrupt Enable (Default 0 Disable)
- #define ET1 0x00 //TIMER1 overflow Interrupt Enable (Default 0 Disable)
- #define ET0 0x01 //TIMER0 overflow Interrupt Enable (Default 0 Disable)
- #define d_MODEVALUE_T0 65536 //MODE1 16bit 65536
- #define d_RELOADVALUE_T0 2000 //User Define Reload Value 1.5mS
- bit Key_mode_flag;
- bit ledcom_cnt,Dr_Flag1,Dr_Flag2,Dr_Flag3,Key_Fist;
- bit seg1,seg2,seg3,seg4,seg5,seg6,seg7;
- unsigned char TK_cnut,seg,LEDNum,TK_Num,TK_Stat,mode;
- unsigned int Key_Cnt,i;
- void TIMER0_initialize(void) //Initialize TIMER0
- {
- IEN0 |= (ET2<<5)|(ET1<<3)|(ET0<<1); //IE=IEN0 = 0x02;
- TMOD = (d_T1MOD<<4)|(d_T0MOD);
- TH0 = (d_MODEVALUE_T0-d_RELOADVALUE_T0)/256; //MODE1 16bit 65536
- TL0 = (d_MODEVALUE_T0-d_RELOADVALUE_T0)%256;
- //TR0 = 1; //Timer0 Start bit
- PFCON = 0X00;// FOSC/12
- }
- void InitIO(void)
- {
- P0M0 = 0XFF; //TUI WAN
- P0M1 = 0X00;
- P1M0 = 0XFF;
- P1M1 = 0X00;
- P2M0 = 0X00; //
- P2M1 = 0X00;
- P3M0 = 0X02; //
- P3M1 = 0X00;
- P0 = 0XEE;
- P1 = 0XFF;
- }
- //========================================================================================================
- // Command Read Format:
- // Start -> Slave(W) -> Ack -> Command -> Ack ->
- // Re-Start -> Slave(R) -> Ack -> 0x00 -> Ack -> TKSTATUS1 -> Ack -> TKSTATUS0 -> NAck -> Stop
- //
- // Touch Slave(W) Address = 0x60
- // Touch Slave(R) Address = 0x61
- // Read Key Status Command Number = 0x17
- //
- // [Master Example]
- // Start -> 0x60(W) -> Ack -> 0x17 -> Ack ->
- // Re-Start -> 0x61(R) -> Ack -> 0x00 -> Ack -> TKSTATUS1 -> Ack -> TKSTATUS0 -> NAck -> Stop
- //========================================================================================================
- void TOUCH_ISR(void) interrupt d_TK_Vector using 1
- {
- EA = 0;
- ((void(code*)(void))0x209B)(); //Touch ISR Function
- EA = 1;
- }
- void IIC_ISR(void) interrupt d_IIC_Vector using 2
- {
- EA = 0;
- ((void(code*)(void))0x206B)(); //IIC ISR Function
- EA = 1;
- }
- void WDT_ISR(void) interrupt d_WDT_Vector
- {
- ((void(code*)(void))0x208B)(); //WDT ISR Function
- }
- /***************************************************
- ;*
- ;* Function Name: ???????
- ;* Inputs:
- ;* Returns:
- ;* Description:
- ;*
- ;***************************************************/
- void Test_led(void)
- {
-
-
- seg1 = seg&0x80;
- seg2 = seg&0x40;
- seg3 = seg&0x20;
- seg4 = seg&0x10;
- seg5 = seg&0x08;
- seg6 = seg&0x04;
- seg7 = seg&0x02;
-
- if(seg1) SEGA=1;
- else SEGA=0;
- if(seg2) SEGB=1;
- else SEGB=0;
- if(seg3) SEGC=1;
- else SEGC=0;
- if(seg4) SEGD=1;
- else SEGD=0;
- if(seg5) SEGE=1;
- else SEGE=0;
- if(seg6) SEGF=1;
- else SEGF=0;
- if(seg7) SEGG=1;
- else SEGG=0;
- }
- void led_display_drive(void)
- {
- COM1 = 1;
- COM2 = 1;
- if (ledcom_cnt==0)
- {
- seg = LED7Code[LEDNum%10];
- // if(seg==0) seg = LED7Code[11];
- Test_led();
- COM1 = 0;
- COM2 = 1;
- ledcom_cnt = 1;
- }
- else if (ledcom_cnt==1)
- {
- seg = LED7Code[LEDNum/10];
- Test_led();
- COM1 = 1;
- COM2 = 0;
- ledcom_cnt = 0;
- }
- }
- void main(void)
- {
- InitIO();
- TIMER0_initialize();
- TR0 = 1;
- // TR1 = 1;
- EA = 1;
-
- // ((void(code*)(unsigned char))0x2002)(0x00); //Select IIC interface for P2.5 & P2.6
- ((void(code*)(void))0x2005)(); //Touch initial
- LVC=0x00;
- while(1)
- {
- ((void(code*)(unsigned char))0x2008)(0x28); //Touch Normal Run
-
- TK_Stat = TKSTATUS1;
- if(TK_Stat==0)
- {
- TK_cnut = 0x55;
- TK_Num = 0;
-
- }
- else if(TK_cnut==0x55)
- {
- if(TK_Num++>50)
- {
- if(TK_Num>51) TK_Num = 51;
- }
- else
- {
- if(TK_Num==51)
- {
- TK_Num = 0;
- Key_Cnt = 0;
- TK_cnut = 0xaa;
- if((TK_Stat&0X10)==0x10)//左上键
- {
- LEDNum = 90;
- i = 0;
- if(Dr_Flag3==0)
- {
- Dr_Flag3 = 1;
- DR = 1;
- }
- else
- {
- Dr_Flag3 = 0;
- DR = 0;
- }
- }
- else if((TK_Stat&0X20)==0x20)//中间键
- {
- LEDNum = 60;
- i = 0;
- if(Dr_Flag2==0)
- {
- Dr_Flag2 = 1;
- DR = 1;
- }
- else
- {
- Dr_Flag2 = 0;
- DR = 0;
- }
- }
- else if((TK_Stat&0X40)==0x40)
- {
- LEDNum = 30;
- i = 0;
- if(Dr_Flag1==0)
- {
- Dr_Flag1 = 1;
- DR = 1;
- }
- else
- {
- Dr_Flag1 = 0;
- DR = 0;
- }
- }
- }
- }
- }
-
-
-
- if((P3_0==0)&&(Key_mode_flag==1))//自锁按键
- {
- Key_Cnt++;
- if(Key_Cnt>200)
- {
- Key_Cnt = 201;
- if(Key_Fist==0)
- {
- LEDNum = 99;
- i = 0;
- DR = 1;
- Key_Fist = 1;
- }
- }
- }
- else
- {
- if(Key_Cnt==201)
- {
- DR = 0;
- LEDNum = 0;
- Key_Fist = 0;
- }
- Key_Cnt = 0;
-
-
- if(LEDNum==0)
- {
- Key_mode_flag = 1;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
触摸例程.rar
(39.96 KB, 下载次数: 28)
|