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

📄 digital key.c

📁 在keil c 51编译器环境下 4x6键盘扫描程序
💻 C
字号:
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

#define IN0	XBYTE[0x9000]
#define COM XBYTE[0x9801]
#define DAT XBYTE[0x9800]

#define W_C_GLCD XBYTE[0xA000]
#define W_D_GLCD XBYTE[0xA001]
#define R_B_GLCD XBYTE[0xA002]
#define R_D_GLCD XBYTE[0xA003]

sbit flag=ACC^7;
uchar xdata TAB0[32][32];
uchar xdata TAB1[32][32];

uchar TAB[]={0xC5,0xC4,0xC3,0xC2,0xC1,0xC0,0xD5,0xD4,0xD3,0xD2,0xD1,0xD0,0xCD,0xCC,0xCB,0xCA,0xC9,0xC8,0xDA,0xD9,0xD8};
uchar code DHZTAB1[]={"全国大学生电子大"};
uchar code DHZTAB2[]={"赛题目:         "};
uchar code DHZTAB3[]={"      信号检测台"};
uchar code DHZTAB4[]={"指导教师:   申芳"};
uchar code DHZTAB5[]={"学生: 吴凡  胡军"};
uchar code DHZTAB6[]={"      杨玉杰    "};
uchar code DHZTAB7[]={"      王文生    "};
uchar code DHZTAB8[]={"  秒:           "};
uchar code DHZTAB9[]={"时间到! 报警!   "};

uint idata a,b;

uchar keyin();
void keygo();
void initial_GLCD();
void command_GLCD(uchar ord);
void chkbusy_GLCD();
void write_GLCD(uchar dat);
void AD197();
void delay0();
void delay1();
void delay2();
uint ASCII(uint i);
void display1();
void display2();
void clear_GLCD();
void clock();
void clear_TAB();
void show_TAB(uchar *p);
void digital();
void dispclock(unsigned int count);
void clostop() interrupt 3 using 0
{
	uchar i,temp,j,k;
	unsigned int count;
	TMOD=0x01;
	TCON=0x10;
	count++;
	if(count==600)
	{
		TMOD=0x00;
		TCON=0x00;
		temp=0x08;
		command_GLCD(temp|0x80);
		for(j=0;j<8;j++)
		{
			write_GLCD(DHZTAB9[i]);
			i++;
			write_GLCD(DHZTAB9[i]);
			i++;
		}
	}
	dispclock(count);
	k=COM;
	k&=0x07;
	if(k!=0)
	{
		COM=0x40;
		i=DAT;
		if(i==0xDA) 
		{
			TMOD=0x00;
			TCON=0x00;
		}
	}
}

void main()
{
    uchar i=0;

	initial_GLCD();
	COM=0x01;
	COM=0x3A;
	COM=0xD3;
    COM=0x40;
	do
	{
	    ACC=COM;
	}
	while(flag==1);
    while(1)
	{   
	    
        keygo();
	}

}

void keygo()
{
    uint i;
	uchar j,k;
	k=keyin();
    for(i=0;i<21;i++)
	  	if(k==TAB[i])
	  	{	
	    	if(i<16)
	  	  	{
				j=(uchar)ASCII(i);
		  		write_GLCD(j);
		  	}
			else
				switch(i)
				{
					case 16:   //F1
						clear_GLCD();
						clock();
						break;
					case 17:	//F2
						clear_GLCD();
						display1();
						break;
					case 18:	//F5
						clear_GLCD();
						break;
					case 19:	//F4
						clear_GLCD();
						digital();
						break;
					case 20:	//F3
						clear_GLCD();
						display2();
						break;		
		 		}
		  	break;
	  	}
}

uchar keyin()
{
    uchar i;
	uchar k;
	do
	{
	    k=COM;
		k&=0x07;
	}while(k==0);    
	COM=0x40;
	i=DAT;
	return i;
}

uint ASCII(uint i)
{
    if(i<=9)
	    i+=0x30;
	else 
	    i+=0x37;
	return i;
}

void digital()
{
	while(1)
	{	
	uint xx;
	uchar count=0,x,y;
	uchar i,j,k;
	uchar data0;
	initial_GLCD();
	clear_TAB();
	while(count<128)
	{	
		AD197();
		xx=a;
		data0=0x80;
		x=count/8;
		data0>>=(count%8);
		if(xx<2048)
		{
			y=15-xx*15/2048;
			TAB0[y][x]=data0;
		}
		if(xx>2048)
		{
			y=(0xFFFF-xx+1)*15/2048+15;
			TAB0[y][x]=data0;
		}			
	count++;
	}
	show_TAB(&TAB0[0][0]);	
	delay2();
	
	k=COM;
	k&=0x07;
	if(k!=0) 
	{
		COM=0x40;
		i=DAT;
		if(i==0xD8)
		{
			initial_GLCD();
			show_TAB(&TAB1[0][0]);
			break;
		}
	}
	for(i=0;i<32;i++)
		for(j=0;j<32;j++)
			TAB1[i][j]=TAB0[i][j];
	
	}
}

void clear_TAB()
{
	uchar i,j;
	for(i=0;i<32;i++)
		for(j=0;j<32;j++)
			TAB0[i][j]=0x00;
}

void show_TAB(uchar *p)
{
	uchar i,j;
	command_GLCD(0x34);
	for(i=0;i<32;i++)
	{	
		command_GLCD(i|0x80);
		command_GLCD(0|0x80);			
		for(j=0;j<32;j++)
		{	
			write_GLCD(*p);
			p++;
		}		
	}
	command_GLCD(0x36);
}

void AD197()
{
    uchar xdata *ad_adr;
    ad_adr=&IN0;
    *ad_adr=0x4A;   
    delay0();
    a=(uint)*ad_adr;
    ad_adr++;	
    b=(uint)*ad_adr;
    b=b*256;
    a+=b;
}

void initial_GLCD()
{
    command_GLCD(0x30);    //功能设定
    delay1();

    command_GLCD(0x30);    //功能设定
    delay1();

    command_GLCD(0x30);    //功能设定
    delay1();

    command_GLCD(0x06);    //显示器控制:游标不显示;
    delay1();

    command_GLCD(0x01);    //清屏幕
    delay1();

    command_GLCD(0x0c);    //进入模式设定
    delay1();
}

void command_GLCD(uchar ord)
{
    chkbusy_GLCD();
    W_C_GLCD=ord;
}

void chkbusy_GLCD()
{
    do
	{
	    ACC=R_B_GLCD;
    }
    while(flag==1);
}

void write_GLCD(uchar dat)
{
    chkbusy_GLCD();
	W_D_GLCD=dat;
}

void display1()
{
	uchar temp,j,i;
	temp=0x00;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB1[i]);
		i++;
		write_GLCD(DHZTAB1[i]);
		i++;
	}
	i=0;
	
	temp=0x10;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB2[i]);
		i++;
		write_GLCD(DHZTAB2[i]);
		i++;
	}
	i=0;	

	temp=0x08;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB3[i]);
		i++;
		write_GLCD(DHZTAB3[i]);
		i++;
	}
	i=0;
}

void display2()
{
	uchar temp,j,i;
	temp=0x00;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB4[i]);
		i++;
		write_GLCD(DHZTAB4[i]);
		i++;
	}
	i=0;
	
	temp=0x10;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB5[i]);
		i++;
		write_GLCD(DHZTAB5[i]);
		i++;
	}
	i=0;	

	temp=0x08;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB6[i]);
		i++;
		write_GLCD(DHZTAB6[i]);
		i++;
	}
	i=0;

	temp=0x18;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB7[i]);
		i++;
		write_GLCD(DHZTAB7[i]);
		i++;
	}
}

void clear_GLCD()
{
	command_GLCD(0x01);
}

void clock()
{
	uchar i,temp,j;
	initial_GLCD();
	temp=0x10;
	command_GLCD(temp|0x80);
	for(j=0;j<8;j++)
	{
		write_GLCD(DHZTAB8[i]);  //秒:
		i++;
		write_GLCD(DHZTAB8[i]);   //
		i++;
	}
	TMOD=0x01;
	TCON=0x10;
	IE=0x88;
	while(1)
	{
		if(TF0==1)
		{
			TH1=0x97;
			TL1=0xFA;
			TMOD=0x10;
			TCON=0x40;
		}
		if(TMOD==0)
			break;
	}
}

void dispclock(unsigned int count)
{
	uchar d0,d1,d2,temp,firs;
	d0=count/100;
	d1=count/10%10;
	d2=count%10;
	temp=0x10;
	command_GLCD(temp|0x80);
	firs=0x30+d0;
	write_GLCD(firs);
	firs=0x30+d1;
	write_GLCD(firs);
	
	temp=0x13;
	command_GLCD(temp|0x80);
	firs=0x30+d2;
	write_GLCD(firs);
}

void delay0()
{
    uchar i;
    for(i=0;i<100;i++)
			{;}
}

void delay1()
{
    uchar i;
    for(i=0;i<25;i++)
    {;}
}

void delay2()
{
	uchar i,j,k;
	for(i=0;i<255;i++)
		for(j=0;j<255;j++)
			for(k=0;k<5;k++)
				{;}
}

⌨️ 快捷键说明

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