单片机课程设计报告仿手机键盘.doc

上传人:laozhun 文档编号:2393891 上传时间:2023-02-17 格式:DOC 页数:30 大小:382KB
返回 下载 相关 举报
单片机课程设计报告仿手机键盘.doc_第1页
第1页 / 共30页
单片机课程设计报告仿手机键盘.doc_第2页
第2页 / 共30页
单片机课程设计报告仿手机键盘.doc_第3页
第3页 / 共30页
单片机课程设计报告仿手机键盘.doc_第4页
第4页 / 共30页
单片机课程设计报告仿手机键盘.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《单片机课程设计报告仿手机键盘.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告仿手机键盘.doc(30页珍藏版)》请在三一办公上搜索。

1、单 片 机 课 程 设 计 报 告课题:仿手机键盘报告人:XXX学号:XXXX班级:XXXX 目 录一、手机键盘使用说明2(一)键盘说明2(二)“时钟”模式2(三)“设置”模式2(四)“手机”模式3二、手机键盘设计说明4(一)设计要求4(二)硬件电路51、CPU52、矩阵键盘63、LCD74、蜂鸣器7(三)流程图81、时钟模式82、设置模式84、手机模式95、定时器010(四)源程序11三、课程设计心得体会29一、 手机键盘使用说明(一)键盘说明1、键盘按键对应键值:C840D951EA62FB732、定义双击:2s间隔内按下同一数字键(二)“时钟”模式键盘键值对应功能:0(设置):按下设置键

2、进入设置模式1(切换):按下切换键进入手机模式(三)“设置”模式键盘键值对应功能:0(移位):光标在年、月、日、星期、时、分、秒之间循环移位1(加):光标对应的时间(日期)加一2(减):光标对应的时间(日期)减一3(返回):返回时钟模式(四)“手机”模式键盘键值对应功能:1)数字键:0(0,。?):单击显示0,双击显示0,。?,长按循环显示0,。?1(1abc):单击写入”1”,双击写入”1abc”,长按循环写入”1”、”a”、”b”、”c”2(2def):同上3(3ghi):同上4(4jkl):同上5(5mno):同上6(6pqr):同上7(7stu):同上8(8vwx):同上9(9yz )

3、:同上(第四个字符是空格)2)功能键:A(删除):删除光标前一个字符B(退格):光标左移C(右移):光标右移D(清屏):LCD清屏E(跳转):返回时钟模式F(打电话):按下蜂鸣器模拟电话响,再次按下挂断电话二、 手机键盘设计说明(一)设计要求显示方式:1602LCD编程语言:汇编1、任务利用键盘矩阵仿照手机键盘,每个按键均集成多个按键字符,在LCD上分别显示2、要求1)手机键盘对应字符:2)依次按下不同按键时所显示的是按键上的第一个字符,如果在2S间隔内按下同一按键,该按键上的字符将被依次显示,如果同一按键上的两次连续按键时间间隔超过2S,则取字符位置归0,即显示该按键的第一个字符3)可模拟拨

4、打电话号码,“*”键可实现退格功能,“#”键可实现清除功能4)字符显示和拨打电话,可通过按键选择控制5)按键时,可利用蜂鸣器发出提示音6)不工作时,显示北京时间,可调整3、附加功能1)“清屏“键可实现LCD清屏2)“右移“键可实现光标右移3)长按数字键可循环显示按键对应的所有字符(二)硬件电路1、CPU2、矩阵键盘3、LCD4、蜂鸣器(三)流程图1、时钟模式扫描键盘显示北京时间键值为0键值为1进入设置模式时钟模式进入手机模式YYNN2、设置模式设置模式扫描键盘显示北京时间键值为0键值为1光标移位时间加一11111键值为2键值为3时间减一11111返回时钟模式设置模式NNNYYYYNNYYYYY

5、NYNYNY手机模式4、手机模式LCD初始化手机键盘扫描YN有键按下IDLE清零按键松开YY键值09N进入数字键处理Y删除前一个字符键值为AY光标左移键值为BY光标右移键值为CY键值为DLCD清屏Y返回时间模式键值为ENY打电话/挂断键值为F开始5、定时器0MS=MS+1MS等于24NYS0=S0+1,IDLE+S0等于60YNM0=M0+1M0等于60NYH0=H0+1H0等于24NYH0=0结束(四)源程序LCD_RSEQU P3.6 LCD_RWEQU P3.5 LCD_ENEQU P3.3BUZZEREQU P2.6DIALINGBIT 01H ;打电话CIRCLEBIT 02HYEA

6、REQU46HMONTHEQU47HDAYEQU48HWEEKEQU49HH0EQU50HM0EQU51HS0EQU52H MS0EQU53HKEY_BUFEQU36HIDL_SECEQU 37HIDLEEQU 38HDOU_SECEQU 39HSAMEEQU 40HCURSOREQU 41HDOU_NMSEQU 42HBUFEQU45HORG00HJMP MAINORG 0BHJMP TIM0ORG 1BHJMP TIM1MAIN:MOV SP,#60H ACALLLCD_INIT ;LCD初始化ACALLTIME_INIT ;计时器初始化MOVCURSOR,#00HMOVYEAR,#0MO

7、VMONTH,#1MOVDAY,#1MOVWEEK,#0MOVH0,#0MOVM0,#0MOVS0,#0MOVMS0,#0CLRDIALINGCLRCIRCLEACALLLCD_INITACALLWELCOMEBEGIN:ACALLLCD_INITACALLDISP_DATENEW_TIME:ACALLDISP_TIMEACALLKEY_TMOVA,KEY_BUFJZSET_TIMECJNEA,#1,NEW_TIMEJMPPHONESET_TIME:CLRTR0;关定时器0MOVA,#83H;定位光标ACALLLCD_CMDMOVA,#0EH;显示光标ACALLLCD_CMDST_K:ACAL

8、LKEY_TMOVA,KEY_BUFJNZST_1ACALLMOVEJMPST_KST_1:CJNEA,#1,ST_2ACALLINC_TJMPST_KST_2:CJNEA,#2,ST_3ACALLDEC_TJMPST_KST_3:CJNEA,#3,ST_KMOVA,#0CH ;关光标ACALLLCD_CMDSETBTR0 ;开定时器0JMPNEW_TIMEPHONE:ACALLSJ_INITSJ_k:ACALLKEYJMPSJ_KTABLE_W:DB WELCOME TO PHONE,00HTABLE_WEEK:DB Mon Tue Wed Thu Fri Sat Sun TABLE:DB0

9、,.?1abc2def3ghi4jkl5mno6pqr7stu8vwx9yz ;*欢迎子程序*WELCOME:MOVDPTR,#TABLE_WACALLWRITEWELCOM_K:ACALLKEY_TMOVA,KEY_BUFJNZWELCOM_KRET;*时间模式子程序*KEY_T:MOV P2,#0E0H ;全扫描,各列线都送低电平MOV P1,#00HMOV A,P1 ;读回各行线电平值ORL A,#0F0H ;只读低四位CPL A ;所读值置反JNZ KT_IN;不是全0说明有键按下MOVKEY_BUF,#0FFHRET;无键按下返回KT_IN:ACALL DELAY5MS ;调延时,等

10、待按合抖动过去ACALL DELAY5MS ;调延时,等待按合抖动过去ACALL DELAY5MS ;调延时,等待按合抖动过去ACALL DELAY5MS ;调延时,等待按合抖动过去MOV R2,#04H ;R2做计数器,存待扫描行数MOV R4,#7FH ;R4做指针,指示待扫描行数MOV R7,#00H ;R7用于决定键号,初值置以0KT_SCAN:MOV A,R4RL AMOV R4,A;以上三条调整待扫描行MOV P2,A;逐行扫描,被扫描行送低电平MOV P1,#00HMOV A,P1;读回各列线电平值MOV R3,#04H;R3做记数器,存被扫描行的待查列数KT_NEXT:RRC

11、A ;调整待查列JNC KT_FIND;被查列为低电平,被按键找到,转FINDINC R7 ;未找到,键号加一DJNZ R3,KT_NEXT ;被扫描行的待查列数不为0,转回NEXTDJNZ R2,KT_SCAN ;未找到所按键,返回MOVKEY_BUF,#0FFHRETKT_FIND:MOV KEY_BUF,R7MOVP2,#0E0HSETBTR1KT_LOOSEN:MOV A,P1ORLA,#0F0HCPL AJNZ KT_LOOSEN;以上几条重复全扫描,等待所按键松按CLRTR1RETDISP_DATE:MOVA,#80HACALLLCD_CMDMOVA,#32H ;2ACALLLCD

12、_WDATAMOVA,#30H ;0ACALLLCD_WDATAMOVA,YEAR ;年ACALLBCD_LCDMOVA,#2DH ;-ACALLLCD_WDATAMOVA,MONTH ;月ACALLBCD_LCDMOVA,#2DH ;-ACALLLCD_WDATAMOVA,DAY ;日ACALLBCD_LCDMOVA,#20HACALLLCD_WDATAMOVA,WEEK ;星期RLARLAADDA,#TABLE_WEEKMOVDPL,AMOVR3,#3WEEK1:CLRAMOVCA,A+DPTRACALLLCD_WDATAINCDPTRDJNZR3,WEEK1RETDISP_TIME:MO

13、VA,#0C0H ;跳转到第二行开头ACALLLCD_CMDMOVA,H0 ;时ACALLBCD_LCDMOVA,#3AH ;:ACALLLCD_WDATAMOVA,M0 ;分ACALLBCD_LCDMOVA,#3AH ;:ACALLLCD_WDATAMOVA,S0 ;秒ACALLBCD_LCDRETBCD_LCD:MOVB,#10DIVABACALLBCD_ASCIIACALLLCD_WDATAMOVA,BACALLBCD_ASCIIACALLLCD_WDATARETBCD_ASCII:ANLA,#0FHADDA,#30HRET;光标移动:MOVE:ACALLLCD_RCMDCJNEA,#8

14、CH,MOVE_1MOVA,#0C1HJMPMOVE_3MOVE_1:CJNEA,#0C7H,MOVE_2MOVA,#83HJMPMOVE_3MOVE_2:ADDA,#3MOVE_3:ACALLLCD_CMDRET INC_T:ACALLLCD_RCMDPUSHACCCJNEA,#83H,ID_1INCYEARMOVA,YEARCJNEA,#100,ID_4MOVYEAR,#0JMPID_4ID_1:CJNEA,#86H,ID_2INCMONTHMOVA,MONTHCJNEA,#13,ID_4MOVMONTH,#1JMPID_4ID_2:CJNEA,#89H,ID_3INCDAYMOVA,DA

15、YCJNEA,#31,ID_4MOVDAY,#1JMPID_4ID_3:CJNEA,#8CH,INCTINCWEEKMOVA,WEEKCJNEA,#7,ID_4MOVWEEK,#0ID_4:ACALLDISP_DATEPOPACCACALLLCD_CMDRETINCT:CJNEA,#0C1H,IT_1INCH0MOVA,H0CJNEA,#24,IT_3MOVH0,#0JMPIT_3IT_1:CJNEA,#0C4H,IT_2INCM0MOVA,M0CJNEA,#60,IT_3MOVM0,#0JMPIT_3IT_2:CJNEA,#0C7H,IT_3INCS0MOVA,S0CJNEA,#60,IT_

16、3MOVS0,#0IT_3:ACALLDISP_TIMEPOPACCACALLLCD_CMDRETDEC_T:ACALLLCD_RCMDPUSHACCCJNEA,#83H,DD_1DECYEARMOVA,YEARCJNEA,#0FFH,DD_4MOVYEAR,#99JMPID_4DD_1:CJNEA,#86H,DD_2DECMONTHMOVA,MONTHCJNEA,#0,DD_4MOVMONTH,#12JMPDD_4DD_2:CJNEA,#89H,DD_3DECDAYMOVA,DAYCJNEA,#0,DD_4MOVDAY,#30JMPID_4DD_3:CJNEA,#8CH,DECTDECWEE

17、KMOVA,WEEKCJNEA,#0FFH,DD_4MOVWEEK,#6DD_4:ACALLDISP_DATEPOPACCACALLLCD_CMDRETDECT:CJNEA,#0C1H,DECT_1DECH0MOVA,H0CJNEA,#0FFH,DECT_3MOVH0,#23JMPDECT_3DECT_1:CJNEA,#0C4H,DECT_2DECM0MOVA,M0CJNEA,#0FFH,DECT_3MOVM0,#59JMPDECT_3DECT_2:CJNEA,#0C7H,DECT_3DECS0MOVA,S0CJNEA,#0FFH,DECT_3MOVS0,#59DECT_3:ACALLDISP

