stc15單片機,需求:按鍵高電平按下,發送一次對應的字符串,松開后再按下再發送一次,現在出現的問題是按下持續發送
主程序里void分號前的分號不是寫錯,不寫會報錯,求大神幫忙解決
單片機主程序:
#include "stc15.h"
#include "uart.h"
#define unit unsigned int
#define uchar unsigned char
unsigned char a;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
sbit k5=P1^5;
sbit k6=P5^5;
sbit k7=P1^6;
sbit k8=P2^6;
sbit k9=P2^5;
sbit k10=P2^4;
sbit k11=P2^3;
sbit b1=P2^7;
sbit out1=P3^5;
sbit out2=P3^6;
sbit out3=P3^7;
sbit out4=P1^4; //
sbit out5=P1^5; //
void delay(unit z) //延時函數
{
unit x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} C
;void main()
{
uart_init(); //串口初始化
while(1)
{
k1=k2=k3=k4=k5=k6=k7=k8=k9=k10=k11=b1=0;
if(k1==1) //第1個按鍵
{
delay(10);
if(k1==1)
{
SendString("qq123");
while(!k1);
}
}
if(k2==1) //第2個按鍵
{
delay(10);
if(k2==1)
{
SendString("qq124");
while(!k2);
}
}
if(k3==1) //第3個按鍵
{
delay(10);
if(k3==1)
{
SendString("qq125");
while(!k3);
}
}
if(k4==1) //第4個按鍵
{
delay(10);
if(k4==1)
{
SendString("qq126");
while(!k4);
}
}
if(k5==1) //第5個按鍵
{
delay(10);
if(k5==1)
{
SendString("qq127");
while(!k5);
}
}
if(k6==1) //第6個按鍵
{
delay(10);
if(k6==1)
{
SendString("qq128");
while(!k6);
}
}
if(k7==1) //第7個按鍵
{
delay(10);
if(k7==1)
{
SendString("qq129");
while(!k7);
}
}
if(k8==1) //第8個按鍵
{
delay(10);
if(k8==1)
{
SendString("qq130");
while(!k8);
}
}
if(k9==1) //第9個按鍵
{
delay(10);
if(k9==1)
{
SendString("qq131");
while(!k9);
}
}
if(k10==1) //第10個按鍵
{
delay(10);
if(k10==1)
{
SendString("qq132");
while(!k10);
}
}
if(k11==1) //第11個按鍵
{
delay(10);
if(k11==1)
{
SendString("qqwqwdwq");
while(!k11);
}
}
}
}
uart.h:
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200L //系統頻率
#define BAUD 9600 //串口波特率
#define NONE_PARITY 0 //無校驗
#define ODD_PARITY 1 //奇校驗
#define EVEN_PARITY 2 //偶校驗
#define MARK_PARITY 3 //標記校驗
#define SPACE_PARITY 4 //空白校驗
#define PARITYBIT NONE_PARITY //定義校驗位
/*sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr AUXR = 0x8e; //輔助寄存器
sfr P_SW1 = 0xA2; //外設功能切換寄存器1
sbit P22 = P2^2; */
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
sbit bit9 = P2^2; //P2.2 顯示UART數據位9
bit busy;
void SendData(BYTE dat);
void SendString(char *s);
void uart_init()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
// ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
// P_SW1 = ACC;
//
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=1
// ACC |= S1_S1; //(P1.6/RxD_3, P1.7/TxD_3)
// P_SW1 = ACC;
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可變波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可變波特率,校驗位初始為1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可變波特率,校驗位初始為0
#endif
AUXR = 0x40; //定時器1為1T模式
TMOD = 0x20; //定時器1為模式2(8位自動重載)
TL1 = (256 - (FOSC/32/BAUD)); //設置波特率重裝值
TH1 = (256 - (FOSC/32/BAUD));
TR1 = 1; //定時器1開始工作
ES = 1; //使能串口中斷
EA = 1;
// SendString(" ");
}
/*----------------------------
UART 中斷服務程序
-----------------------------*/
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
P0 = SBUF; //P0顯示串口數據
P22 = RB8; //P2.2顯示校驗位
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙標志
}
}
/*----------------------------
發送串口數據
----------------------------*/
void SendData(BYTE dat)
{
while (busy); //等待前面的數據發送完成
ACC = dat; //獲取校驗位P (PSW.0)
if (P) //根據P來設置校驗位
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 0; //設置校驗位為0
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1; //設置校驗位為1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 1; //設置校驗位為1
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0; //設置校驗位為0
#endif
}
busy = 1;
SBUF = ACC; //寫數據到UART數據寄存器
}
/*----------------------------
發送字符串
----------------------------*/
void SendString(char *s)
{
while (*s) //檢測字符串結束標志
{
SendData(*s++); //發送當前字符
}
}
|