单片机课程设计_第1页
单片机课程设计_第2页
单片机课程设计_第3页
单片机课程设计_第4页
单片机课程设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息与电气工程学院单片机课程设计 题 目 液晶显示密码锁 学 院 信息与电气工程学院 专 业 电气工程及其自动化 年 级 电气 姓 名 学 号 指导教师 时 间 2013年 7月 4日 原理图:程序:/-名称:液晶显示密码锁#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include#includebit LCD_Check_Busy(void);/判忙函数声明 1602void LCD_Write_Com(unsigned char com); / 写入命令函数void LCD_Write_Data(unsigned char Data); / 写入数据函数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(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 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 Flag; 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) /如果扫描是按键有效值则进行处理 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);/密码正确显示的信息 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);/停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。 /*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) / 写入命令函数 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_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) /初始化函数 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(unsigned 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=KeyPort&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) /按键值处理函数,返回扫键值 switch(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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论