📄 main.c
字号:
#include"at89x52.h"
#include<intrins.h>
#include"def.h"
//************************************************
extern bit scan(void);
extern void tserial(void);
extern void tsled(void);
extern void S_RL(void);
extern void S_RR(void);
extern void clear(void);
extern void xch(void);
void delay (unsigned int value) /*延时副程式*/
{
while (value!=0) value--; /*10US延时*/
}
//***************************************************************************
void main()
{
T2CON=0x38; /*定时器2工作控制寄存器T2CON_________________*/
/*| TF2|EXF2|RCLK|TCLK|EXEN2|TR2|C/T2|CP/RL2|*/
/*|___________________|_____________________|*/
TL2=0xfd; /* X=2^16-fosc/(2*16*波特率) */
TH2=0xff; /* TL2=X&0x00ff */
RCAP2L=0xdc; /* TL2=X&0xff00 */
RCAP2H=0xff; /*设定传输波特率9600,晶体振荡器=11.059Mhz */
//TH2=256-(28800/9600);
TR2=1; /*启动TEMER2*/
SCON=0x50; /*设定UART工作在MODE2模式,可传送和接收数据 REN=1*/
/*串列控制寄存器SCON_______________________*/
/*| 7 6 5 4 | 3 2 1 0 |*/
/*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/
/*|___________________|___________________|*/
IE=0x98; /*8是允许中断,a是TIMER0,TIMER1中断致能位*/
/*| 7 6 5 4 | 3 2 1 0 |*/
/*| EA | | ET2| ES | ET1| EX1| ET0| EX0|*/
/*|___________________|___________________|*/
IP=0x10; /*中断优先级寄存器IP_______________________*/
/*| | | PT2| PS | PT1| PX1| PT0| PX0|*/
/*|___________________|___________________|*/
dispbuf[0]=dot; /*小数点位*/
dispbuf[7]=0x01; /*ID号码*/
dispbuf[8]=0x01; /*蜂鸣器设定开/二次分频*/
P0=0xff;
clear();
tsled();
while(1)
{
k=scan(); /*键盘扫描副程式*/
if(k==1)
{
switch(tab[ptr]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
{
case 0x0c:
while(m==P1); /*按钮放开否?*/
S_RL(); //光标左移
break;
case 0x0d: /*光标右移*/
while(m==P1); /*按钮放开否?*/
S_RR(); //光标右移
break; /*跳出此循环*/
case 0x0a:
clear(); /*LED清除显示器CLEAR*/
while(m==P1); /*按钮放开否?*/
break; /*跳出此循环*/
case 0x0b:
while(m==P1); /*按钮放开否?*/
if(++dot>6)dot=0; //小数点左移
break; /*跳出此循环*/
case 0x0e: /*E被按下发送显示器上的数字*/
while(m==P1); /*按钮放开否?*/
tserial();
break; /*跳出此循环*/
case 0x0f:
while(m==P1); /*按钮放开否?*/
break; /*跳出此循环*/
default:
if(disp_temp[0]==0)
xch(); /*以上均不是则为数字键呼叫XCH作右键滚入*/
else
{
dispbuf[disp_temp[0]]=tab[ptr];
disp_temp[0]=0;
}
break; /*跳出此循环*/
} /*跳出SWITCH*/
delay(100); /*按钮抗机械反弹跳*/
while(m==P1); /*按钮放开否?*/
dispbuf[0]=dot; //显示小数点。
tsled(); /*串行发送到DTLED-6副程式*/
}
}
}
/******************************************************************
/*宣告串口serial发送副程式*/
/**************************************************************/
void tserial(void)
{ uchar i=7;
IE=0x8f;
{while(i>1)
{
i--;
SBUF=dispbuf[i]; /*将LED上人数字以BCD码的形式由SBUF发送出去*/
while(TI!=1); /*发送完成否?*/
TI=0; /*是,则清除发送完成旗标TI=0*/
delay(10);
}
}
IE=0x9f;
}
//**************************************************************
/*串行口接收中断副程式*/
/******************************************************************/
void uartcom1_in1 () interrupt 4 using 1
{ uchar v,i=0;
while(RI!=1); /*接收完成否*/
{
RI=0;
v=SBUF; /*接收的数据存入*/
dispbuf[6]=dispbuf[5];
dispbuf[5]=dispbuf[4];
dispbuf[4]=dispbuf[3];
dispbuf[3]=dispbuf[2];
dispbuf[2]=dispbuf[1];
dispbuf[1]=SBUF;
}
} /*返回主程式*/
/********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -