|
我有一个问题:我想让第一个led灯亮且数码管动态扫描显示,可是把这两个程序结合起来就不对,它们单个运行的时候是正确的,但是当把他们同时运行的时候就出现问题?我不知道是不是我锁存器那块操作不正确,请大神帮帮我。
单片机源程序如下:
1.#include "head.h"
void main()
{
init();
model=1;
time=50;
ZKB=20;
//Timer_On();
Select_Show(0);
LED_On(1);
while(1)
{
//LED_On(1);
/*if(time)
{
LED_On(1);
}
else
{
LED_Off();
Timer_Off();
}*/
DIG_Show();
}
}
2.*******************************************
头文件head.h
***********************************************/
#ifndef HEAD_H
#define HEAD_H
/*******************************/
//包含的头文件
#include <reg52.h>
#include <intrins.h>
#include "delay.h"
/*******************************/
//宏定义
#define uchar unsigned char
#define uint unsigned int
/*******************************/
//74LS138译码器
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
extern void LS138(uchar i);//选择译码器输出
/*******************************/
//定时器
extern uint ZKB;//占空比单位:%
extern bit PWM;
extern uchar flag;
extern uint counter0;
extern uint counter1;
extern uchar counter_time;
extern uchar time;
extern void Timer0_init();//定时器0初始化设置
extern void Timer_On();//定时器开启
extern void Timer_Off();//定时器关闭
/*******************************/
//LED
extern void LED_On(uchar i);//LED亮
extern void LED_Off();//LED灭
/*******************************/
//初始化函数
extern void init();
/*******************************/
//数码管
extern uchar model;
extern uchar DIG_BUFFER[8];
extern uchar code DIG[16];
extern void DIG_Show();//数码管显示
extern void Select_DIG(uchar i);//选择数码管
extern void Select_Show(uchar i);//选择数码管显示模式 0倒计时 1温度
/*******************************/
//键盘
extern void KeyScan();//键盘扫描函数
#endif
3********************************************
head.c
***********************************************
#include "head.h"
/*******************************/
//74LS138译码器
void LS138(uchar i)//选择译码器输出
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
}
/*******************************/
//定时器
uint ZKB;//占空比单位:%
bit PWM=0;
uchar flag;
uint counter0=0;
uint counter1=0;
uchar counter_time=0;
uchar time=0;
void Timer0_init()//定时器0初始化设置
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
ET0=1;//开定时器0中断
}
void Timer0() interrupt 1
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
counter0++;
counter1++;
if(counter0<(ZKB*10))
{
PWM=1;
}
else if((counter0>=(ZKB*10))&&(counter0<1000))
{
PWM=0;
}
else
{
counter0=0;
}
if(counter1>50000)
{
counter1=0;
time--;
}
}
void Timer_On()//定时器开启
{
TMOD=0x01;
Timer0_init();
EA=1;
TR0=1;
}
void Timer_Off()//定时器关闭
{
EA=0;
ET0=0;
TR0=0;
counter0=0;
counter1=0;
counter_time=0;
PWM=0;
}
/*******************************/
//LED
void LED_On(uchar i)//LED亮
{
switch(i)
{
case 1:P0=0xfe;break;
case 2:P0=0xfd;break;
case 3:P0=0xfb;break;
}
LS138(4);
LS138(0);
}
void LED_Off()//LED灭
{
LS138(4);
P0=0xff;
LS138(0);
}
/*******************************/
//初始化函数
void init()
{
LS138(4);
P0=0xff;
LS138(0);
//关闭蜂鸣器、继电器等无关外设
LS138(5);
P0=0x00;
LS138(0);
//数码管熄灭
/*LS138(6);
DIG_COM(8);
P0=0xff;
LS138(7);
P0=0xff;*/
}
/*******************************/
//数码管
uchar model;
uchar code DIG[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
uchar DIG_BUFFER[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//数码管缓存
void Select_DIG(uchar i)//选择数码管
{
switch(i)
{
case 0:P0=0x01;break;
case 1:P0=0x02;break;
case 2:P0=0x04;break;
case 3:P0=0x08;break;
case 4:P0=0x10;break;
case 5:P0=0x20;break;
case 6:P0=0x40;break;
case 7:P0=0x80;break;
}
LS138(6);
LS138(0);
}
void DIG_Show()//数码管显示
{
uchar x;
for(x=0;x<8;x++)
{
Select_DIG(x);
P0=0xff;
P0=DIG_BUFFER[x];
LS138(7);
//while(counter1<1000);
LS138(0);
Delay1ms();
}
}
void Select_Show(uchar i)//选择数码管显示模式 0倒计时 1温度
{
switch(i)
{
case 0:
DIG_BUFFER[0]=0xbf;
DIG_BUFFER[1]=DIG[model];
DIG_BUFFER[2]=0xbf;
DIG_BUFFER[3]=0xff;
DIG_BUFFER[4]=DIG[time/1000];
DIG_BUFFER[5]=DIG[(time%1000)/100];
DIG_BUFFER[6]=DIG[(time%100)/10];
DIG_BUFFER[7]=DIG[time%10];
break;
}
}
|
|