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

📄 lock.c

📁 PIC单片机C语言程序设计实例精粹
💻 C
字号:
#include "lock.h"

void write_dat_320240(INT8U data)
{
	unsigned int i;
	check_busy_320240();
	//for(i=0;i<1000;i++);    //根据速度来调整延时
	PORTD =data;
	dat_320240;
	cs_320240;
	wr_320240;
	for(i=0;i<500;i++);
	nwr_320240;
	ncs_320240;
}


void write_com_320240(INT8U com)
{
	unsigned int i;
	check_busy_320240();
	//for(i=0;i<1000;i++);       //根据速度来调整延时
	PORTD =com;
	com_320240;
	cs_320240;
	wr_320240;	
	for(i=0;i<500;i++);
	nwr_320240;
	ncs_320240;
}


void check_busy_320240(void)
{
  		unsigned int temp=0x40;
		while(temp&40)
		{
			dat_320240;
			cs_320240;
			re_320240;
			TRISD = 0x40;  //D6
			temp= LCD_DAT;
			nre_320240;
		}
		TRISD = 0x0;  //D6
		ncs_320240;
}	

//系统设置参数,8个参数                                                 
unsigned int system_para[]={0x30,0x87,0x07,0x27,0x2b,0xf0,0x28,0x00};
//显示区域设置参数,10个参数                                           
unsigned int scroll_para[]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00};
void LCD320240_Init(void)
{ 
	INT8U i;
	i=0;
	ncs_320240;
	dat_320240;
	nre_320240;
	nwr_320240;
	write_com_320240(0x40);  /*初始化,显示窗口设置命令*/  
	for(i=0;i<8;i++)      /*写初始化参数*/
	{
		write_dat_320240(system_para[i]);
	}
	write_com_320240(0x44);  /*设置显示区域命令*/  
	for(i=0;i<10;i++)     /*写显示区域设置参数*/
	{
		write_dat_320240(scroll_para[i]);
	}
	write_com_320240(0x5a); 	/*设置点单元卷动位置命令*/
	write_dat_320240(0x00);    
	write_com_320240(0x5b); 	/*设置合成显示方式命令*/
	write_dat_320240(0x00);    /*设置参数:一三区为文本属性,二重"或"合成*/
	write_com_320240(0x5d); /*设置光标形状*/
	write_dat_320240(0x0f);
	write_dat_320240(0x8f);
	clear_screen_320240();      /*清屏*/
	write_com_320240(0x59); /*DISP ON/OFF 命令*/
	write_dat_320240(0x55);    /*设置参数:显示一~四区开显示,光标闪  */
}  

#define uint unsigned int
void Line(uint row1, uint col1, uint row2, uint col2, uint style)
{
	uint i,n;
	Set_Grap_Addr(row1,col1);  //设置图形区域地址
	if(row1==row2)           
	{
		Cursor_Move('R');
		n=col2-col1;  
		lcd_write_com(0x42);
		for(i=0;i<n;i++)
		{ 
			if(style==1)
			{
				lcd_write_dat(0xff);
			}
			else if(style==2)
			{
				lcd_write_dat(0xa6);
			}
			else if(style==3)
			{
				lcd_write_dat(0xaa);
			}
		}
	}
	else if(col1==col2)
    {
		Cursor_Move('D');
		n=row2-row1;
		lcd_write_com(0x42);
		for(i=0;i<n;i++)
		{ 
			lcd_write_dat(0x01);
		}
    }
}

void Display_8_16(uint row, uint col, uint *string)
{ 
	uint strlen;               //字符串长度变量
	uint temp_char;           //临时显示字符变量
	uint i,j;                  //显示字符循环变量
	i=0;
	strlen=0;
	Set_Grap_Addr(row,col);   //设置图形显示区域显示地址
	Cursor_Move('D');
	//得到*string的长度
	while(string[strlen]!=0x00)
    {
		strlen++;
	}
	/*显示*string*/
	for(i=0;i<strlen;i++)
    { 
		Set_Grap_Addr(row,col);
		temp_char=string[i];
		if( (temp_char>=0x20) && (temp_char<=0x7f) )  //判断是否为可显示字符
		{   
			lcd_write_com(0x42);   //数据写入显示缓冲区命令
			for(j=0;j<16;j++)       //显示一个字符
			{
				lcd_write_dat(ASC_MSK[(temp_char-0x20)*16+j]); 
			}
		}
		else {break;} 
		col++;
	}
}


void Display_37_37(uint row, uint col, uint *string)
{  
	uint i,j;
	Cursor_Move('R');    //光标移动方向向右
	for(i=0;i<37;i++)
    { 
		Set_Grap_Addr(row,col);       //设置图型地址
		lcd_write_com(0x42);
		for(j=0;j<5;j++)
		{
			lcd_write_dat(string[i*2+j]);
		}
		row++;
	}
}

void re_array()
{
	int temp,i,j;
	for(i=0;i<6;i++)
	{
loop: temp=random(10);
	  for(j=0;j<i;j++)
		  if(array_key[i]==temp)
			  goto loop;           //若获取的随机值等于以前的,则重新获取
		  array_key[i]=temp;			//保存随机值
	}
	lcd_refresh();
}

void lcd_refresh()
{
	draw_outline();		//绘制外框
	draw_arry();			//绘制随机数组
	draw_3key();			//绘制三个汉字按键"确定""后退""取消"
	draw_window();		//绘制密码输入框
}

void spi_write(char data)
{
	int8 i = 7;
	uint8 mask[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
	for(; i >= 0; i--) {
		SPI_CLK_LOW;
		if( (data & mask[i]) >> i) ==1)
			SPI_DAT_HIGHT;
		else
			SPI_DAT_LOW
			delay_ms(10);   /*等待适当的时间,以等待数据稳定*/
		SPI_CLK_HIGHT;
		delay_ms (10);
	}
	
	uint ad7843_x(void)
	{
		spi _write(0x90);       //将S标志位置一,表示使能传输
		return spi_read();
	}
	uint ad7843_ y(void)
	{
		spi_write (0x0d0);    //将S标志位置一,表示使能传输
		return spi_read();
	}
	
	uint average(unsigned int value[10]) 
	{
		unsigned int max,min,i,ave=0,sum=0;
		max = value[0];
		min = value[0];
		for(i=0;i<10;i++)                     //比较法  确定最大值和最小值
		{
			if(max<value[i])
				max=value[i];
			if(min>value[i])
				min=value[i];
			sum+=value[i];
		}
		ave=(sum-min-max)/8;               //求平均值
		return ave;
	}
	
	int input_num(int x,int y) 
	{
		int num;
		if( (x>=5 && x<=55) && (y>=5 && y<=55) ) 		num = 1;
		if( (x>=65 && x<=115) && (y>=5 && y<=45) )	 	num = 2;
		if( (x>=125 && x<=175) && (y>=5 && y<=45) ) 	num = 3;
		........        //此处省略判断分支,读者可自行加上
			return num;
	}
	int process_confirm()
	{
		int i,j;
		for(i=0;i<6;i++)
			if(input_key[i]!=store_key[i])
			{
				for(i=0;i<6;i++)
					input_key[i]=0;	//清空密码缓存区
				point_i=0;	//归零
				return 0;		//若密码不对,则返回0
			}
			return 1;			//若密码全对,则返回1
	}
	
	void process_input(int intput)
	{
		input_key[point_i]=array_key[input];	// array_key用来保存密码排列
		point_i++;				//point_i是全局变量,用来保存指向的密码
	}
	
	void process_backspace()
	{
		point_i--;
	}
	

⌨️ 快捷键说明

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