因为你显示密码是时候不应携返轮该都是现实*****吗?
你只需把键盘写入的数据存在一个数组中,然后跟密码数组对比就好了。
还有就是值得注意的是数据类型问题。
输入的键值看你处理的方式而定,密码存放的格式,还有输出显示的是ascll码。注意转换。
下面附带一段51的1602LCD的C程序,自己仔细琢磨。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[16]="abcdefghijklmnyz"
uchar table1[16]="0123456789abcdef"
sbit lcden=P2^0
sbit lcdrs=P2^1
sbit dula=P2^6
sbit wela=P2^7
uchar num
void delay(uint z)
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void write_com(uchar com)
{ wela=0
lcdrs=0
P0=com
delay(5)
lcden=1
delay(5)
lcden=0
}
void write_data(uchar date)
{ wela=0
lcdrs=1
P0=date
delay(5)
lcden=1
delay(5)
lcden=0
}
void init()
{
lcden=0
write_com(0x38)
write_com(0x0e)
write_com(0x06)
write_com(0x01)
write_com(0x80)
}
void main()
{
init()
for(num=0num<16num++)
{
write_data(table[num])
delay(20)
}
write_com(1)
write_com(0x80+0x40)
for(num=0num<16num++)
{
write_data(table1[num])
delay(20)
}
while(1)
}
* 1、LCD第一行显示: www.saxmcu.com* LCD第二行显示: SP-28A--DIY
* 2、先将两行字符写入DDRAM中,然后从右至左逐字移出显毕仿示。
* 3、在指定位置停留1.6秒后,闪烁2次,清屏。
* 4、反复循环上述显示方手察纤式。
*******************************************************************
LCD_RS EQU P2.0
LCD_RW EQU P2.1
LCD_EN EQU P2.2
*******************************************************************
ORG 0000H
AJMP MAIN
ORG 0030H
*******************************************************************
MAIN:
MOV SP,#60H
ACALL LCD_INIT LCD初始化
MAIN1:
ACALL CLR_LCD 清LCD
MOV A,#90H在第一行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE1 第一行字符串的起始地址没源送入DPTR。
ACALL WRITE
MOV A,#0D0H 在第二行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE2 第二行字符串的起始地址送入DPTR。
ACALL WRITE
MOV R3,#10H 向左移动16格
LOOPA:
MOV A,#18H 字符同时左移一格
ACALL LCD_CMD
MOV R5,#03H 延时375MS
ACALL DELAY125MS
DJNZ R3,LOOPA
ACALL DELAY4延时1.6s
ACALL DELAY4
MOV R4,#02H设置闪烁次数
ACALL FLASH 开始闪烁
AJMP MAIN1
LINE1:
DB "www.saxmcu.com",00H
LINE2:
DB "SP-28A--DIY",00H
***************************************************************
LCD初始化设定子程序
***************************************************************
LCD_INIT:
ACALL DELAY5MS延时15MS
ACALL DELAY5MS等待LCD电源稳定
ACALL DELAY5MS
MOV A,#38H 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC 不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC 不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC 不进行LCD忙检测
ACALL DELAY5MS
MOV A,#08H 显示关
ACALL LCD_CMD进行LCD忙检测
MOV A,#01H 清除屏幕
ACALL LCD_CMD进行LCD忙检测
MOV A,#0CH显示开,关光标
ACALL LCD_CMD 进行LCD忙检测
RET
***************************************************************
清LCD子程序
***************************************************************
CLR_LCD:
MOV A,#01H清除屏幕
ACALL LCD_CMD 进行LCD忙检测
RET
***************************************************************
写指令数据到LCD
RS=L,RW=L,D0-D7=指令码,E=高脉冲
***************************************************************
LCD_CMD:
CALL CHECKBUSY
LCD_CMD_NC:
CLR LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
***************************************************************
写显示数据到LCD
RS=H,RW=L,D0-D7=数据,E=高脉冲
***************************************************************
LCD_WDATA:
ACALL CHECKBUSY
SETB LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
***************************************************************
检测LCD控制器忙状态
读数据
RS=L,RW=H,E=H,输出:D0-D7=数据
P0.7=1,LCD忙,等待。P0.7=0,LCD闲,可以进行读写 *** 作。
***************************************************************
CHECKBUSY:
PUSH ACC
MOV P0,#0FFH
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
BUSYLOOP:
NOP
JB P0.7,BUSYLOOP
CLR LCD_EN
POP ACC
RET
***************************************************************
发送字符串子程序
***************************************************************
WRITE:
PUSH ACC
WRITE1:
CLR A
MOVC A,@A+DPTR
JZ WRITE2
INC DPTR
ACALL LCD_WDATA
JMP WRITE1
WRITE2:
POP ACC
RET
***************************************************************
闪烁子程序
***************************************************************
FLASH:
MOV A,#08H关闭显示
ACALL LCD_CMD
ACALL DELAY4
MOV A,#0CH开显示,关闭光标
ACALL LCD_CMD
ACALL DELAY4
DJNZ R4,FLASH
RET
***************************************************************
延时5MS子程序
LCD初始化使用
***************************************************************
DELAY5MS:
MOV R6,#10
DL1:
MOV R7,#249
DL2:
DJNZ R7,DL2
DJNZ R6,DL1
RET
***************************************************************
延时125MS子程序
字符串移动时使用
***************************************************************
DELAY125MS:
DL3:
MOV R6,#250
DL4:
MOV R7,#249
DL5:
DJNZ R7,DL5
DJNZ R6,DL4
DJNZ R5,DL3
RET
***************************************************************
延时800MS子程序
闪烁时使用
***************************************************************
DELAY4:
MOV R5,#40
DL6:
MOV R6,#100
DL7:
MOV R7,#100
DL8:
DJNZ R7,DL8
DJNZ R6,DL7
DJNZ R5,DL6
RET
***************************************************************
END
可以吧?
ORG 0000HLJMP START
ORG 0100H
START:MOV A,#30H R:10K~20KR3.VEEP1.3P1.2P1.1P1.0P3.0P3.3P3.19.DB210.DB3CML5.R/W7.DB08.DB16.E4.RSMPU2.VCC(+5V)1.VSS(0V)2.VDD1.VSS
LCALL OUTI
LCALL MS4MS
MOV A,#30H
LCALL OUTI
LCALL MS100US
MOV A,#30H
LCALL OUTI
LCALL BUSY
MOV A,#20H
LCALL OUTI
MOV A,#28H FUNC:DL=1 FOR BITS,N=1 FOR 2 LINES
LCALL OUTI
MOV A,#01H CLEAR SCREEN
LCALL OUTI
MOV A,#08H
LCALL OUTI
MOV A,#0CH ON DISPLAY
lcall outi
MOV A,#06H AC INCREMENT
LCALL OUTI
MOV A,#80H DDRAM ADDRESS
LCALL OUTI
MOV R1,50H
TTR1:MOV A,#0FEH DISPLAY "SPACE"
LCALL OUTD
DJNZ R1,TTR1
MOV A,#02H DISPLAY RETURN
LCALL OUTI
LCALL MS40
LCALL MS40
lcall ms40
MOV R1,#50H
TTR2:MOV A, #0FFH DISPLAY "BLACK"
LCALL OUTD
DJNZ R1,TTR2
MOV A,#02H
LCALL OUTI
LCALL MS40
LCALL MS40
lcall ms40
MOV A,#80H
MOV R3,A
LCALL OUTI
MOV R1,#28H
MOV A,#61H
MOV R7,A
TTR4:LCALL OUTD
INC R3
MOV A,R3
LCALL OUTI
INC R7
MOV A,R7
DJNZ R1,TTR4
MOV A,#0C0H
MOV R3,A
LCALL OUTI
MOV R1,#28H
MOV A,#30H
MOV R7,A
TTR5:LCALL OUTD
INC R3
MOV A,R3
LCALL OUTI
INC R7
MOV A,R7
DJNZ R1,TTR5
LCALL MS40
LCALL MS40
LCALL MS40
LJMP START
MS4MS:MOV R5,#08H
MS1: MOV R4,#0FFH
MS2: DJNZ R4,MS2
DJNZ R5,MS1
RET
MS100US:MOV R5,#12H
MS3: MOV R4,#1FH
MS4: DJNZ R4,MS4
DJNZ R5,MS3
RET
BUSY:SETB P3.1
SETB P3.1
CLR P3.3
CLR P3.3
TT00:SETB P3.0
SETB P3.0
MOV A,P1
CLR P3.0
CLR P3.0
ANL A,#80H
JNZ TT00
RET
CHANGE:MOV 13H,A
SWAP A
MOV 12H,A
ANL 13H,#0F0H HIGH 4 BITS
ANL 12H,#0F0H LOW 4 BITS
RET
OUT INSRCTION
OUTI:LCALL CHANGE
LCALL BUSY
CLR P3.1
CLR P3.1
CLR P3.3
CLR P3.3
SETB P3.0
SETB P3.0
MOV A,13H
MOV P1,A
CLR P3.0
CLR P3.0
ANL P1,#07H
SETB P3.0
SETB P3.0
MOV A,12H
MOV P1,A
CLR P3.0
CLR P3.0
MOV R4,#02H DELAY 1MS
TM4: MOV R5,#0FFH
TM5: DJNZ R5,TM5
DJNZ R4,TM4
RET
OUT DATA
OUTD:LCALL CHANGE
LCALL BUSY
CLR P3.1
CLR P3.1
SETB P3.3
SETB P3.3
SETB P3.0
SETB P3.0
MOV A,13H
MOV P1,A
CLR P3.0
CLR P3.0
ANL P1,#00
SETB P3.0
SETB P3.0
MOV A,12H
MOV P1,A
CLR P3.0
CLR P3.0
MOV R4,#0FFH DELAY 0.5MS
TM2: DJNZ R4,TM2
RET
MS40:MOV R4,#0FFH DELAY ABOUT 132MS
MS5: MOV R5,#0FFH
MS6: DJNZ R5,MS6
DJNZ R4,MS5
RET
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)