📄 putinsssz2.c
字号:
//这是8255 控制1602液晶的程序,用8255的A口作为1602的数据输入口
//PC0-RS,PC1-RW,PC2-E
#include<absacc.h>
#include<intrins.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//8255的端口地址为0X2000~0X2003
#define A XBYTE[0x2000]
#define B XBYTE[0X2001]
#define C XBYTE[0x2002]
#define Com XBYTE[0x2003]
static uint counter1=0; //中断计数指针
uint hour=0;
uint miniute=0;
static uint second=0;
static uchar key_value1=0;
void ini_8255();
void delay(uint timepara);
void initialize(void);
void set_cursor(int x,int y);
void display_char(uchar *displaychar);
void lcd_data(uchar lcddata);
void lcd_com(uchar lcdcom);
void display_time(uint time_parameter);
uchar key_value(void);
void comvert();
void banduan(void);
//时分秒变量的初始化
void main()
{
//设置定时器0的工作方式0,初值为0X17B8,开总中断和定时器中断,启动定时器;
TMOD=01;
TL0=0XB8;
TH0=0X11;
TR0=1;
EA=1;
ET0=1;
//设置计数指针初始值;
//..............................................//
delay(100);
ini_8255();
delay(100);
initialize();
delay(1000);
while(1)
{
set_cursor(0,1);
display_char("0~9 --> SetTime");
set_cursor(1,2);
display_char("Time:");
display_time(hour);
display_char(":");
display_time(miniute);
display_char(":");
display_time(second);
key_value1=key_value();
if(key_value1=='H')
//if(key_value1==0x69)
{
TR0=0;
ET0=0;
EA=0;
comvert();
key_value1=0;
TL0=0XB8;
TH0=0X11;
TR0=1;
EA=1;
ET0=1;
counter1=0;
}
}
}
void display_time(uint time_parameter)
{
lcd_data((time_parameter/10)+0x30);
lcd_data(time_parameter%10+0x30);
}
//初始化8255函数
void ini_8255()
{
Com=0x82;
}
//延时函数
void delay(uint timepara)
{
uint i;
for(i=0;i<timepara;i++);
}
//写命令函数,也可以选择对C口的置位和复位
void lcd_com(uchar lcdcom)
{
C=0x00;
A=lcdcom;
_nop_();_nop_();_nop_();
C=0x04;
_nop_();_nop_();_nop_();
C=0x00;
}
//写数据函数
void lcd_data(uchar lcddata)
{
C=0x01;
A=lcddata;
_nop_();_nop_();_nop_();
C=0x05;
_nop_();_nop_();_nop_();
C=0x01;
}
//初始化液晶屏函数
void initialize(void)
{
delay(1000);
lcd_com(0x38);//功能设定
lcd_com(0x0c);//显示画面设置
lcd_com(0x01);//清屏指令
delay(1000);
lcd_com(0x06);
}
//设置显示字符位置函数
void set_cursor(int x,int y)
{
int i;
if(x==0) //写入命令 光标移动,字符不动
{
i=0x80|y; // 不能改变第一行字符显示位置
lcd_com(i);
}
if(x==1) //写入命令 光标移动,字符不动
{
i=0x80|(y+0x40);
lcd_com(i); //P1口输出信号状态
}
}
void display_char(uchar *displaychar)
{
while (*displaychar>0)
{
lcd_data(*displaychar);
displaychar++;
}
}
//以是外部中断测试程序。
void interrupt_timer(void) interrupt 1 using 1
{
TL0=0XB8;
TH0=0x0;
counter1++;
while(counter1==8)
{
counter1=0;
second++;
if(second==60)
{second=0;
miniute++;}
if (miniute==60)
{miniute=0;
hour++;}
if(hour==24) hour=0;
}
}
//以下是判键程序,子程序返回按键的ASCII值。
uchar key_value(void)
{
uchar key_asc[]="0123456789ABCDEF";
uchar col_scanvalue[]={0xe0,0xd0,0xb0,0x70};
C=C&0x0f;
if(B==0xff)
return('G');
else
{
delay(100); //延时消抖
if(B!=0xff)
{
uchar i,a;
for(i=0;i<=3;i++)
{
C=col_scanvalue[i];
a=B&0x0f;
if(a!=0x0f)
{
if(a==0x0e)a=0;
else if(a==0xd)a=4;
else if(a==0x0b)a=8;
else a=0x0c;
a+=i;
while(B!=0xff);
if(a<=9)
{return(key_asc[a]);}
else
{return('H');}
}
}
}
else
return('G');
}
}
//把键盘植转换成时钟显示植
void comvert()
{
uchar temp[6]="000000";
uint i=0;
hour=0;
miniute=0;
second=0;
for(i=0;i<6;)
{
key_value1=key_value();
if(key_value1!='G')
//if(key_value1!=0x69)
{
if(key_value1!='H')
//if(key_value1!=0x6b)
{
temp[i]=key_value1;
i++;
}
else
{//_nop_();
hour=10*(temp[0]-0x30)+(temp[1]-0x30);
miniute=10*(temp[2]-0x30)+(temp[3]-0x30);
second=10*(temp[4]-0x30)+(temp[5]-0x30);
banduan();
return;
}
}
else
{
//hour=10*(temp[0]-0x30)+(temp[1]-0x30);
//miniute=10*(temp[2]-0x30)+(temp[3]-0x30);
//second=10*(temp[4]-0x30)+(temp[5]-0x30);
//return;
_nop_();
}
}
hour=10*(temp[0]-0x30)+(temp[1]-0x30);
miniute=10*(temp[2]-0x30)+(temp[3]-0x30);
second=10*(temp[4]-0x30)+(temp[5]-0x30);
banduan();
return;
}
//判断输入的值是否合法
void banduan(void)
{
if(hour>23)
{
set_cursor(0,1);
display_char("0~9 --> SetTime");
set_cursor(1,2);
display_char("Time:hour<=23");
comvert();
}
if(miniute>59)
{
set_cursor(0,1);
display_char("0~9 --> SetTime");
set_cursor(1,2);
display_char("Time:miniute<=59");
comvert();
}
if(second>59)
{
set_cursor(0,1);
display_char("0~9 --> SetTime");
set_cursor(1,2);
display_char("Time:second<=59");
comvert();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -