本帖最后由 haochangxu 于 2013-9-20 09:52 编辑
#include <REG52.H>
#include <intrins.h>
#define NOP() _nop_() /* 定义空指令 */
sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制
sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制
sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制
void delay(unsigned int i); //函数声名
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
bit Flag;
unsigned int ReData,SenData;
unsigned int LedOut[10];
unsigned int buf[1];
unsigned int a=0,b,c,count=0;
void main (void)
{
unsigned int i;
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD = 0x20; //定时器工作方式2
PCON = 0x80;
TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
while(1)
{
if(Flag==1)
{
SBUF=(ReData=(buf[0])+(buf[1])); //发送,我是想发送到串口助手上显示。但是不对
while(TI==0);
TI=0;
Flag=0;
}
LedOut[0]=Disp_Tab[ReData%10000/1000];
LedOut[1]=Disp_Tab[ReData%1000/100];
LedOut[2]=Disp_Tab[ReData%100/10];
LedOut[3]=Disp_Tab[ReData%10];
for( i=0; i<4; i++) //实现8位动态扫描循环 一直扫描
{
P0 = LedOut; //将字模送到P0口显示
switch(i) //使用switch 语句控制位选 也可以是用查表的方式 学员可以试着自己修改
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
default :break;
}
delay(100);
}
}
}
/****************************************************
串口中断程序
//******************************************************/
void ser_int (void) interrupt 4 using 1
{
if( RI==1)
buf[count]=SBUF-0x30; //SUBF接受
RI=0;
count++;
if(count>1)
{
ReData=(buf[0])*10+(buf[1]);
count=0;
Flag=1;
}
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
|