?? experiment_1.c
字號:
/**********************************************************************
實驗一 Timer 實驗(查詢方式)
在led上循環顯示 "0", ... "f",間隔時間: 1s.
**********************************************************************/
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\timer.h"
/*Timer5 初始化
入口參數:Timing_count=定時時間常數,定時時間=定時時間常數*0.02 ms
T5_int_Enable=1,T5 中斷方式,T5_int_Enable=0,T5 查詢方式
Timer input clock Frequency = MCLK / {prescaler value + 1} / {divider value}
{prescaler value} = 0-255
{divider value} = 2, 4, 8, 16, 32
rTCFG0 [23:16]:These 8 bits determine prescaler value for Timer 4 & 5
Timer input clock Frequency = MCLK / {prescaler value + 1} / {divider value}
=40 MHz/(199+1)/4=0.05 MHz
1/0.05 MHz=0.02 ms
定時時間=定時時間常數*0.02ms
延時1s 定時時間常數=1s/0.02ms= 50000
rTCFG1 [23:20]:MUX 5 Select MUX input for PWM Timer5.
0000 = 1/2 0001 = 1/4 0010 = 1/8
0011 = 1/16 01xx = EXTCLK
*/
void Timer_Init(U16 timing_count,U8 T5_int_Enable)
{
rINTMSK=BIT_GLOBAL|BIT_TIMER5;
rTCFG0=0X0c70101;//prescaler=199 rTCFG0=0X010101;prescaler=1
rTCFG1=0X0100000; // DIV=4
rTCNTB5=timing_count;
//rTCMPB5=(timing_count/2); havn't rTCMPB5!!! but T0--T4 have.
rTCON=0X2000000;
rTCON=0X5000000;
if(T5_int_Enable)
{
rINTCON=0X05;
rINTMOD=0X0;
rINTMSK=~(BIT_GLOBAL|BIT_TIMER5);
}
}
/*******************************************************************
在led上顯示 "0", ... "f"
入口參數:data=顯示數字
********************************************************************/
void Led_Display(unsigned char data)
{
unsigned char * ledbuffer = (unsigned char *)led_Address;
switch(data){
case 0:
*ledbuffer=0x12;
break;
case 1:
*ledbuffer=0x9F;
break;
case 2:
*ledbuffer=0x31;
break;
case 3:
*ledbuffer=0x15;
break;
case 4:
*ledbuffer=0x9C;
break;
case 5:
*ledbuffer=0x54;
break;
case 6:
*ledbuffer=0x50;
break;
case 7:
*ledbuffer=0x1F;
break;
case 8:
*ledbuffer=0X10;
break;
case 9:
*ledbuffer=0x14;
break;
case 0xa:
*ledbuffer=0x8;
break;
case 0xb:
*ledbuffer=0xC0;
break;
case 0xc:
*ledbuffer=0x62;
break;
case 0xd:
*ledbuffer=0x81;
break;
case 0xe:
*ledbuffer=0x60;
break;
case 0xf:
*ledbuffer=0x68;
break;
}
}
/************************************************************
在led上循環顯示 "0", ... "f",間隔時間: 1s.
*************************************************************/
void Main(void)
{
U8 i;
while(1)
{
for(i=0; i<16; i++)
{
Timer_Init(50000,0);//定時常數=50000,查詢方式,延時時間=1s
while(rTCNTO5); //查詢,到 1s? 等待。
Led_Display(i); //顯示 i (i=0,1, ... ,f.)
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -