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

📄 st_key_new_ok_up.c

📁 这是单片机驱动液晶显示器12864和键盘的源代码
💻 C
字号:
#include <SST89x5x4.H>

#define uchar unsigned  char
#define uint unsigned int
#define lcd_clr 0x01


/*
keyboard	data
0		12
1		8
2		4
3		0
4		1
5		2
6		3
7		5
8		6
9		7
10-ok	9
11		10
12-wrong11
13		13
14		14
15		15
*/	

//全局变量定义
sbit rs = P1^7;
sbit rw  = P1^6;
sbit e = P2^1;
sbit lcd_deng = P2^3;
sbit le = P2^6;
sbit ce = P2^4;

//函数申明
void lcd_ini(void);	
void lcd_wrc(uchar com);
void lcd_wrd(uchar dat);
void lcd_checkbusy();
void delay(uchar n);
void ldelay(uchar n);
void lcd_on();
void lcd_off();
uchar lcd_read_ac();
void lcd_dis_num(uint dat);
void lcd_dis_ch(uchar h,uchar l);
void lcd_add(uchar h,uchar l);

//keyboard
uchar key_data(void);
uchar check_key(void);
uchar key_data_ok(void);

//总线控制--使能和释放
void ad_en(void);
void lcd_en(void);
void three_en(void);


void ad_en(void)
{
/*
	e = 0;	//lcd not enable
	le = 0;	//three-states latched
	ce = 0;	//ad enable
*/
}
void lcd_en(void)
{
	ce = 1;	//ad not enable
	le = 0;	//three-states latched
	e = 1;	//lcd enable
}

void three_en(void)
{
	ce = 1;	//ad not enable
	e = 0;	//lcd not enable
	le = 1;	//tree-states open
}


void lcd_ini()
{
	delay(100);
	lcd_wrc(0x34);
	delay(10);
	lcd_wrc(0x30);
	delay(10);
	lcd_wrc(0x01);
	delay(10);
	lcd_wrc(0x06);
	delay(10);
	lcd_wrc(0x0c);
	delay(200);
}	
void lcd_wrc(uchar com)
{
	lcd_en();
	lcd_checkbusy();
	rs = 0;
	rw = 0;
	P0 = com;
	e = 1;
	delay(10);
	e = 0;
}

void lcd_wrd(uchar dat)
{
//	checkbusy();
	lcd_en();
	lcd_checkbusy();
	rs = 1;
	rw = 0;
	P0 = dat;
	e = 1;
	delay(5);
	e = 0;
}
void lcd_checkbusy()
{
	
	uchar busy = 0;
	lcd_en();
	P0 = 0XFF;
	busy = P0;
	if(busy>0x7f)
	{
		rs = 0;
		rw = 1;
		e = 1;
		busy = P0;
		e = 0;
		delay(10);
	}
}
uchar lcd_rdd();
void delay(uchar n)
{
	while(n--);
}

void ldelay(uchar n)
{
	uchar a=100;
	while(a--)
	{
    	while(n--);
	}
}


void lcd_on()
{
	lcd_deng = 0;
}
void lcd_off()
{
	lcd_deng = 1;
}
uchar lcd_read_ac()
{
	uchar dat = 0;
	lcd_en();
//	P0 = 0X00;
	e = 1;
	rs = 0;
	rw = 1;
//	e = 1;
	delay(10);
	dat = P0;
//	delay(10);
//	e = 0;
	return(dat&0x7f);
}
void lcd_dis_num(uint dat)
{
    uint a=0;
    dat =dat%10000;
    a =dat/1000;
    lcd_wrd(0x30+a);
    dat =dat%1000;
    a =dat/100;
    lcd_wrd(0x30+a);
    dat =dat%100;
    a=dat/10;
    lcd_wrd(0x30+a);
    dat =dat%10;
    lcd_wrd(0x30+dat);
}
void lcd_dis_ch(uchar h,uchar l)
{
    lcd_wrd(h);
    lcd_wrd(l);
}

void lcd_add(uchar h,uchar l)       //定位地址
{
  l--;
  switch(h)
  {
    case 1:
    {
      lcd_wrc(0x80+l);
      break;
    }
    case 2:
    {
      lcd_wrc(0x90+l);
      break;
    }
    case 3:
    {
      lcd_wrc(0x88+l);
      break;
    }
    case 4:
    {
      lcd_wrc(0x98+l);
      break;
    }
  }
}

//高位发送,低位读入

uchar check_key(void)
{
	uchar a = 0;
	P1 = 0x0f;
	a = P1&0X0f;
    return(a);
}
uchar key_data_ok(void)
{
	uchar a = 0;
	uchar b = 0;

	b = check_key();
	if(b != 0x0f)
	{
		a = key_data();
	}
	while(b != 0x0f)
	{
		b = check_key();
	}
	lcd_add(4,4);
	lcd_dis_num(b);
	return(a);
}
unsigned char key_data()      //判断键值
{
	uchar a=0,b=0,c=0,d=0,i=0;
  	a = 0xef;
  	for(i = 0;i<4;i++)      //读行
	{
	    P1 = a;
		delay(10);
	    b = P1;
		b = b&0x0f;
//    	b = b>>4;
	    if(b!=0x0F)   //表示有键按下
    	{
			delay(200);   //软件延时   确认有键按下
			b = P1&0X0F;
//	    	b = b>>4;
      		if(b != 0x0F)
      		{  
//	        	return b;

				c=b;
		        if(c==0X07)
		        {
	          		d=i*4+3;
		        }
		        else if(c==0X0B)
		        {
		          	d=i*4+2;
		        }
		        else if(c==0X0D)
		        {
		          	d=i*4+1;
		        }
		        else if(c==0X0E)
		        {
		          	d=i*4;
		        }
			    break;
			}
		}
    	else
	    {
	      	a = a<<1;
			a = a+0x01;
	      	if(a==0xFF)
	      	{
//	        	return 0x0f;
				d = 0x0f+1;
				break;
	      	}
    	}
	}
	return d;
}




void main()
{
/*
	P0 = 0XFF;
	P1 = 0XFF;
	P2 = 0XFF;
	P3 = 0XFF;

	P0 = 0X00;
	P1 = 0X00;
	P2 = 0X00;
	P3 = 0X00;
*/	

	uchar i = 0;
	uchar v = 0;
	uchar keydata = 0;
	uchar key_data_check = 0;
	lcd_off();
	lcd_on();
	lcd_ini();
//	lcd_wrc(0x80);
/*
	for(i=0;i<60;i++)
	{
			lcd_wrd(0x00+i);
	}
*/
//	delay(100);
	lcd_add(1,2);
//	lcd_wrc(0x98);

	for(i=0;i<20;i++)
	{
		lcd_dis_ch(0xb5,0xa1+i);
	}

//	lcd_dis_ch(0xb5,0xa1);
//	lcd_dis_ch(0xb5,0xa1);
//	lcd_dis_ch(0xb5,0xa1);
	delay(200);
//	i=lcd_read_ac();
//	i=lcd_read_ac();
	i=lcd_read_ac();
//	delay(200);
	lcd_dis_num(i);
	lcd_dis_num(12458);



	while(1)
	{
		

		key_data_check = check_key();
		if(key_data_check != 0x0f)
		{
			keydata = key_data();
		}
		while(key_data_check != 0x0f)
		{
			key_data_check = check_key();
		}
		lcd_add(4,4);
		lcd_dis_num(key_data_check);

		lcd_add(4,7);
		switch(keydata)
		{
			case 0:
			{
				v = 3;
				lcd_dis_num(v);
				break;
			}
			case 1:
			{
				v = 4;
				lcd_dis_num(v);
				break;
			}
			case 2:
			{
				v = 5;
				lcd_dis_num(v);
				break;
			}
			case 3:
			{
				v = 6;
				lcd_dis_num(v);
				break;
			}
			case 4:
			{
				v = 2;
				lcd_dis_num(v);
				break;
			}
			case 5:
			{
				v = 7;
				lcd_dis_num(v);
				break;
			}
			case 6:
			{
				v = 8;
				lcd_dis_num(v);
				break;
			}
			case 7:
			{
				v = 9;
				lcd_dis_num(v);
				break;
			}
			case 8:
			{
				v = 1;
				lcd_dis_num(v);
				break;
			}
			case 9:
			{
				v = 10;
				lcd_dis_num(v);
				break;
			}
			case 10:
			{
				v = 11;
				lcd_dis_num(v);
				break;
			}
			case 11:
			{
				v = 12;
				lcd_dis_num(v);
				break;
			}
			case 12:
			{
				v = 0;
				lcd_dis_num(v);
				break;
			}
			case 13:
			{
				v = 13;
				lcd_dis_num(v);
				break;
			}
			case 14:
			{
				v = 14;
				lcd_dis_num(v);
				break;
			}
			case 15:
			{
				v = 15;
				lcd_dis_num(v);
				break;
			}
			default:
			{
				v = 16;
				lcd_dis_num(v);
				break;
			}
		}

	}

}

⌨️ 快捷键说明

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