18、_TIMEPOPACCACALLLCD_CMDRET;*手机模式子程序*SJ_INIT:MOVBUF,#0FFHMOVCURSOR,#0ACALLLCD_INITMOVA,#0EHACALLLCD_CMDRET;扫描键盘子程序:KEY:MOVP2,#0E0HMOVP1,#00HMOVA,P1ORLA,#0F0HCPLAJNZINRETIN:ACALLDELAY ACALLDELAYACALLDELAYMOVR4,#7FHMOVR5,#04HMOVR6,#00HSCAN:MOVA,R4RLAMOVR4,AMOVP2,AMOVP1,#00HMOVA,P1MOVR7,#04HSCAN_LIE:RRC

19、AJNCFINDINCR6DJNZR7,SCAN_LIEDJNZR5,SCANRETFIND:ACALLJUDGE ;判断是否双击MOVIDLE,#00HMOVSAME,R6ACALLGIVE_KEYACALLCLEAR ;清除按键时间SETBTR1 ;启动定时器1,记录按键时间MOV P2,#0E0HLOOSEN:MOVA,DOU_SECCJNEA,#02H,LOOSEN1 ;按键超过1秒,BUF=0(循环显示)MOVBUF,#00HMOVR7,#00HLOOSEN1:MOVP1,#00HMOV A,P1ORL A,#0F0HCPL AJNZ LOOSEN ;等待按键松开CLRTR1 ;关闭

20、定时器1CLRCIRCLECJNER6,#10,K1K1:JCKEY_DATA ;键值小于10跳转到数字键处理KEY_15: ;键值大于等于10为命令键MOVA,R6CJNEA,#0FH,KEY_14CPLDIALINGCLRTR1RETKEY_14:CJNEA,#0EH,KEY_13MOVA,#0CHACALLLCD_CMDJMPBEGINRETKEY_13:CJNEA,#0DH,KEY_12JMPPHONERET KEY_12:CJNEA,#0CH,KEY_11MOVA,CURSORJZKEY_12_1ACALLLCD_FOREDECCURSORKEY_12_1:RETKEY_11:CJN

21、EA,#0BH,KEY_10ACALLLCD_RCMDCJNEA,#80H,KEY_11_1RETKEY_11_1:ACALLLCD_BACK;INCCURSORRETKEY_10:ACALLLCD_DELE;RETKEY_DATA:MOVA,BUFCJNE A,#0,DATA1RETDATA1:CJNEA,#1,DATA2ACALLLCD_DIS_SINRETDATA2:ACALLLCD_DIS_COMRETGIVE_KEY:MOVA,R6MOVB,#04HMULABADDA,#TABLEMOVDPL,ARET;显示第一个字符子程序:LCD_DIS_SIN:CLRAMOVCA,A+DPTRA

22、CALLLCD_WCHARRET;显示全部字符子程序:LCD_DIS_COM:MOVR1,#3LCD_DIS_COM1:MOVA,#1MOVCA,A+DPTRACALLLCD_WCHARINCDPTRDJNZR1,LCD_DIS_COM1RET;长按循环显示子程序:LCD_CIRCLE:MOVA,#0MOVCA,A+DPTRACALLLCD_WCHARINCDPTRINCR7CJNER7,#4,CIRCLE1MOVR7,#00HMOVA,DPLSUBBA,#4MOVDPL,ACIRCLE1:RET;清除按键时间:CLEAR:MOVDOU_SEC,#0MOVDOU_NMS,#0;CLRDOUBL

23、ERET;判断是否双击:JUDGE:MOVA,R6CJNEA,SAME,JUDGE2MOVA,IDLECJNEA,#2,JUDGE1JUDGE1:JNCJUDGE2MOVA,BUFCJNEA,#1,JUDGE2MOVBUF,#2RETJUDGE2:MOVBUF,#1RET;写入一个字符到LCD子程序:LCD_WCHAR:ACALLLCD_MOVELCD_WCHAR_NL: ;直接覆盖写入ACALLLCD_WDATAACALLLCD_RCMDCJNEA,#90H,LCD_WCHAR1MOVA,#0C0HACALLLCD_CMDJMPLCD_WCHAR2LCD_WCHAR1: CJNEA,#0D1

24、H,LCD_WCHAR2ACALLLCD_DELELCD_WCHAR2:RET;删除一个字符子程序:LCD_DELE:ACALLLCD_RCMDCJNEA,#80H,DELE_1RETDELE_1:MOVA,CURSORJNZDELE_2ACALLLCD_BACKMOVA,#20HACALLLCD_WDATAACALLLCD_BACKRETDELE_2:ACALLLCD_BACKACALLLCD_RCMDPUSHACCACALLLCD_FOREMOVR2,CURSORLCD_DELE1:ACALLLCD_RDATAPUSHACCACALLLCD_BACKACALLLCD_BACKPOPACCA

25、CALLLCD_WCHAR_NLACALLLCD_FOREDJNZR2,LCD_DELE1ACALLLCD_BACKMOVA,#20HACALLLCD_WCHAR_NLLCD_DELE2:POPACCACALLLCD_CMDRET;退格子程序:LCD_BACK:ACALLLCD_RCMDCJNEA,#0C0H,LCD_BACK1MOVA,#90HACALLLCD_CMDLCD_BACK1:MOVA,#10HACALLLCD_CMDRET;光标右移子程序:LCD_FORE:ACALLLCD_RCMDCJNEA,#8FH,LCD_FORE1MOVA,#0C0HACALLLCD_CMDRETLCD_

26、FORE1:MOVA,#14HACALLLCD_CMDRETLCD_MOVE:PUSHACCMOVA,CURSORJZLCD_MOVE3MOVR2,CURSORCJNER2,#1,MOVE0JMPLCD_MOVE2MOVE0:DECR2LCD_MOVE1:ACALLLCD_FOREDJNZR2,LCD_MOVE1MOVR2,CURSORLCD_MOVE2:ACALLLCD_RDATAACALLLCD_WCHAR_NLACALLLCD_BACKACALLLCD_BACKACALLLCD_BACKDJNZR2,LCD_MOVE2ACALLLCD_FORELCD_MOVE3:POPACCRET;*L

27、CD相关子程序*;从LCD读出一个数据子程序:LCD_RDATA:ACALL CHECKBUSYMOV P0,#0FFH SETBLCD_RS SETBLCD_RW SETBLCD_ENNOPNOPNOPMOVA,P0CLRLCD_ENRET;读数据地址子程序:LCD_RCMD:ACALL CHECKBUSYMOV P0,#0FFH CLRLCD_RS SETBLCD_RW SETBLCD_ENNOPNOPNOPMOVA,P0ORLA,#80HCLRLCD_ENRET;LCD初始化设定子程序LCD_INIT: ACALL DELAY5MS ;延时15MS ACALL DELAY5MS ;等待L

28、CD电源稳定 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 ;清除屏幕 AC

29、ALL LCD_CMD ;进行LCD忙检测 MOV A,#0CH ;显示开,关光标 ACALL LCD_CMD ;进行LCD忙检测 RET;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲LCD_CMD: CALL CHECKBUSYLCD_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 MO

30、V P0,A SETB LCD_EN NOP NOP NOP NOP CLR LCD_EN RETWRITE: PUSH ACCWRITE1: CLR A MOVC A,A+DPTR JZ WRITE2 INC DPTR ACALL LCD_WDATA JMP WRITE1WRITE2: POP ACC 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_

31、ENBUSYLOOP: NOP JB P0.7,BUSYLOOP CLR LCD_EN POP ACC RET;延时5MS子程序:(LCD初始化使用)DELAY5MS:MOVR6,#10 DL1:MOVR7,#249 DL2:DJNZR7,DL2DJNZR6,DL1RET;*定时器初始化程序*TIME_INIT:MOV IE,#8AH ;允许中断T0,T1MOVTMOD,#11HMOVTH0,#00HMOVTL0,#00HSETBTR0MOVTH1,#0FCHMOVTL1,#0F8HRET;*中断服务程序*TIM0: PUSHACCINCMS0MOVA,MS0CJNEA,#24,T0_BMOVMS0,#0INCS0INCIDLEJNBDIALING,T0_1CPLTR1T0_1:MOVA,S0CJNEA,#60,T0_BMOVS0,#0INCM0MOVA,M0CJNEA,#60,T0_BMOVM0,#0INCH0MOVA,H0CJNEA,#24,T0_BMOVH0,#0T0_B:POPACCRETITIM1:PU

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号