wulin:看看我这个程序,后面有记录。我解决不了。(用的是HC6800-ES-V2.0的板子)
#include<reg51.h>
#define GPIO_DIG P0//数码管显示口
sbit LSA=P2^2;//138译码器
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;//按键1
unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管显示编码
unsigned char DD[2]={0x3f,0x00};//数码管显示缓存
unsigned char D0,D1;//串口发送缓存
void Delay10ms(unsigned int c)
{
unsigned char a,b;
for(c;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void UsartConfiguration()//设置串口
{
SCON=0X50;//串口通信设置为工作方式1
TMOD=0X20;//设置定时器1工作方式2
PCON=0X80;//波特率加倍
TH1=0XF3;//计数器初始值设置,注意波特率是4800的
TL1=0XF3;
TR1=1;//打开计数器
}
void DigDisplay()//数码管显示函数
{
unsigned char i;
unsigned char j;
for(i=0;i<2;i++)//只有2个数码管
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
}
GPIO_DIG=DD;//发送段码
j=10; //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
void CKFS (void)//串口发送
{
SBUF = D1;
while (!TI);
TI = 0;
SBUF = D0;
while (!TI);
TI = 0;
SBUF = ' ';
while (!TI);
TI = 0;
}
void main(void)
{
unsigned char i,j;//i为松手消抖计数变量;j为按键计数;
UsartConfiguration();
while(1)
{
if(k1==0)//扫描键盘k1
{
Delay10ms(1);//按下消抖
if(k1==0)
{
j++;
if (j>99)
{
j=0;
}
if (j<10)
{
DD[0]=DIG_CODE[j];
DD[1]=0x00;
D0 = (0x30+j);
D1 = 0x00;
}
else
{
DD[1]=DIG_CODE[j/10];
DD[0]=DIG_CODE[j%10];
D0 = (0x30+(j%10));
D1 = (0x30+(j/10));
}
while((i<50)&&(k1==0))//松键消抖
{
Delay10ms(1);
i++;
}
i=0;
}
CKFS();
}
DigDisplay();
}
}
/*
编后感:
此程序是通过数码管显示按键次数(99以内),并且将次数通过串口发送到电脑。
但串口接收常常有乱码!
通过调试,发现这样的现象:
第一:单独的数码管显示没有问题;单独的串口发送也没有问题;
第二:个人感觉,两功能组合后,接收出现问题,主要是按键的消抖延时,影响到了串口工作的时序,
比如:串口发送的语句单独出现在按键程序中,串口根本接收不到有效数据,把它们集中到子函数中,
就可以接收到有效数据了。
第三:乱码问题没有根本解决,有部分数据没有乱码。根本原因没有找到,就无法解决。
*/
|