1、信息与电气工程学院单片机课程设计 题 目 液晶显示密码锁 学 院 信息与电气工程学院 专 业 电气工程及其自动化 年 级 电气 姓 名 学 号 指导教师 时 间 2013年 7月 4日 原理图:程序:/-名称:液晶显示密码锁#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include#includebit LCD_Check_Busy(void);/判忙函数声明 1602void LCD_Write_Com(unsigned char com); / 写入命令函数void LCD_Write_Data(unsigned char Data); / 写入数据
2、函数void LCD_Clear(void); / 清屏函数void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);/写入字符串函数void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data); / 写入字符函数void LCD_Init(void); /初始化函数 1602void DelayUs2x(unsigned char t); / uS延时函数,含有输入参数 unsigned char t?void DelayMs
3、(unsigned char t); /mS延时函数,含有输入参数 unsigned char t,unsigned char KeyScan(void); /键盘扫描函数,使用行列反转扫描法 按键扫描函数,返回扫描键值unsigned char KeyPro(void); /按键值处理函数,返回扫键值unsigned char code password=0,0,0,0,0;/设定的密码#define KeyPort P3 /键盘定义#define CHECK_BUSY /1602sbit RS = P22; /定义端口 sbit RW = P21;sbit EN = P20;#define
4、 RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0 /1602void main() unsigned char num,i,j; unsigned char passwordtemp5; /最大输入5个 unsigned char inputtimes; /密码输入错误次数 unsigned char passwordlength,PLEN; /输入密码长度,实际密码长度 bit Fla
5、g; PLEN=sizeof(password)/sizeof(password0);/用于计算出实际密码长度 LCD_Init(); /初始化液晶屏 DelayMs(10); /延时用于稳定,可以去掉 LCD_Clear(); /清屏 LCD_Write_String(0,0, welcome! ); /写入第一行信息,主循环中不再更改此信息,所以在while之前写入 LCD_Write_String(0,1,Input password!); /写入第二行信息,提示输入密码while (1) /主循环 P0=0xf0; num=KeyPro(); /扫描键盘 if(num!=0xff) /
6、如果扫描是按键有效值则进行处理 if(i=0) /输入是第一个字符的时候需要把改行清空,方便观看密码 LCD_Write_String(0,1, );/清除该行if(i5) passwordtempi=num; LCD_Write_Char(i,1,*);/输入的密码用*代替 i+; /输入数值累加if(i=5) /密码输入到最大值6,表示输入结束,需要进行比对 passwordlength=i-1; /计算输入密码长度 i=0; /计数器复位 if(passwordlength=PLEN)/长度相等则比较,否则直接输出错误 Flag=1;/先把比较位置1 for(j=0;j);/密码正确显示
7、的信息 P0=0xff; inputtimes=0;/输入正确则次数清零,重新计数 Flag=0; /清除正确标志 else LCD_Write_String(0,1, );/清除该行LCD_Write_String(0,1,Wrong! Retry!);/密码错误,提示重新输入inputtimes+;/连续输入错误,则次数累加 P0=0xf0;if(inputtimes=15) LCD_Write_String(0,1, );/清除该行 LCD_Write_String(0,1,Wrong 15 times!);/密码错误,提示重新输入 while(1);/停止该位置,重启电源后才能输入,实
8、际实用中则需要等到一定时间后才能再次输入。 /*LCD1602 引脚定义 1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK*/ bit LCD_Check_Busy(void) /判忙函数 #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80);#else return 0;#endif void LCD_Write_Com(unsigned char com) / 写入命令
9、函数 while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; void LCD_Write_Data(unsigned char Data) / 写入数据函数 while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; void LCD_Clear(void) / 清屏函数 LCD_Write_Com(0x01); DelayMs(5); void LCD_Write
10、_String(unsigned char x,unsigned char y,unsigned char *s) /写入字符串函数 while (*s) LCD_Write_Char(x,y,*s); s +; x+; void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) / 写入字符函数 if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); void LCD_Init(void)
11、 /初始化函数 LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ void DelayUs2x(unsign
12、ed char t) / uS延时函数,含有输入参数 unsigned char t? while(-t);void DelayMs(unsigned char t) /mS延时函数,含有输入参数 unsigned char t, while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245); unsigned char KeyScan(void) /键盘扫描函数,使用行列反转扫描法 按键扫描函数,返回扫描键值 unsigned char cord_h,cord_l;/行列值中间变量 KeyPort=0xF0; /行线输出全为0 cord_h=KeyPor
13、t&0xf0; /读入列线值 if(cord_h!=0xf0) /先检测有无按键按下 DelayMs(10); /去抖 if(KeyPort&0xf0)!=0xf0) cord_h=KeyPort&0xf0; /读入列线值 KeyPort=cord_h|0x0f; /输出当前列线值 cord_l=KeyPort&0x0f; /读入行线值 while(KeyPort&0x0f)!=0x0f);/等待松开并输出 return(cord_h+cord_l);/键盘最后组合码值 return(0xff); /返回该值unsigned char KeyPro(void) /按键值处理函数,返回扫键值 s
14、witch(KeyScan() case 0xe7:return 0;break;/0 按下相应的键显示相对应的码值 case 0xd7:return 0;break;/1 case 0xb7:return 0;break;/2 case 0x77:return 0;break;/3 case 0xeb:return 0;break;/4 case 0xdb:return 0;break;/5 case 0xbb:return 0;break;/6 case 0x7b:return 0;break;/7 case 0xed:return 0;break;/8 case 0xdd:return 0;break;/9 case 0xbd:return 0;break;/a case 0x7d:return 0;break;/b case 0xee:return 0;break;/c case 0xde:return 0;break;/d case 0xebe:return 0;break;/e case 0x7e:return 0;break;/f default:return 0xff;break; 参考文献:1万隆、巴奉丽等编.单片机原理及应用技术.清华大学出版社,2010.32谢伟成、杨加国等编.单片机原理及应用C51程序设计.清华大学出版社