单片机课程设计.docx
- 文档编号:10064333
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:12
- 大小:172.60KB
单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(12页珍藏版)》请在冰点文库上搜索。
单片机课程设计
信息与电气工程学院
单片机课程设计
题目液晶显示密码锁
学院信息与电气工程学院
专业电气工程及其自动化
年级电气
姓名
学号
指导教师
时间2013年7月4日
原理图:
程序:
//-----------名称:
液晶显示密码锁
#include
#include
#include
bitLCD_Check_Busy(void);//判忙函数声明1602
voidLCD_Write_Com(unsignedcharcom);//写入命令函数
voidLCD_Write_Data(unsignedcharData);//写入数据函数
voidLCD_Clear(void);//清屏函数
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s);//写入字符串函数
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData);//写入字符函数
voidLCD_Init(void);//初始化函数1602
voidDelayUs2x(unsignedchart);//uS延时函数,含有输入参数unsignedchart?
voidDelayMs(unsignedchart);//mS延时函数,含有输入参数unsignedchart,
unsignedcharKeyScan(void);//键盘扫描函数,使用行列反转扫描法按键扫描函数,返回扫描键值
unsignedcharKeyPro(void);//按键值处理函数,返回扫键值
unsignedcharcodepassword[]={0,0,0,0,0};//设定的密码
#defineKeyPortP3//键盘定义
#defineCHECK_BUSY//1602
sbitRS=P2^2;//定义端口
sbitRW=P2^1;
sbitEN=P2^0;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0//1602
voidmain()
{
unsignedcharnum,i,j;
unsignedcharpasswordtemp[5];//最大输入5个
unsignedcharinputtimes;//密码输入错误次数
unsignedcharpasswordlength,PLEN;//输入密码长度,实际密码长度
bitFlag;
PLEN=sizeof(password)/sizeof(password[0]);//用于计算出实际密码长度
LCD_Init();//初始化液晶屏
DelayMs(10);//延时用于稳定,可以去掉
LCD_Clear();//清屏
LCD_Write_String(0,0,"welcome!
");//写入第一行信息,主循环中不再更改此信息,所以在while之前写入
LCD_Write_String(0,1,"Inputpassword!
");//写入第二行信息,提示输入密码
while
(1)//主循环
{
P0=0xf0;
num=KeyPro();//扫描键盘
if(num!
=0xff)//如果扫描是按键有效值则进行处理
{
if(i==0)//输入是第一个字符的时候需要把改行清空,方便观看密码
LCD_Write_String(0,1,"");//清除该行
if(i<5)
{
passwordtemp[i]=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 Flag=Flag&&(passwordtemp[j]==password[j]);//比较输入值和已有密码 } if(Flag)//如果比较全部相同,标志位置1 { LCD_Write_String(0,1,"");//清除该行 LCD_Write_String(0,1,"RightOpen! >>>>");//密码正确显示的信息 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,"Wrong15times! ");//密码错误,提示重新输入 while (1);//停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。 } } } } } } /*LCD1602 引脚定义1-VSS2-VDD3-V04-RS5-R/W6-E7-14DB0-DB715-BLA16-BLK*/ bitLCD_Check_Busy(void)//判忙函数 { #ifdefCHECK_BUSY DataPort=0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return(bit)(DataPort&0x80); #else return0; #endif } voidLCD_Write_Com(unsignedcharcom)//写入命令函数 { while(LCD_Check_Busy());//忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort=com; _nop_(); EN_CLR; } voidLCD_Write_Data(unsignedcharData)//写入数据函数 { while(LCD_Check_Busy());//忙则等待 RS_SET; RW_CLR; EN_SET; DataPort=Data; _nop_(); EN_CLR; } voidLCD_Clear(void)//清屏函数 { LCD_Write_Com(0x01); DelayMs(5); } voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)//写入字符串函数 { while(*s) { LCD_Write_Char(x,y,*s); s++;x++; } } voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)//写入字符函数 { if(y==0) { LCD_Write_Com(0x80+x); } else { LCD_Write_Com(0xC0+x); } LCD_Write_Data(Data); } voidLCD_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);/*显示开及光标设置*/ } voidDelayUs2x(unsignedchart)//uS延时函数,含有输入参数unsignedchart? { while(--t); } voidDelayMs(unsignedchart)//mS延时函数,含有输入参数unsignedchart, { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } unsignedcharKeyScan(void)//键盘扫描函数,使用行列反转扫描法按键扫描函数,返回扫描键值 { unsignedcharcord_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);//返回该值 } unsignedcharKeyPro(void)//按键值处理函数,返回扫键值 { switch(KeyScan()) { case0xe7: return0;break;//0按下相应的键显示相对应的码值 case0xd7: return0;break;//1 case0xb7: return0;break;//2 case0x77: return0;break;//3 case0xeb: return0;break;//4 case0xdb: return0;break;//5 case0xbb: return0;break;//6 case0x7b: return0;break;//7 case0xed: return0;break;//8 case0xdd: return0;break;//9 case0xbd: return0;break;//a case0x7d: return0;break;//b case0xee: return0;break;//c case0xde: return0;break;//d case0xebe: return0;break;//e case0x7e: return0;break;//f default: return0xff;break; } } 参考文献: [1]万隆、巴奉丽等编.单片机原理及应用技术.清华大学出版社,2010.3 [2]谢伟成、杨加国等编.单片机原理及应用C51程序设计.清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计