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

📄 max531.c

📁 这是自己编的4*4键盘+1602的程序~验证过
💻 C
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

void delay1ms(uint);
//uchar keyscan(void);
//void getscan();
/****max531引脚定义***/
sbit din531=P1^0;
sbit clk531=P1^1;
sbit cs531=P1^2;
/***4乘4引脚定义***/
uchar keyascan[2];
uchar wordbuf[6];				// 字型码缓冲区
uchar count,key;					// 位计数

/*****1602引脚定义***/
sbit RS=P3^7;
sbit RW=P3^6;
sbit EN=P3^5;
//uchar JS[5]={0X30,0X30,':',0X30,0X30};
unsigned char code str1[]={"setdy:"};
unsigned char code str2[]={"nowgl:"};
//unsigned char code str3[]={"OK"};
//unsigned char code str4[]={"HOT"};
//unsigned char code str5[]={"COOL"};
//uchar data disdata[5];



/************MAX531D/A转换************/
void da_out531(uint out_value)
{
	uchar da_h8,da_l4,i;
 	uint a;
 	a=out_value;
	da_h8=(uchar)(a>>4)&0x00ff;
	a=out_value;
	da_l4=(char)(a<<4)&0x00ff;     
	cs531=0;
	for(i=0;i<8;i++)
  	{
		clk531=0;
		delay1ms(1);
  		if(da_h8&0x80)din531=1;  
        else din531=0; 
  		clk531=1;  
		da_h8<<=1;
	}
	for(i=0;i<4;i++)
 	{
		clk531=0; 
		delay1ms(1);
  		if(da_l4&0x80)
			din531=1;  
        else 
			din531=0; 
  		clk531=1; 
		da_l4<<=1;
	}
	cs531=1;  
}

/******************延时**********************/
void delay1ms(uint t) //延时1MS
{
	uchar j;
	while(t--)
	{
		for(j=0;j<125;j++)
		{;}
	}
}

/*****************4乘4键盘**************/
/* 键扫描函数 */
uchar keyscan(void)
{
	uchar scancode,tmpcode;
	P2 = 0xf0;			 					// 发全0行扫描码
	if ((P2&0xf0)!=0xf0)					// 若有键按下
	{
		delay1ms(2);							// 延时去抖动
		if ((P2&0xf0)!=0xf0)				// 延时后再判断一次,去除抖动影响
		{
			scancode = 0xfe;
			while((scancode&0x10)!=0)		// 逐行扫描
			{
				P2 = scancode;				// 输出行扫描码
				if ((P2&0xf0)!=0xf0)		// 本行有键按下
				{
					tmpcode = (P2&0xf0)|0x0f;

					/* 返回特征字节码,为1的位即对应于行和列 */
					return((~scancode)+(~tmpcode));
				}
				else scancode = (scancode<<1)|0x01;		// 行扫描码左移一位
			}
		}
	}
	return(0);								// 无键按下,返回值为0 	
}
/* 键盘取值函数*/
void getscan()
      {  uchar j,enterflag=0;  			// 确认键按下与否标志
              
	   key = keyscan();					// 调用键盘扫描函数
		switch(key)
   		{
      		case 0x11:						// 1行1列,数字0
				if (count<2)
				{
					wordbuf[count] = '0';
					count++;

                }
			break;
			case 0x21:						// 1行2列,数字1
				if (count<2)
				{
					wordbuf[count] = '1';
					count++;
				}
				break;			
			case 0x41:						// 1行3列,数字2
				if (count<2)
				{
					wordbuf[count] = '2';
					count++;
				}
				break;
     		case 0x81:						// 1行4列,数字3
				if (count<2)
				{
					wordbuf[count]= '3';
					count++;
				}
				break;
			case 0x12:						// 2行1列,数字4
				if (count<2)
				{
				    wordbuf[count] = '4';
					count++;
				}
				break;
			case 0x22:						// 2行2列,数字5
				if (count<2)
				{
					wordbuf[count]= '5';
					count++;
				}
				break;
			case 0x42:						// 2行3列,数字6
				if (count<2)
				{
					wordbuf[count]= '6';
					count++;
				}
				break;
			case 0x82:						// 2行4列,数字7
				if (count<2)
				{
					wordbuf[count]= '7';
					count++;
				}
				break;
			case 0x14:						// 3行1列,数字8
				if (count<2)
				{
					wordbuf[count] = '8';
					count++;
				}
				break;
			case 0x24:						// 3行2列,数字9
				if (count<2)
				{					
				    wordbuf[count]= '9';
					count++;
				}
				break;
			case 0x44:                  // 3行3列,确认键
                
			 { if(count==2)
				enterflag = 1;}				// 确认键按下
                  
				break;	
			case 0x84:						// 3行4列,取消键
			{
			     count = 0;					// 计数清零
                 //TempOut=1;
			   	for(j=0;j<6;j++)
                  wordbuf[j]=0x00;
			    for(j=0;j<2;j++)
              *(keyascan+j)=0x00;
				  }
				break;
			default:break;
		}

		if ( enterflag==1)					// 如果按下确认键
		{
             wordbuf[2]='m';
			  wordbuf[3]='V';
			enterflag = 0; 					// 标志位置回0
			  count = 0;						// 密码位计数器清零
			    for(j=0;j<2;j++)
              *(keyascan+j)=wordbuf[j];
                 // change=0;
		
		}
}
       
/*************************lcd1602程序**************************/

void wr_com(unsigned char com)//写状态字//
{ 
	delay1ms(1);
	RS=0;
	RW=0;
	EN=0;
	P0=com;               
	delay1ms(1);
	EN=1;
	delay1ms(1);
	EN=0;
}

void wr_dat(unsigned char dat)//写数据//
{ 
	delay1ms(1);;
	RS=1;
	RW=0;
	EN=0;
	P0=dat;
	delay1ms(1);
	EN=1;
	delay1ms(1);
	EN=0;
}

void lcd_init()//初始化设置//
{
	delay1ms(15);
	wr_com(0x38);delay1ms(5);   
	wr_com(0x08);delay1ms(5);
	wr_com(0x01);delay1ms(5);
	wr_com(0x06);delay1ms(5);
	wr_com(0x0c);delay1ms(5);
}


void display(unsigned char *p)//显示//
{
	while(*p!='\0')
	{
		wr_dat(*p);
		p++;
		delay1ms(1);
	}
}

init_play()//初始化显示
{ 
	lcd_init();
    wr_com(0x80);
	display(str1);
	wr_com(0xc0);
	display(str2);
    wr_com(0x86);
    wr_dat(wordbuf[0]);//显示十位 
    wr_com(0x87);
    wr_dat(wordbuf[1]);//显示个位 
    wr_com(0x88);
    wr_dat(wordbuf[2]);//显示m
	wr_com(0x89);
    wr_dat(wordbuf[3]);//显示V
}

/*jsdisdisplay()//计数显示
{ 
	
	wr_com(0x8A);
	wr_dat(JS[0]);//显示'0'
	wr_com(0x8B);
	wr_dat(JS[1]);//显示'0' 
	wr_com(0x8C);
	wr_dat(JS[2]);//显示':'
	wr_com(0x8D);
	wr_dat(JS[3]);//显示'0'
	wr_com(0x8E);
	wr_dat(JS[4]);//显示'0'

   }   */


void main()
{
	init_play();//初始化显示
	//jsdisdisplay();
	while(1)
	{
	    getscan();
		if(key!=0)
		init_play();
		da_out531(1000);
		
	}	
}

⌨️ 快捷键说明

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