?? com.c
字號:
//串口調試程序,下載本程序到主板,打開本文件夾中的串口調試軟件,試試看,不用我講了吧!
#include <reg52.h>
#include <intrins.h>
sbit SPK=P3^4; //SPK定義為P3口的第4位,驅動蜂鳴器
code unsigned char key_tab[17]={0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};//========================此數組為鍵盤編碼,
//本人采用類似電話按鍵的編碼方式,方便以后設計
// 1 2 3 a 0x01 0x02 0x03 0x0a
// 4 5 6 b 對應16進制碼: 0x04 0x05 0x06 0x0b
// 7 8 9 e 0x07 0x08 0x09 0x0e
// * 0 # f 0x0c 0x00 0x0e 0x0f
code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共陰數碼管 0-9 表
unsigned char l_tmpdate[3]={0,0,0};
unsigned char l_key=0xff; //定義變量,存放鍵值
unsigned char l_keyold=0xFF; //做為按鍵松開否的憑證
void ReadKey(void); //掃描鍵盤 獲取鍵值
void display(unsigned char *lp,unsigned char lc);//數字的顯示函數;lp為指向數組的地址,lc為顯示的個數
void delay();//延時子函數,5個空指令
void main(void)
{
EA=1; //開啟總中斷
//RI=1;
EX0=1; //開啟外部中斷 0
IT0=1; // 設置成 下降沿觸發方式
P0=0xf0; //鍵盤端口設備
//AT89S52還有個定時器3,是16位定時計數器,我們這里就用定時器3來產生波特率,
//為何我們不用定時器2呢,是因為我們用的晶振有關,你們可以計算下,12M的頻率用定時器2是難以
//產生我們串口軟件所要的比如9600,4800等波特率,所以這里我們用到了定時計數器3
//下面是產生9600波特率的初值,你們可以用工式計算下:16位計數為65536-12000000/12/32/9600
RCAP2L = 0xD8;
RCAP2H = 0xFF;
TL2=0XD8;
TH2=0XFF;
T2CON=0X34; //此寄存器為設置定時器3做波特率發生器,是一個開關,默認為定時器2,所以我們要設置它
SCON=0X50; //串口的工作方式,設置為方式1
ES=1; //打開串口中斷
while(1)
{
display(l_tmpdate,3);//顯示接收緩沖變量的值
if(l_key!=0xff){ //檢測鍵盤是否有鍵要處理
SBUF=l_key; //我們這里直接將鍵盤編碼發送出去
while(!TI){}
TI=0; // 等待發送完畢返回繼續檢測
l_key=0xff;
}
}
}
void display(unsigned char *lp,unsigned char lc)//顯示
{
unsigned char i; //定義變量
P2=0; //端口2為輸出
P1=P1&0xF8; //將P1口的前3位輸出0,對應138譯門輸入腳,全0為第一位數碼管
for(i=0;i<lc;i++){ //循環顯示
P2=table[lp[i]]; //查表法得到要顯示數字的數碼段
delay(); //延時
P2=0; //清0端口,準備顯示下位
if(i==7) //檢測顯示完8位否,完成直接退出,不讓P1口再加1,否則進位影響到第四位數據
break;
P1++; //下一位數碼管
}
}
void delay(void) //空5個指令
{
unsigned char i=10;
while(i)
i--;
}
//以下一部份在鍵盤程序里有說明,此處不在講述
void key_scan() interrupt 0 //外部中斷 0 0的優先級最高
{
EX0=0;
TMOD&=0XF1;
TH0=0X2E;
TL0=0X00;
ET0=1;
TR0=1;
}
void timer0_isr(void) interrupt 1 //定時器0的中斷函數
{
TR0=0;
ReadKey();
}
void ReadKey(void) //讀鍵盤值
{
unsigned char i,j,key;
j=0xfe;
key=0xff;
for (i=0;i<4;i++){
P0=j;
if ((P0&0xf0)!=0xf0){
key=P0;
break;
}
j=_crol_(j,1);
}
if (key==0xff){
l_keyold=0xff;
P0=0xf0;
EX0=1;
SPK=1;
return;
}
SPK=0;
if(l_keyold==key){
TH0=0X2E;
TL0=0;
TR0=1;
return;
}
TH0=0X2E;
TL0=0;
TR0=1;
l_keyold=key;
for(i=0;i<17;i++){
if (key==key_tab[i]){
l_key=i;
break;
}
}
}
void com_isr(void) interrupt 4 //串口中斷
{
unsigned char tmp; //定義變量執接收串口數據
RI=0; //將寄存器復位等待接收下一個
tmp=SBUF; //將接收的數據存于變量中
l_tmpdate[0]=tmp/100; //將數據分開三位顯示
tmp=tmp%100;
l_tmpdate[1]=tmp/10;
l_tmpdate[2]=tmp%10;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -