📄 09_3_24_temer2_led数码管.c
字号:
/**********************************************************
* 文件名:
*
***********************************************************/
#include<reg52.H>
//#include<STC89C51RC.H>
#define uint unsigned long int
#define uchar unsigned char
#define uart_buf_num 11 //定义串口接收数组的长度
uchar interrupt_timer2_a = 0,interrupt_timer2_ab = 0;
uchar rcv_buf[uart_buf_num],num=0; //定义用于存放主机发送的数据的数组
uchar rcv_flag=0,uart_rcv_num=0; //定义用于表示接收到主机发送数据的变量
sbit key=P3^0;
//0~f
/*uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
*/
//共阴数码管0~f显示
uchar code table[]={
0xC0,0xCF,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90
,~0x77,~0x7c,
~0x39,~0x5e,~0x79,~0x71,~0};
uchar Disp_LED[8];//={}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//定时器二初始化
void Timer2init(void)
{ /*TR2=0;
T2MOD=0x02;
T2CON&=~0x02;
//EA=1; /* interupt enable */
// ET2=1; /* enable timer1 interrupt */
//EXEN2=1;
//下面两句是设置频率
/* RCAP2H=0xff;//40kHz, 1S/40K=1000uS/40=25uS 现在是20Hz
RCAP2L=181; //STC_Timer2第6页讲得很清楚,频率计算方法//183 41111Hz 182 40560Hz 181 40020Hz 180 39486Hz
//TH2 = 0;
//TL2 = 0;
T2MOD |= 0x02;
TR2=1;
*/
T2CON=0x04;
T2MOD=0x00;
RCAP2H=0x3C;
RCAP2L=0xB0;
TL2 = (65536-1000) % 256;
TH2 = (65536-1000) / 256;
EA = 1;
TR2 = 1;
ET2 = 1;
}
void System_Initialize(void)
{
EA=1; //开启中断
//TR0=1;//启动定时器0
//EX0=1;//开外部中断0
Timer2init();
WDT_CONTR=0x3f; //看门狗,开启看门狗和喂狗都是这句话
}
main()
{ uchar i,j;
System_Initialize();
P0=~0x3f;P2=0x55;P2=0xaa;
for(i=0;i<8;i++)
{
Disp_LED[i]=i;
}
while(1)
{
delay(50);
delay(50);
WDT_CONTR=0x3f; //看门狗,开启看门狗和喂狗都是这句话
}
}
//串口中断服务程序,接收LPC2148发送的命令,并做处理。
void serial(void) interrupt 4 using 1 //serial interrupt
{
// unsigned char temp;
// unsigned char k;
unsigned char i;
if (RI) //RI为1时表明有数据进入中断
{
RI = 0; //将标志位RI软件清0
rcv_buf[uart_rcv_num] = SBUF; //将数据赋给存储数组
uart_rcv_num++;
if(uart_rcv_num == uart_buf_num)
{
uart_rcv_num = 0; //若接收完数据,则清零该变量
if(rcv_buf[0] == 0xee) //数组首位是0xee表示数码管显示命令
{
for(i=0;i<8;i++)
{
Disp_LED[i] = rcv_buf[i+1];
}
}
else if(rcv_buf[0] == 0xe3) //数组首位是0xe3表示舵机控制命令
{
}
}
}
}
//中断号是5,在STC89C51芯片资料第20页
void timer2(void) interrupt 5 using 1
{
TR2 = 0; //关闭定时器1
TF2 = 0;
TL2 = (65536-1000) % 256;
TH2 = (65536-1000) / 256; // -2000 或 1000时是可以的
interrupt_timer2_a++;
P2 = 0xff; //先关闭所有数码管,再赋值,消隐
// if(interrupt_timer2_a == 8) interrupt_timer2_a = 0;
//if(LED_EN) //若数码管显示被允许
//第0~7个共阴数码管动态扫描显示,P0为段选,P2位选
switch(interrupt_timer2_a)
{
case 1: P0 = table[Disp_LED[0]];
P2 = ~0x01;
break;
case 2: P0 = table[Disp_LED[1]];
P2 = ~0x02;
break;
case 3: P0 = table[Disp_LED[2]];
P2 = ~0x04;
break;
case 4: P0 = table[Disp_LED[3]];
P2 = ~0x08;
break;
case 5: P0 = table[Disp_LED[4]];
P2 = ~0x10;
break;
case 6: P0 = table[Disp_LED[5]];
P2 = ~0x20;
break;
case 7: P0 = table[Disp_LED[6]];
P2 = ~0x40;
break;
case 8: P0 = table[Disp_LED[7]];
P2 = ~0x80;
break;
default: interrupt_timer2_a = 0; //若interrupt_timer2_a加到0,则清零变量
break;
}
if(key == 1) //检查开关是否按下
{ }
else //开关断开,则关闭小灯
{ }
// TH2 = 0x00; //将定时器重新赋值
// TL2 = 0x18;
TR2 = 1; //开启定时器1
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -