📄 1602+定时器.c
字号:
#include<reg5122.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit T_CLK=P1^5;
sbit T_IO =P1^6;
sbit T_RST=P1^7;
sbit CLK1=P2^0;
sbit DAT1=P2^1;
sbit CLK2=P3^6;
sbit DAT2=P3^7;
sbit xuan1=P2^2;
sbit xuan2=P3^4;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//************ lm016 ************************
sbit LCM_RS=P2^3;
sbit LCM_RW=P2^4;
sbit LCM_EN=P2^5;
#define BUSY 0x80 //LCD1602 中的宏定义
#define DATAPORT P0
uchar code table[]={"0123456789 "};
uchar code str0[]={"HuNan KeJi DaXue"};
uchar code str1[]={"ShiJian 12:55:50"};
/**************函数声明*************************/
void delay(uint);
void WriteCommandLCM(uchar WCLCM,uchar BusyC);
void WriteDataLCM(uchar WDLCM);
void lcd_wait(void);
void initLCM(void);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void DisplayListChar(uchar X,uchar Y,uchar *DData);
unsigned char keyscan(void);
/*********延时K*1ms,12.000mhz**********/
void delay(uint k)
{
uchar j;
for(;k>0;k--)
for(j=0;j<125;j++);
}
/**********写指令到ICM子函数************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0; // 选中指令寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/**********写数据到LCM子函数************/
void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ); //检测忙信号
DATAPORT=WDLCM;
LCM_RS=1; // 选中数据寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/***********lcm内部等待函数*************/
void lcd_wait(void)
{
DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(DATAPORT&BUSY)
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
/**********LCM初始化子函数***********/
void initLCM(void )
{
DATAPORT=0;
delay(15);
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCM(0x08,1); //关闭显示,检测忙信号
WriteCommandLCM(0x01,1); //清屏,检测忙信号
WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
}
/****显示指定坐标的一个字符子函数****/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40
X|=0x80; //指令码为地址码+0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/*******显示指定坐标的一串字符子函数*****/
void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
char hour=12,minute=55,second=50;
int tcount=0;
/******************the mian function***********************/
void main(void)
{
unsigned char flag=0,keynumber=0;
char d=-1;
initLCM( ); //液晶初始化
WriteCommandLCM(0x01,1); //清显示屏
TMOD=0X01;
TH0=15536/256;
TL0=15536%256;
TR0=1;
ET0=1;
EA=1;
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
while(1)
{
keynumber=keyscan();
if(keynumber==1) //调时分秒
{
flag=1; d++;
if(d==3)
{
d=-1;flag=0;
}
}
if(flag==1) //闪烁
{
DisplayOneChar(8+3*d ,1,' ');
DisplayOneChar(9+3*d ,1,' ');
delay(400);
if(d==0)
{
DisplayOneChar(8 ,1,table[hour/10]);
DisplayOneChar(9 ,1,table[hour%10]);
}
if(d==1)
{
DisplayOneChar(11,1,table[minute/10]);
DisplayOneChar(12,1,table[minute%10]);
}
if(d==2)
{
DisplayOneChar(14,1,table[second/10]);
DisplayOneChar(15,1,table[second%10]);
}
}
if((keynumber==2)&&(flag==1)) //加加
{
if(d==0) //时
{
hour++;if(hour==24) hour=0;
DisplayOneChar(8 ,1,table[hour/10]);
DisplayOneChar(9 ,1,table[hour%10]);
}
if(d==1) //分
{
minute++;if(minute==60) minute=0;
DisplayOneChar(11,1,table[minute/10]);
DisplayOneChar(12,1,table[minute%10]);
}
if(d==2) //秒
{
second++;if(second==60) second=0;
DisplayOneChar(14,1,table[second/10]);
DisplayOneChar(15,1,table[second%10]);
}
}
if((keynumber==3)&&(flag==1)) //减减
{
if(d==0) //时
{
hour--;if(hour==-1) hour=23;
DisplayOneChar(14,1,table[second/10]);
DisplayOneChar(15,1,table[second%10]);
}
if(d==1) //分
{
minute--;if(minute==-1) minute=59;
DisplayOneChar(11,1,table[minute/10]);
DisplayOneChar(12,1,table[minute%10]);
}
if(d==2) //秒
{
second--;if(second==-1) second=59;
DisplayOneChar(14,1,table[second/10]);
DisplayOneChar(15,1,table[second%10]);
}
}
delay(400);
}
}
void t0(void) interrupt 1 using 0
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
DisplayOneChar(14,1,table[second/10]);
DisplayOneChar(15,1,table[second%10]);
if(second==60)
{
second=0;
minute++;
DisplayOneChar(14,1,table[second/10]);
DisplayOneChar(15,1,table[second%10]);
DisplayOneChar(11,1,table[minute/10]);
DisplayOneChar(12,1,table[minute%10]);
if(minute==60)
{
minute=0;
hour++;
DisplayOneChar(11,1,table[minute/10]);
DisplayOneChar(12,1,table[minute%10]);
DisplayOneChar(8 ,1,table[hour/10]);
DisplayOneChar(9 ,1,table[hour%10]);
if(hour==24)
{
hour=0;
DisplayOneChar(8 ,1,table[hour/10]);
DisplayOneChar(9 ,1,table[hour%10]);
}
}
}
}
TH0=15536/256;
TL0=15536%256;
}
unsigned char keyscan(void)
{
unsigned char k,keynumber=0;
P3_0=0;
P3_0=1;
if(xuan1==0)
{
delay(1);
if(xuan1==0);
{
DAT1=1;
for(k=0;k<8;k++)
{
CLK1=0;
CLK1=1;
if(xuan1==1)
{
keynumber=k; break;
}
DAT1=0;
}
}
}
if(xuan2==0)
{
delay(1);
if(xuan2==0);
{
DAT1=1;
for(k=0;k<8;k++)
{
CLK1=0;
CLK1=1;
if(xuan2==1)
{
keynumber=k+8; break;
}
DAT1=0;
}
}
}
return keynumber;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -