⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_display.c

📁 p89c669与键盘、液晶显示的源代码
💻 C
字号:
//******************Includes*******************
#include <stdio.h> 
#include <reg669.h>
#include <intrins.h>

//***************8/16-bit SFR*********************
sbit 	DI  	=	P1^5;				//只指令数据通道
sbit	RW		=	P1^4;				// 读写选择,R/W=1为读选通;R/W=0为写选通
sbit	CSB  	=	P1^6;				//片选2				
sbit	CSA 	=	P1^7; 				//片选1
sbit	E1 		=	P3^7;				//E是使能信号,数据在下降沿时被写入LCM,在高电平时被读出LCM
sbit	E2 		=	P3^6;

sbit	P1_0	=	P1^0;
sbit	P1_1	=	P1^1;
sbit	P1_2	=	P1^2;
sbit	P1_3	=	P1^3;
sbit	P3_2	=	P3^2;
//***********Define the register command code**************** 
#define Disp_On  	0x3F             // 即P0=DB=3F,也就是DB0=1时,LCD显示RAM中的内容
#define Disp_Off 	0x3E             // 即DB0=0时,关闭显示
#define Col_Add  	0x40             // 列地址(Y Address) 设置指令,起始列(0列)指令,共64页(0到63列)
#define Page_Add 	0xB8             // 页PAGE设置指令,起始页(0页)指令,共8页(0到7页)
#define Start_Line 	0xC0             // 显示起始行ROW设置指令,起始行(0列)指令,共64行(0到63行)
#define Fosc        11059200           //单片机外部时钟

//***************Function PROTOTYPES**********************
void delay(unsigned char);
void delay_10us(unsigned char);
void initial_LCD(void);
void clear_LCD (void);
void get_str(void);
void key_fun (void);
void send_com(unsigned char);
void send_data(unsigned char );
void hz_disp16(unsigned char,unsigned char,unsigned char code *);
void sz_disp8(unsigned char,unsigned char,unsigned char code *);
void sz_disp8_input(unsigned char,unsigned char, unsigned char code *);
void DISPLAY (void);
void DISPLAY_shijian (void);
bit  kb_hit (void);
unsigned char get_ch (void);
void DISPLAY_input(void);
void clear_LCD_input(void);

//****************Global VARIABLES************************
char data poc=0;        //用于键值计算的参数

struct  TIME{
			char	min;
			char	sec;
			};
struct	TIME	xdata	time_z		={0,0};	
struct	TIME	xdata	time_j		={0,0};
struct	TIME	xdata	time1		={0,0};	
struct	TIME	xdata	time2		={0,0};
struct	TIME	xdata	time_c		={0,0};
struct	TIME	xdata	time_in		={0,0};
struct	TIME	xdata	zhaoshe		={0,0};
struct	TIME	xdata	jiange 		={0,0};
struct	TIME	xdata	measure_T	={0,0};
struct	TIME	xdata	finish_T	={0,0};

/* LCD显示的二进制代码 */
// 照  
char code  zhao[]={
0x00,0x00,0xFE,0x22,0x22,0xFE,0x40,0x21,0xD1,0x4F,0x41,0x41,0x61,0xDF,0x00,0x00,
0x40,0x60,0x3B,0x01,0x09,0x33,0x60,0x00,0x0F,0x32,0x62,0x04,0x0A,0x37,0x60,0x00};
// 射 
char code  she[]={
0x00,0x00,0xFC,0x56,0x55,0x54,0x54,0xFC,0x10,0x90,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x42,0x23,0x12,0x0A,0x46,0x82,0x7F,0x00,0x00,0x47,0x80,0x7F,0x00,0x00,0x00};
// 冒号 
char code  maohao[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// 测 
char code  ce[]={
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xF7,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x67,0x10,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00};
// 量 
char code  liang[]={
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0x5D,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x40,0x40,0x40,0x00};
// 样 
char code  yang[]={
0x08,0x88,0x68,0xFF,0x48,0x88,0x00,0x49,0x4E,0x48,0xF8,0x4C,0x4B,0x48,0x08,0x00,
0x02,0x01,0x00,0xFF,0x00,0x00,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x00};
// 1 
char code  yi[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00};
// 2 
char code  er[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x00,0x00,0x00,0x00,0x00};
// 分
char code  fen[]={
0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x40,0x80,0xFF,0x00,0x00,0x00,0x00,0x00};
// 秒
char code  miao[]={
0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x83,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00};

char code  shijian[]={
/* 0 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x00,	//16
/* 1 (16*8) */
0x00,0x00,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,	//32
/* 2 (16*8) */
0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x21,0x00,	//48
/* 3 (16*8) */
0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00,	//64
/* 4 (16*8) */
0x00,0xF8,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x3F,0x00,	//80
/* 5 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00,	//96
/* 6 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x3F,0x00,	//112
/* 7 (16*8) */
0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,	//128
/* 8 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x3F,0x00,	//144
/* 9 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00,	//160
/* A (16*8) */
0xC0,0x60,0x30,0x18,0x18,0x30,0x60,0xC0,0x3F,0x02,0x02,0x02,0x02,0x02,0x02,0x3F,	//176
/* B (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x08,0xf0,0x00,0x00,0x3f,0x21,0x21,0x21,0x21,0x1e,0x00,	//194	
/* C (16*8) */
0xe0,0x10,0x08,0x08,0x08,0x08,0x10,0x00,0x0f,0x10,0x20,0x20,0x20,0x20,0x10,0x00,	//210
/* D (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x18,0x30,0xe0,0x00,0x3f,0x20,0x20,0x20,0x30,0x18,0x0f,	//226
/* E (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x3f,0x21,0x21,0x21,0x21,0x21,0x00,	//242
/* F (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x3f,0x01,0x01,0x01,0x01,0x00,0x00};	

// ******************MAIN Routine********************
main() 
{
	delay(50);                           			// 延时,等待系统上电稳定
	initial_LCD();									 // initialize LCD 
	clear_LCD();
	DISPLAY_input();								 // 输入时间显示
	while(1)
	{
	while(!kb_hit());
	key_fun();
	}
}

//***********延时us*****************************
void delay_10us(unsigned char x) 
{ 
	while(x--);
} 

//***********延时ms*****************************
void delay(unsigned char cnt)
{
    unsigned char i;
	do 	{
		i = 4;
		do 	{
   		     delay_10us(39);
  			} while(--i);
		} while(--cnt);
}

//******************判断是否有键按下的函数*******************
bit kb_hit(void)
{
	P2 &= 0xF0 ;
	if((P2 & 0xF0) == 0xF0)
		{
		return(0);
		}
	else
		{
		delay(50);
		if((P2 & 0xF0) == 0xF0)
			{
			return(0);            //无键按下返回0       
			}
		else	{return(1);}       //有键按下返回1  
		}
}

//*******************键盘输入函数********************
unsigned char get_ch(void)
{
	unsigned char row=0,col=3;
	unsigned char pic;
	unsigned char mask=0xFE;
	if( !kb_hit() ) 
	{	
	return(0);
	}
/* 分析按键所在的列号 */
	P2 = mask;
	while( (P2 & 0xF0 )==0xF0 && mask>0xEF)
	{
	--col;
	mask = _crol_(mask,1);
	P2 = mask;
	}
/* 分析按键所在的行号 */
	mask=0xEF;
	P2=mask;
	while( (P2 & 0x0F )==0x0F && mask!=0xFE)
		{
			++row;
			mask = _crol_(mask,1);
			P2=mask;
		}
/* 等待按键释放 */
	while( (P2 & 0xF0 )==0xF0);
	P2=0xFF;
/* 计算按键键值并转成ASCII码值返回 */
	pic=row+col*4;
	CSA=1;CSB=0;
	if( pic < 10)
	{
	poc=pic;
	pic += '0';
	sz_disp8_input(3,48,&shijian[pic*16]);
	}
	else	
	{
	sz_disp8_input(3,48,&shijian[pic*16]);
	pic += 'A'-10;
	}
	return(pic);
}

//****************时间输入函数*********************
void get_str(void)
{
	unsigned char data i;
	for(i=0;i<4;i++)				//先后输入四个数字作为一个时间的分和秒(60进制)
	{
		while(!kb_hit());
		get_ch();
		time_in.min	=	(time_in.min%10)*10+time_in.sec/10;
		time_in.sec	=	(time_in.sec%10)*10+poc;
		DISPLAY_input();			//输入时间的显示	
	}
}

//*****************键盘功能键***********************
void key_fun(void)
{
	switch(get_ch())				
	{
	case 'A':						//进入照射时间的输入,如果出输入有误,重新按A键开始输入
			clear_LCD_input();
			get_str();
			zhaoshe=time_in;
			time_z=time_in;
			return;					//退回该函数的调用处
	case 'B':						//进入间隔时间的输入
			time_in.min	=0;	    	//清空前一次的输入
			time_in.sec	=0;
			DISPLAY_input();
			get_str();
			jiange=time_in;
			return;
	}
}


//***********清屏*****************************
void clear_LCD(void)
{
	unsigned char m,i;
	CSA=0;CSB=0;
 	send_com(Page_Add+0);
 	send_com(Col_Add+0);
 	for(i=0;i<8;i++)
	{
		send_com(Page_Add+i);
  		for(m=0;m<64;m++)send_data(0x00);
 	}
}
void clear_LCD_input(void)
{
	unsigned char m,i;
	CSA=0;CSB=1;
	send_com(Page_Add+0);
 	send_com(Col_Add+0);
	for(i=0;i<8;i++)
	{
		send_com(Page_Add+i);		
		for(m=0;m<64;m++)send_data(0x00);
	}
}


//**********LCD初始化************************
void initial_LCD(void)
{
	delay(10);
	CSA=0;CSB=0;
	send_com(Disp_Off);
	send_com(Page_Add+0);
	send_com(Start_Line+0);
	send_com(Col_Add+0);
	send_com(Disp_On);
}

//**********数据写命令***************************
void send_com(unsigned char command )
{
  delay_10us(1);
  DI=0;
  RW=0;
  P0=command;
  E2 =1;
  E1 =0;
  delay_10us(1);
  E1 =1;
}

//**********写数据***************************
void send_data(unsigned char dat )
{
  delay_10us(1);
  DI=1;
  RW=0;
  P0=dat;
  E2 =1;
  E1 =0;
  delay_10us(1);
  E1 =1;
  delay(10);
}

//*****************指定位置显示汉字16*16****************

void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk)
{
	unsigned char m=0,i=0;
	for(m=0;m<2;m++)
	{
		send_com(Page_Add+pag+m);
		send_com(Col_Add+col);
		for(i=0;i<16;i++) 
			send_data(hzk[16*m+i]);
	}
}

//******************显示静态点阵子程序************
void DISPLAY(void)
{
	unsigned char m=0,i=0;
	CSA=0;CSB=1;
	hz_disp16(0,0,zhao);
	delay(1);
	hz_disp16(0,16,she);
	delay(1);
	hz_disp16(0,32,maohao);

	delay(1);
	hz_disp16(2,0,ce);
	delay(1);
	hz_disp16(2,16,liang);
	delay(1);
	hz_disp16(2,32,maohao);
	delay(1);

	hz_disp16(4,0,yang);
	delay(1);
	hz_disp16(4,16,yi);
	delay(1);
	hz_disp16(4,32,maohao);
	delay(1);

	hz_disp16(6,0,yang);
	delay(1);
	hz_disp16(6,16,er);
	delay(1);
	hz_disp16(6,32,maohao);
	delay(1);

	CSA=1;CSB=0;
	for(i=0;i<4;i++)
	{
		hz_disp16(m,0,fen);
		delay(1);
		hz_disp16(m,32,miao);
		delay(1);
		m+=2;
	}
}

//****************指定位置显示时间16*8******************
void sz_disp8(unsigned char page,unsigned char coll, unsigned char code *szk)
{
	unsigned char m=0,i=0;
	for(m=0;m<2;m++)
	{
		send_com(Page_Add+page+m);
		send_com(Col_Add+coll);
		for(i=0;i<8;i++) 
			send_data(szk[8*m+i]);
	}
}

//******************显示动态点阵子程序************
void DISPLAY_shijian(void)
{
	CSA=0;CSB=1;
	sz_disp8(0,48,&shijian[(time_z.min/10)*16]);
	delay(1);
	sz_disp8(0,56,&shijian[(time_z.min%10)*16]);
	delay(1);
	sz_disp8(2,48,&shijian[(time_c.min/10)*16]);
	delay(1);
	sz_disp8(2,56,&shijian[(time_c.min%10)*16]);
	delay(1);
	sz_disp8(4,48,&shijian[(time1.min/10)*16]);
	delay(1);
	sz_disp8(4,56,&shijian[(time1.min%10)*16]);
	delay(1);
	sz_disp8(6,48,&shijian[(time2.min/10)*16]);
	delay(1);
	sz_disp8(6,56,&shijian[(time2.min%10)*16]);
	delay(1);

	CSA=1;CSB=0;
	sz_disp8(0,16,&shijian[(time_z.sec/10)*16]);
	delay(1);
	sz_disp8(0,24,&shijian[(time_z.sec%10)*16]);
	delay(1);
	sz_disp8(2,16,&shijian[(time_c.sec/10)*16]);
	delay(1);
	sz_disp8(2,24,&shijian[(time_c.sec%10)*16]);
	delay(1);
	sz_disp8(4,16,&shijian[(time1.sec/10)*16]);
	delay(1);
	sz_disp8(4,24,&shijian[(time1.sec%10)*16]);
	delay(1);
	sz_disp8(6,16,&shijian[(time2.sec/10)*16]);
	delay(1);
	sz_disp8(6,24,&shijian[(time2.sec%10)*16]);
	delay(1);
}

//****************指定位置显示时间16*8******************
void sz_disp8_input(unsigned char pag0,unsigned char col0, unsigned char code *sjk)
{
	unsigned char m=0,i=0;
	for(m=0;m<2;m++)
	{
		send_com(Page_Add+pag0+m);
		send_com(Col_Add+col0);
		for(i=0;i<8;i++) 
			send_data(sjk[8*m+i]);
	}
}

//***************输入显示*********************
void DISPLAY_input(void)
{
	CSA=0;CSB=1;
	sz_disp8_input(3,32,&shijian[(time_in.min/10)*16]);
	delay(1);
	sz_disp8_input(3,40,&shijian[(time_in.min%10)*16]);
	delay(1);
	sz_disp8_input(3,48,&shijian[(time_in.sec/10)*16]);
	delay(1);
	sz_disp8_input(3,56,&shijian[(time_in.sec%10)*16]);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -