|
1.png (26.42 KB, 下載次數(shù): 20)
下載附件
2022-6-3 16:37 上傳
初學(xué)者 求指導(dǎo) 謝謝大家
單片機(jī)源程序如下:
#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; //預(yù)置分變量
uint ms1=0;ms2=0; //中斷計(jì)時(shí)變量
bit key_sign=0; //按鍵狀態(tài)標(biāo)志
bit flag1,flag2; //啟停標(biāo)志
void delay(uint x);
void write_com(uchar com);
void write_date(uchar date);
void LCD_init();
void display();
void keyscan();
void Timer0Init();
/*******100us延時(shí)程序********/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
/*******1602液晶屏寫(xiě)指令程序********/
void write_com(uchar com)
{
LCD_RS=0; //允許寫(xiě)指令
P2=com; //傳遞指令
delay(10); //延時(shí)1ms
LCD_EN=1; //使能寫(xiě)入
delay(10); //延時(shí)1ms
LCD_EN=0; //低跳變執(zhí)行
}
/*******1602液晶屏寫(xiě)數(shù)據(jù)程序********/
void write_date(uchar date)
{
LCD_RS=1; //允許寫(xiě)數(shù)據(jù)
P2=date; //傳遞數(shù)據(jù)
delay(10); //延時(shí)1ms
LCD_EN=1; //使能寫(xiě)入
delay(10); //延時(shí)1ms
LCD_EN=0; //低跳變執(zhí)行
}
/*******1602液晶屏初始化程序********/
void LCD_init() //設(shè)置顯示模式、
{
write_com(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
write_com(0x0c);//設(shè)置開(kāi)顯示,不顯光標(biāo)
write_com(0x06);//設(shè)置寫(xiě)一個(gè)字符后地址指針加1
}
/***********按鍵掃描子程序****************/
void keyscan()
{
static uchar count=0; //計(jì)數(shù)變量
if(!key1||!key2||!key3) //檢測(cè)輸入如果為0
{
if(++count>=2 && key_sign==0)//計(jì)數(shù)延時(shí)消抖
{
key_sign=1; //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng)
if(!key1&&flag1==0&&flag2==0)
keyvalue=++keyvalue%3;
if(!key2)
{
switch(keyvalue)
{
case 0:
k1++;
if(k1==1)//啟動(dòng)
{
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)//啟動(dòng)
{
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; //計(jì)數(shù)變量清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); //數(shù)據(jù)指針第一行起始0x80位置
for(i=0;i<8;i++) //每循環(huán)一次寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
write_date(table[ i]); //寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
write_com(0xc0); //數(shù)據(jù)指針第二行起始位置0x80+0x40=0xc0
for(i=0;i<8;i++) //每循環(huán)一次寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
write_date(table1[ i]); //寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
}
/***********定時(shí)器初始化程序****************/
void Timer0Init() //1毫秒@11.0592MHz
{
TMOD = 0x01; //設(shè)置定時(shí)器模式
TL0 = 0x66; //設(shè)置定時(shí)初值
TH0 = 0xFC; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
EA=1; //開(kāi)總中斷
ET0=1; //開(kāi)定時(shí)器0中斷
}
/***************主程序****************/
void main()
{
LCD_init();
Timer0Init(); //定時(shí)器初始化
while(1)
{
keyscan();
display();
}
}
/**************中斷服務(wù)程序*****************/
void timer0() interrupt 1
{
TL0 = 0x66; //設(shè)置定時(shí)初值
TH0 = 0xFC; //設(shè)置定時(shí)初值
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--;
}
}
}
}
|
|