📄 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 + -