wulin:看看我這個程序,后面有記錄。我解決不了。(用的是HC6800-ES-V2.0的板子)
#include<reg51.h>
#define GPIO_DIG P0//數(shù)碼管顯示口
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};//數(shù)碼管顯示編碼
unsigned char DD[2]={0x3f,0x00};//數(shù)碼管顯示緩存
unsigned char D0,D1;//串口發(fā)送緩存
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()//設(shè)置串口
{
SCON=0X50;//串口通信設(shè)置為工作方式1
TMOD=0X20;//設(shè)置定時器1工作方式2
PCON=0X80;//波特率加倍
TH1=0XF3;//計數(shù)器初始值設(shè)置,注意波特率是4800的
TL1=0XF3;
TR1=1;//打開計數(shù)器
}
void DigDisplay()//數(shù)碼管顯示函數(shù)
{
unsigned char i;
unsigned char j;
for(i=0;i<2;i++)//只有2個數(shù)碼管
{
switch(i) //位選,選擇點亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
}
GPIO_DIG=DD;//發(fā)送段碼
j=10; //掃描間隔時間設(shè)定
while(j--);
GPIO_DIG=0x00;//消隱
}
}
void CKFS (void)//串口發(fā)送
{
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為松手消抖計數(shù)變量;j為按鍵計數(shù);
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();
}
}
/*
編后感:
此程序是通過數(shù)碼管顯示按鍵次數(shù)(99以內(nèi)),并且將次數(shù)通過串口發(fā)送到電腦。
但串口接收常常有亂碼!
通過調(diào)試,發(fā)現(xiàn)這樣的現(xiàn)象:
第一:單獨的數(shù)碼管顯示沒有問題;單獨的串口發(fā)送也沒有問題;
第二:個人感覺,兩功能組合后,接收出現(xiàn)問題,主要是按鍵的消抖延時,影響到了串口工作的時序,
比如:串口發(fā)送的語句單獨出現(xiàn)在按鍵程序中,串口根本接收不到有效數(shù)據(jù),把它們集中到子函數(shù)中,
就可以接收到有效數(shù)據(jù)了。
第三:亂碼問題沒有根本解決,有部分數(shù)據(jù)沒有亂碼。根本原因沒有找到,就無法解決。
*/
|