|
初学者 求指导 谢谢大家
单片机源程序如下:
#include <reg51.H>
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS=P3^0;
sbit LCD_EN=P3^1;
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
uchar table[]= "T1:00.00"; //第一行
uchar table1[]="T2:00.00"; //第二行
uchar keyvalue,k1,k2;
char sec_1=0,sec_2=0,min_1,min_2;//分秒变量
uchar min1=50,min2=50; //预置分变量
uint ms1=0;ms2=0; //中断计时变量
bit key_sign=0; //按键状态标志
bit flag1,flag2; //启停标志
void delay(uint x);
void write_com(uchar com);
void write_date(uchar date);
void LCD_init();
void display();
void keyscan();
void Timer0Init();
/*******100us延时程序********/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
/*******1602液晶屏写指令程序********/
void write_com(uchar com)
{
LCD_RS=0; //允许写指令
P2=com; //传递指令
delay(10); //延时1ms
LCD_EN=1; //使能写入
delay(10); //延时1ms
LCD_EN=0; //低跳变执行
}
/*******1602液晶屏写数据程序********/
void write_date(uchar date)
{
LCD_RS=1; //允许写数据
P2=date; //传递数据
delay(10); //延时1ms
LCD_EN=1; //使能写入
delay(10); //延时1ms
LCD_EN=0; //低跳变执行
}
/*******1602液晶屏初始化程序********/
void LCD_init() //设置显示模式、
{
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0x01);//显示清零,数据指针清零
write_com(0x0c);//设置开显示,不显光标
write_com(0x06);//设置写一个字符后地址指针加1
}
/***********按键扫描子程序****************/
void keyscan()
{
static uchar count=0; //计数变量
if(!key1||!key2||!key3) //检测输入如果为0
{
if(++count>=2 && key_sign==0)//计数延时消抖
{
key_sign=1; //按键状态标志置1,防止重复响应
if(!key1&&flag1==0&&flag2==0)
keyvalue=++keyvalue%3;
if(!key2)
{
switch(keyvalue)
{
case 0:
k1++;
if(k1==1)//启动
{
min_1=min1;
sec_1=0;
flag1=1;
}
if(k1==2)//暂停
flag1=0;
if(k1==3)//清0
{
k1=0;
min_1=0;
sec_1=0;
ms1=0;
}break;
case 1: if(min1<98)min1++;sec_1=0; break;
case 2: if(min2<98)min2++;sec_2=0; break;
}
}
if(!key3)
{
switch(keyvalue)
{
case 0:
k2++;
if(k2==1)//启动
{
min_2=min2;
sec_2=0;
flag2=1;
}
if(k2==2)//暂停
flag2=0;
if(k2==3)//清0
{
k2=0;
min_2=0;
sec_2=0;
ms2=0;
}break;
case 1: if(min1>1)min1--;sec_1=0; break;
case 2: if(min2>1)min2--;sec_2=0; break;
}
}
}
}
else
{
count=0; //计数变量清0
key_sign=0;
}
}
void display()
{
uchar i;
if(keyvalue==0)
{
table[3]=min_1/10+'0';
table[4]=min_1%10+'0';
table[6]=sec_1/10+'0';
table[7]=sec_1%10+'0';
table1[3]=min_2/10+'0';
table1[4]=min_2%10+'0';
table1[6]=sec_2/10+'0';
table1[7]=sec_2%10+'0';
}
if(keyvalue==1)
{
table[3]=min1/10+'0';
table[4]=min1%10+'0';
table[6]=0x3c;//<
table[7]=0x3c;//<
table1[3]=min2/10+'0';
table1[4]=min2%10+'0';
table1[6]='0';
table1[7]='0';
}
if(keyvalue==2)
{
table[3]=min1/10+'0';
table[4]=min1%10+'0';
table[6]='0';
table[7]='0';
table1[3]=min2/10+'0';
table1[4]=min2%10+'0';
table1[6]=0x3c;//<
table1[7]=0x3c;//<
}
write_com(0x80); //数据指针第一行起始0x80位置
for(i=0;i<8;i++) //每循环一次写一个字节数据
write_date(table[ i]); //写一个字节数据
write_com(0xc0); //数据指针第二行起始位置0x80+0x40=0xc0
for(i=0;i<8;i++) //每循环一次写一个字节数据
write_date(table1[ i]); //写一个字节数据
}
/***********定时器初始化程序****************/
void Timer0Init() //1毫秒@11.0592MHz
{
TMOD = 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
/***************主程序****************/
void main()
{
LCD_init();
Timer0Init(); //定时器初始化
while(1)
{
keyscan();
display();
}
}
/**************中断服务程序*****************/
void timer0() interrupt 1
{
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
if(flag1)
{
ms1++;
if(ms1>=1000)
{
ms1=0;
sec_1--;
if(sec_1==0&&min_1==0)
{
flag1=0;
k1=0;
}
else if(sec_1<0)
{
sec_1=59;
min_1--;
}
}
}
if(flag2)
{
ms2++;
if(ms2>=1000)
{
ms2=0;
sec_2--;
if(sec_2==0&&min_2==0)
{
flag2=0;
k2=0;
}
else if(sec_2<0)
{
sec_2=59;
min_2--;
}
}
}
}
|
|