2008年10月31日 星期五

C語言練習3

MPC82G516, 82E54是台灣笙泉的8x51MCU,一直以來我都用它來作老闆要的東西
我覺得很好用喔
#include "REG_MPC82G516.h" //for MPC82G516 SFR definition               
//雖是選MPC82G516但是實上,ic是82E54
#include "INTRINS.H" //
unsigned char COMM;
unsigned char Data_1,Data_2;
sbit LCD_E = P3^7 ;
sbit LCD_RS = P3^4 ;
sbit LCD_RW = P3^5 ;
// ***********************************************
void LCD_S_Delay(void)
{
int S_Loop ;
int Null_Var ;
for ( S_Loop = 0 ; S_Loop < 200 ; S_Loop ++ )
Null_Var += 1 ;
}
// **********************************************
void LCD_L_Delay(void)
{
int L_Loop ;
for ( L_Loop = 0 ; L_Loop < 100 ; L_Loop ++ )
LCD_S_Delay( ) ;
}
//***********************************************
// Subroutine to
// Write a command to LCD module

// RS=0, R/W=0, E=H->L F(alling Edge)

// 寫入指令到lcd

void LCD_CMD_W_Timing( void )
{
LCD_RS = 0 ; // Set for Command Input
_nop_();
LCD_RW = 0 ;
_nop_();
LCD_E = 1 ;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E = 0 ;
}
//***********************************************
// Subroutine to
// Write a command to LCD module
// RS=1, R/W=0, E=H->L F(alling Edge)
// 寫入資料到lcd
void LCD_DAT_W_Timing( void )

{ LCD_RS = 1 ; // Set for Data Input
_nop_();
LCD_RW = 0 ;
_nop_();
LCD_E = 1 ;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E = 0 ;
}
LCD_RESET(void) // 初始化lcd(16*02)
{
P3 = 0x03;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
P3 = 0x03;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
//-----------------------------------------------
P3 = 0x03;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x02;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-------------------------------------------------
P3=0x01;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x04;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//--------------------------------------------------
P3=0x00;
LCD_CMD_W_Timing() ;
// LCD Function SET

LCD_L_Delay() ;
P3=0x0f;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-----------------------------------------------------
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x02;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-------------------------------------------------------
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x01;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-----------------------------------------------
P3=0x08;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x02;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
}

unsigned int Get_ADC_Channel(char channel)
{ // 82e54一共有8個通道10bit的A TO D
channel &= 0x07 //make sure channel is 0-7
ADCTL = 0x88channel; //start convert
while(!(ADCTL & 0x10)){} //check if convert done
return ((unsigned int)(ADCH<<2) (ADCL & 3));
}

void Output(unsigned char d)
{ // 將所讀到的ad值 轉成ascII 且輸出到lcd
if(d>9 & d<16) Data_1 = (d + 0x37);
else if(d<10) Data_1 = (d + 0x30);
Data_2 = Data_1;
//因為lcd控制是採4bit控制 所以一個byte要送兩次
P3=Data_2>>4;
LCD_DAT_W_Timing();
LCD_S_Delay( );
P3=Data_1&0X0F;
LCD_DAT_W_Timing();
LCD_S_Delay( );
}

main(void)
{
unsigned
int VALUE;
P3=0XFF;
LCD_L_Delay() ;
P1M0=0X0F; // P1 IS ALL INPUT
P1M1=0X00; //
LCD_RESET();
P3=0x08;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
while (1)
{
VALUE=Get_ADC_Channel(7);
Output(VALUE>>8); //顯示最高 nibble
Output((VALUE>>4)&0x0f); //顯示中間 nibble
Output(VALUE&0x0f); //顯示最低 nibble
P3=0x08;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
}
}

2008年10月17日 星期五

C語言練習II

我想C語言要進步,方法之一就是常寫吧
// Function:expender ma09 test for c
// Description:
// Date:2008_10_18 by naga lee
#include "REG_MPC89E58.H"
// io port Description
#define _ONE P24
#define _TWO P27
#define _THREE P26
#define _FOUR P25
#define BIBI P20
#define MA09_CDB P11
#define MA09_SCLK P12
#define MA09_SIN P13
const _7_seg[10]={0x24,0xed,0x15,0x85,0xcc,0x86,0x06,0xe5,0x04,0xc4};
unsigned char scan_cnt=0X00 ;
int time_cnt;
unsigned char _1_sec_cnt=0x15 ;
unsigned char disp_0,disp_1,disp_2,disp_3 ;
unsigned char show_data ;
void Delay_ms(unsigned int dly)
{ unsigned int count;
for (; dly>0;dly--) ;
for (count=0;count<252;count++);}>
// MA09 void RESET_MA09(void)
{ const unsigned char com_code_0 = 0xfe;
const unsigned char com_code_1 = 0xff;
MA09_CDB=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x80) == 0x80 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x40) == 0x40 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x20) == 0x20 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x10 )== 0x10 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x08) == 0x8 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x04) == 0x4 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x02) == 0x2 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_0&0x01) == 0x1 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x80) == 0x80 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x40) == 0x40 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x20) == 0x20 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x10) == 0x10 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x08) == 0x8 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x04) == 0x4 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x02) == 0x2 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
if ( (com_code_1&0x01) == 0x1 ) MA09_SIN=0x01;
else MA09_SIN=0x00;
MA09_SCLK=0x01;
MA09_SCLK=0x00;
// must wait t sec Delay_ms(438);
}
void SET_MA09_ADDR(void)
{
const unsigned char com_code_2=0xfd;
unsigned char com_code_3 = 0x00;
MA09_CDB=0X01;
MA09_SCLK=0X00;
if ( (com_code_2&0x80)== 0x80 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_2&0x40)== 0x40 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_2&0x20)== 0x20 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_2&0x10)== 0x10 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_2&0x08)== 0x8 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_2&0x04)== 0x4 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_2&0x02)== 0x2 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_2&0x01)== 0x1 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
//------------- write address data
MA09_CDB=0X00;
MA09_SCLK = 0X00;
if ( (com_code_3&0x80)== 0x80 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_3&0x40)== 0x40 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_3&0x20)== 0x20 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_3&0x10)== 0x10 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_3&0x08)== 0x8 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_3&0x04)== 0x4 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_3&0x02)== 0x2 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (com_code_3&0x01)== 0x1 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
}
void LOOP_DATA(unsigned char out_data)
{
MA09_CDB = 0X00;
MA09_SCLK = 0X00;
if ( (out_data&0x80)== 0x80 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_data&0x40)== 0x40 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_data&0x20)== 0x20 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_data&0x10)== 0x10 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_data&0x08)== 0x8 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_data&0x04)== 0x4 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_data&0x02)== 0x2 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_data&0x01)== 0x1 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
}
void LOOP_CMD(unsigned char out_cmd)
{
MA09_CDB = 0X01;
MA09_SCLK=0X00;
if ( (out_cmd&0x80)== 0x80 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_cmd&0x40)== 0x40 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_cmd&0x20)== 0x20 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_cmd&0x10)== 0x10 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_cmd&0x08)== 0x8 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_cmd&0x04)== 0x4 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_cmd&0x02)== 0x2 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
if ( (out_cmd&0x01)== 0x1 ) MA09_SIN = 0X01;
else MA09_SIN = 0X00;
MA09_SCLK = 0X01;
MA09_SCLK = 0X00;
}
void Init_IRQ()
{ // ET0 = 0x01; //Enable Timer Interrupt 0
ET1 = 0x01; //Enable Timer Interrupt 1
ET2 = 0x01; //Enable Timer Interrupt 2
TMOD = 0X10 ;
TH1 = 0X3C ;
TL1 = 0XB0 ;
T2CON = 0X00 ;
RCAP2H = 0XF0 ;
RCAP2L = 0XA8 ;
EA = 0x01 ; //Enable All Interrupt
TR1 = 0X01 ; //START TIMER1
T2CON = 0X04 ; //START TIMER2
}
void Timer_Interrupt_1() interrupt 3
{
_1_sec_cnt -- ;
if (_1_sec_cnt==0)
{
time_cnt ++ ;
_1_sec_cnt=0x15 ;
}
// BIBI = !BIBI ;
TH1 = 0X3C ;
TL1 = 0XB0 ;
}
void Timer_Interrupt_2() interrupt 5
{ T2CON &= 0X7F; //CLEAR TIMER2 INT_FLAG
// BIBI = !BIBI ;
if (scan_cnt>3) scan_cnt=0x00;
// 用 switch 就可直接跳到所要執行的部分,且執行完,馬上break跳出
// 和用 if 有明顯不同 須注意
switch(scan_cnt)
{case 0:
LOOP_CMD(0X0E);
LOOP_DATA(0XFF);
// OUT_DATA MA09_P2
LOOP_CMD(0x0F);
LOOP_DATA(0xFF);
// OUT_DATA MA09_P2
show_data = _7_seg[disp_3] ;
LOOP_CMD(0x0F);
LOOP_DATA(show_data);
// OUT_DATA MA09_P1 SCAN_NUMBER
LOOP_CMD(0X0E);
LOOP_DATA(0xbf);
// LOOP_DATA(0xef);
scan_cnt ++ ;
break;
case 1:
LOOP_CMD(0X0E);
LOOP_DATA(0XFF);
// OUT_DATA MA09_P2
LOOP_CMD(0x0F);
LOOP_DATA(0xFF);
// OUT_DATAMA09_P2
show_data = _7_seg[disp_2] ;
LOOP_CMD(0x0F);
LOOP_DATA(show_data);
// OUT_DATAMA09_P1 SCAN_NUMBER
LOOP_CMD(0X0E);
LOOP_DATA(0xdf);
scan_cnt ++ ;
break;
case 2:
LOOP_CMD(0X0E);
LOOP_DATA(0XFF);
// OUT_DATA MA09_P2
LOOP_CMD(0x0F);
LOOP_DATA(0xFF);
// OUT_DATA MA09_P2
show_data = _7_seg[disp_1] ;
LOOP_CMD(0x0F);
LOOP_DATA(show_data);
// OUT_DATA MA09_P1 SCAN_NUMBER
LOOP_CMD(0X0E);
LOOP_DATA(0xef);
// LOOP_DATA(0xbf);
scan_cnt ++ ;
break;
case 3:
LOOP_CMD(0X0E);
LOOP_DATA(0XFF);
// OUT_DATA MA09_P2
LOOP_CMD(0x0F);
LOOP_DATA(0xFF);
// OUT_DATAMA09_P2
show_data = _7_seg[disp_0] ;
LOOP_CMD(0x0F);
LOOP_DATA(show_data);
// OUT_DATA MA09_P1 SCAN_NUMBER
LOOP_CMD(0X0E);
LOOP_DATA(0x7f);
scan_cnt ++ ;
break;
}
}
int main(void)
{
// --- 初始化 ma09 --- Delay_ms(9);
// 延時 MA09_CDB=0X00;
MA09_SCLK=0X00;
MA09_SIN=0X00;
RESET_MA09();
SET_MA09_ADDR();
Delay_ms(9); // 延時
// ******** set_ma009_p2 ***********
LOOP_CMD(0x06);
LOOP_DATA(0x0);
Delay_ms(9); // 延時
// ******* set ma09_p1 *************
LOOP_CMD(0x02);
LOOP_DATA(0x03);
LOOP_CMD(0x05);
LOOP_DATA(0x0);
Delay_ms(9); // 延時
// -------------------
Init_IRQ();
while(1) {
disp_0 = time_cnt % 10 ;
disp_1 = (time_cnt/10)%10 ;
disp_2 = (time_cnt%1000)/100 ;
disp_3 = time_cnt / 1000 ; }
}

2008年10月15日 星期三

C語言練習(8051)



















對我來說 相對的C語言較不熟 所以特別準備板子(muc是笙泉的89E58) 要練習C語 哈哈






PROGRAM_1
// FILE: timer.c
// Function:Init_IRQ()
// Description:
// Date:2008_10_15
#include "REG_MPC89E58.H"
// io port Description
#define _ONE P24
#define _TWO P27
#define _THREE P26
#define _FOUR P25
#define BIBI P20
//const
_7_seg[10]={0x09,0xED,0x2A,0x68,0xCC,0x58,0x18,0xC9,0x08,0xC8};
int time_cnt;
unsigned char _1_sec_cnt=0x14 ;
unsigned char scan_cnt=0X00 ;
unsigned char disp ;
void Init_IRQ(){
// ET0 = 0x01; //Enable Timer Interrupt 0
ET1 = 0x01; //Enable Timer Interrupt 1
ET2 = 0x01; //Enable Timer Interrupt 2

TMOD = 0X10 ;
TH1 = 0X3C ;
TL1 = 0XB0 ;
T2CON = 0X00 ;
RCAP2H = 0XFA ;
RCAP2L = 0X00 ;
EA = 0x01 ; //Enable All Interrupt
TR1 = 0X01 ; //START TIMER1
T2CON = 0X04 ; //START TIMER2 }

void Timer_Interrupt_1() interrupt 3
{ _1_sec_cnt -- ;
if (_1_sec_cnt==0)
{ time_cnt ++ ;
_1_sec_cnt=0x14 ;}
// BIBI = !BIBI ;
TH1 = 0X3C ;
TL1 = 0XB0 ; }
void Timer_Interrupt_2() interrupt 5{
T2CON = T2CON & 0X7F; //CLEAR TIMER2 INT_FLAG
// BIBI = !BIBI ;
if (scan_cnt>3)
{scan_cnt=0x00;}
// 注意 基本上 以下4個IF會依順序 ,往下執行且每次都是如此
// 但程式本意 是希望進入timer2後,馬上去執行,要顯示的位數就馬上離開
// 所以多了每次依順序比較scan_cnt等於多執行了些指令
if (scan_cnt==3)
{ P0=0XFF;
_ONE=0x01;
_TWO=0x01;
_THREE=0X01;
_FOUR=0X00;
disp = time_cnt / 1000 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
}
if (scan_cnt==2)
{ P0=0XFF;
_ONE=0x01;
_TWO=0x01;
_THREE=0X00;
_FOUR=0X01;
disp = (time_cnt%1000)/100 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
}
if (scan_cnt==1)
{ P0=0XFF;
_ONE=0x01;
_TWO=0x00;
_THREE=0X01;
_FOUR=0X01;
disp = (time_cnt/10)%10 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
}
if (scan_cnt==0)
{ P0=0XFF;
_ONE=0x00;
_TWO=0x01;
_THREE=0X01;
_FOUR=0X01;
disp = time_cnt % 10 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
}
}
void Main()
{ Init_IRQ();
while (1) {}
}



另一種寫法
PROGRAM_2
// FILE: timer.c// Function:
// Description:timer IRQ TEST
// Date:2008_10_15
#include "REG_MPC89E58.H"
// io port Description
#define _ONE P24
#define _TWO P27
#define _THREE P26
#define _FOUR P25
#define BIBI P20
//const
_7_seg[10]={0x09,0xED,0x2A,0x68,0xCC,0x58,0x18,0xC9,0x08,0xC8};
int time_cnt;
unsigned char _1_sec_cnt=0x14 ;
unsigned char scan_cnt=0X00 ;
unsigned char disp ;
void Init_IRQ()
{
// ET0 = 0x01; //Enable Timer Interrupt 0
ET1 = 0x01; //Enable Timer Interrupt 1
ET2 = 0x01; //Enable Timer Interrupt 2
TMOD = 0X10 ;
TH1 = 0X3C ;
TL1 = 0XB0 ;
T2CON = 0X00 ;
RCAP2H = 0XFA ;
RCAP2L = 0X00 ;
EA = 0x01 ; //Enable All Interrupt
TR1 = 0X01 ; //START TIMER1
T2CON = 0X04 ; //START TIMER2
}

void Timer_Interrupt_1() interrupt 3
{
_1_sec_cnt -- ;
if (_1_sec_cnt==0)
{ time_cnt ++ ;
_1_sec_cnt=0x14 ;}
// BIBI = !BIBI ;
TH1 = 0X3C ;
TL1 = 0XB0 ; }
void Timer_Interrupt_2() interrupt 5
{
T2CON = T2CON & 0X7F; //CLEAR TIMER2 INT_FLAG
// BIBI = !BIBI ;
if (scan_cnt>3)
{scan_cnt=0x00;}
// 用 switch 就可直接跳到所要執行的部分,且執行完,馬上break跳出
// 和用 if 有明顯不同 須注意
switch(scan_cnt)
{case 0:




P0=0XFF;
_ONE=0x00;
_TWO=0x01;
_THREE=0X01;
_FOUR=0X01;
disp = time_cnt % 10 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
break;
case 1:




P0=0XFF;
_ONE=0x01;
_TWO=0x00;
_THREE=0X01;
_FOUR=0X01;
disp = (time_cnt/10)%10 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
break;
case 2:




P0=0XFF;
_ONE=0x01;
_TWO=0x01;
_THREE=0X00;
_FOUR=0X01;
disp = (time_cnt%1000)/100 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
break;
case 3:




P0=0XFF;
_ONE=0x01;
_TWO=0x01;
_THREE=0X01;
_FOUR=0X00;
disp = time_cnt / 1000 ;
P0= _7_seg[disp] ;
scan_cnt ++ ;
break;
}



}
void Main(void)
{ Init_IRQ();
while (1) {}
}



PROGRAM_3



這支程式和PROGRAM_1一樣,但它在TIMER_2的地方不一樣,這樣的結果,在實際執行上會造成

什麼樣的結果呢?

"程式其他部分一樣,省略 參照PROGRAM_1

void Timer_Interrupt_2() interrupt 5

{
T2CON = T2CON & 0X7F; //CLEAR TIMER2 INT_FLAG

// BIBI = !BIBI ;

if (scan_cnt>3) {scan_cnt=0x00;}
// 注意 基本上 以下4個IF會依順序 ,往下執行且每次都是如此

// 但程式本意 是希望進入timer2後,馬上去執行,要顯示的位數就馬上離開

// 所以多了每次依順序比較scan_cnt等於多執行了些指令

if (scan_cnt==0)

{ P0=0XFF;

_ONE=0x00;

_TWO=0x01;

_THREE=0X01;

_FOUR=0X01;

disp = time_cnt % 10 ;

P0= _7_seg[disp] ;

scan_cnt ++ ;
}

if (scan_cnt==1)

{ P0=0XFF;

_ONE=0x01;

_TWO=0x00;

_THREE=0X01;

_FOUR=0X01;

disp = (time_cnt/10)%10 ;

P0= _7_seg[disp] ;

scan_cnt ++ ;
}

if (scan_cnt==2)

{ P0=0XFF;

_ONE=0x01;

_TWO=0x01;

_THREE=0X00;

_FOUR=0X01;

disp = (time_cnt%1000)/100 ;

P0= _7_seg[disp] ;

scan_cnt ++ ;
}

if (scan_cnt==3)

{ P0=0XFF;

_ONE=0x01;

_TWO=0x01;

_THREE=0X01;

_FOUR=0X00;

disp = time_cnt / 1000 ;

P0= _7_seg[disp] ;

scan_cnt ++ ;
}

看出來了嗎 ? 可看下圖 PROGRAM_3執行結果會變成這樣
但PROGRAM_1沒有這問題,而PROGRAM_2才是決解之道

再來 PROGRAM_2可以把TIMER_2裡的以下幾行移到MAIN內,這樣才不會浪費MCU執行效能

disp = time_cnt % 10 ;

disp = (time_cnt/10)%10 ;

disp = (time_cnt%1000)/100 ;

disp = time_cnt / 1000 ;

移到main中並且改為如下,

disp_0 = time_cnt % 10 ;

disp_1 = (time_cnt/10)%10 ;

disp_2 = (time_cnt%1000)/100 ;

disp_3 = time_cnt / 1000 ;

timer_2中的P0= _7_seg[disp] 也要跟著改,還有要宣告disp_0,disp_1,disp_2,disp_3喔

2008年10月13日 星期一

田宮坦克車


舊作田宮坦克車,大約6個月前的練習,馬達控制得還不是很有效率,

2008年10月12日 星期日

LEGO 8292


剛領薪水 就馬上入手Masa,交代已久的樂高8292,有點心痛的說,不過看了Masa完成的作品,覺得還是值得的說

2008年10月8日 星期三

2008人工智慧單晶片電腦鼠暨機器人比賽在南台科大





10月5日剛好是星期天,所以專程帶Makoto及Masa去台南看電腦鼠比賽,到了台南竟然,進了台南科技大學,在其校園內晃了一圈,覺得有異為什麼沒有任何的海報呢?於是問了一下路過的同學,原來我這個外地人搞錯了,這裡不是南台科大 ,是台南科大,哈哈校名如此相近且位置也相差不遠,於是費了一番工夫終於到了南台科大,到的時後已接進比賽開始時間不遠,沒有太多時間拍照,在禮堂裡真是擠的滿滿的,這也是我第一次參觀這種展覽,哈只是看熱鬧的說,會場裡有比電腦鼠和lego nxt


NXP LPC2103


一直以來,布魯克都只用8051係列,制作上級交待的東西,當然也只有用組合語言而已,但最近很想改用C語言來設計東西,所以找了NXP 的LPC2103來試試,為什麼會選這個MCU呢?

因為我覺得用這顆MCU,它和51的腳數較接近,再者我目前用的51是笙泉的82G516,外型及腳距跟本一模一樣,且如果用組合語言設計會比用C語言還要不方便,哈哈就是強迫自己用C寫程式啦,附上一張照片我的LPC2103測試板,改天再陸續貼上我的程式