1、3.4键盘处理程序在本设计中采用软件消除抖动的方法来解决干扰的问题根据按键的功能一般分为两种情况来处理:(a)对于每按键一次视为一次输入的设定来说,在稳定闭合期内,不断检测按键是否已释放,当发现按键被释放后,读出对应按键的编码(或称为键号)(b)对于重要输入功能的键设定来说,每隔一定时间,如500毫秒(即按下某键不动,一秒内重复输入该键两次)对按键进行检测,发现按键依然被按下时,就输入该键,直到按键被释放。键盘中断程序:INT1: CLR EX1PUSH PSW PUSH ACCMOV A,P1ANL A,#0E7HJNB PSW.0,EXITMOV R0, #0HMOV R5, #1LCAL
2、L DELAYMOV A, P1MOV R5, #50JB P1.0,EX1JB P1.1,EX2JB P1.2,EX3EX1: INC R0MOV A,R0ADD A, 18HMOV B, #8DIV ABMOV R6, BMOV 18H, R6 LCALL DELAYJNB P1.0,EXITJMP EX1EX2: CLR CINC R0MOV A, 18HSUBB A, R0JNC EXITDIV ABMOV R6, BMOV 18H, R6LCALL DELAYJNB P1.1, EXITJMP EX2EX3: JB P1.2,EX3CPL P1.3EXIT: CLR IE1MOV P
3、1,#18HPOP ACCPOP PSW SETB EX1 RETI 图3-4键盘中断程序流程图PROC INT13.5双字节二进制整数转换为压缩BCD码整数子程序NIBTD:MOV A, R0MOV R5, AMOV R6, AMOV A, R7INC A MOV A, R3 CLR ANBD0: MOV R1, A INC R1 DJNZ R3, NBD0 MOV A, R7 MOV B, #08H MUL AB MOV R3, ANBD4: MOV A, R5MOV R0, AMOV R2, ACLR CNBD1: MOV A, R0 RLC A 图3.5 二进制整数转换为压缩BCD码
4、MOV R0, A 整数子程序的程序流程图 DJNZ R2, NBD1 MOV A, R6MOV R1, A INC R2NBD3:MOV A, R1 ADDC A, R1 DA A DJNZ R2, NBD3DJNZ R3, NBD4RET3.6 三字节压缩BCD码转换成ASCII码子程序MOV R2, #N ;字节数存R2 MOV R0, #50H ;ASCII码首地址MOV R2, #60H ;BCD码首地址BCDASC:MOV A, R1 ;取BCD码MOV R3, A ;BCD码暂存R3ANL A, #0F0H ;屏蔽低四位保留高四位SWAP A ;A中的高低四位交换ADD A, #
5、30H ;加30H得高位ASCII码MOV A, R3 ;保存ASCII码INC R0再取BCD码ANL A, #0FH;屏蔽高四位保留低四位加30H得低位ASCII码MOV R0, AINC R1DJNZ R2, BCDASC3.7 LCD显示程序LCD:RS EQU P2.0;LCD RS 引脚定义EN EQU P2.1;LCD EN 引脚定义BEGIN:CLR EN ;LCD被禁用CALL SET_LCD;LCD初始化并做显示测试MOV A,18H ;设置所要显示的字符MOV B,#11;设置所要显示LCD的位置CALL LCDP1 ;在LCD第一行显;示字符MOV R4,#6MOV R
6、1,#39HMOV R2,#8 图3-7 LCD显示流程图XU: INC R1MOV A,R1;INC R2MOV B,R2 ;CALL LCDP2 ;在LCD第二行显示字符DJNZ R4,XU SET_LCD: ;CLR EN ;CALL INIT_LCD ;LCD初始化MOV R5, #10 ;延迟一下CALL DELAYMOV DPTR,#LMESS1 ;指针指到显示消息1MOV A, #1 ;显示在第一行CALL LCD_PRINT ;显示执行消息1于LCD第一行MOV DPTR,#LMESS2;指针指到显示消息2MOV A,#2 ;显示在第二行显示执行消息2于LCD第二行 RET I
7、NIT_LCD1:4位I/O初始化LCDMOV A,#28HCALL WCOM ;双列显示,字型使用5*7点阵MOV A,#0EH光标出现不闪烁MOV A,#06H 每次向右移一位,显示屏不移动MOV A,#01H清除LCD显示屏RET CLR_LINE1: ;清除LCD第一行字符MOV A,#80H ;设置第一行地址CALL WCOMMOV R0,#24 ;设置计数值CL: MOV # ;载入空格符至LCDCALL WDATA ;输出字符至LCDDJNA R0, CL ;计数结束A=LINE 1 OR 2 ;在LCD的第一行或第二行印出字符DPTR=MESSAGE POINTERLCD_PR
8、INT:CJNE A,#1,LINE2LINE1:MOV A, 80H ;设置LCD的第一行地址CALL CLR_LINEMOV A, #80HJMP FILLLINE2:MOV A, #0C0H ;设置LCD的第二行地址MOV A, #0C0HFILL:MOVC A, A+DPTRCJNE A, #0, L1L1: CALL WDATAINC DPTRCLR_LINE:清除LCD该行字符MOV R0, #24 ;C1: MOV A, # ;CALL WDATA ;DJNZ R0, C1 ;DE: MOV R7, #5 ;短暂延时DJNZ R7, $EN1: SETB EN ;短脉冲CALL
9、DECLR ENINIT_LCD:LCD 4位接口指令重置MOV P0, #30H ;RS=0,R/W=0,D7D4=0011CALL EN1MOV P0, #30HMOV P0, #20H ;启动4位接口指令CALL EN1 ;RS=0,R/W=0,D7D4=0010CALL INIT_LCD1 ;LCD指令设置初始化WCOM:WRITE HI 4 BITMOV P0, A ;先写入高4位命令CLR RS ;RS=0写入命令CALL EN1 ;产生高电平启用脉冲RLC A ;向左移4位 RLC AWRITE LO 4 BIT写入低4位命令WDATA:SETB RS ;RS=1写入数据向左移4
10、位SETB RS ;-DELAY R5*10ms ;延迟子程序DELAY: MOV R6, #25 ;总延迟时间R5*10msD1: MOV R7, #99DJNZ R6, D1DJNZ R5, DELAY-LMESS1: DB “CHANNEL:” DB “VOLTAGE: mv”在LCD第一行特定位置显示字符A=ASC DATA 所要显示的字符B=LINE X POS 所要显示的位置015LCDP1:将A寄存器放入堆栈PUSH ACCMOV A, BADD A, #80H ;POP ACC ;由堆栈取出A寄存器的值写入所要显示的字符-在LCD第二行特定位置显示字符LCDP2:ADD A,
11、#0C0H ;设置LCD的第二行地址;END3.8串行通信子程序 图3-8-1上位机人机交互界面3.8.1 上位机人机交互界面 图3-8-1为人机交互界面的外观图,用可视化编程语言VB编写的可视化界面,简洁明了,操作方便,串行通信采用了事件驱动行方式,使用Micorsoft公司的控件Micorsoft Communication 实现串行通信。3.8.2 上位机通信及显示程序(1)初始化代码Private Sub Form_Load()MSComm.CommPort=2 设置串口2MSComm.Settings=2400,n,8,1 波特率9600,无校验,8位数据,一位停止位 MSComm.
12、InputLen=0 读取接受缓冲区的所有字符 MSComm.InBufferSize=1024设置接受缓冲区为1024字节 MSComm.OutBufferSize=512设置发送缓冲区为512字节 MSComm.PortOpen=True 打开串口 MSComm.SThreshold=0 不触发发送事件 MSComm.RThreshold=1 每一个字符到接收缓冲区都触 发接收事件 MSComm.InBufferCount=0 清除发送缓冲区数据 MSComm. OutBufferCount=0 清除接收缓冲区数据 Text_SEND.Text=“” 清空发送文本框 Text_RECV.T
13、ext=“” 清空接收文本框End Sub(2)发送数据Private Sub Button_SEND_Click() Dim x As String If Text_SEND.Text=“”Then 发送数据不能为空 X=MsgBox(“发送数据不能为空”,16) Exit Sub End If If Not MSComm.PortOpen Then 保证串口打开 MSComm.PortOpen=True MSComm.OutPut=Text_SEND.Tex+C hr$(13) 发送数据 For i=1 To 20000000 延时 Next(3)接收数据Private Sub MSCom
14、m_OnComm.() Slect Case MSComm.CommEvent .检验串口事件错误处理 Case comEventOverrun 数据丢失 Text_SEND.Text=“” 清空发送缓冲区 Text_RECV.Text=“” 清接收缓冲区 Text_SEND.SetFous=“” Exit SubCase comEventRxOver 接收缓冲区溢出 Text_RECV.Text=“” 清空接收缓冲区Case comEventOver 发送缓冲区已满Text_SEND.Text=“” 清空发送缓冲区事件处理Case comEvReceive 接收缓冲区内有数据 Dim str
15、 As String str= MSComm.InPut 从接收队列中读入字符串 Text_RECV.Text=Text_RECV.Text+str 读出字符串送显 End Select(4)清空接收文本框Private Sub Button_RECV_C_Click() Text_RECV.Text=“” 清空接收文本框 Text_SEND_SetFocus清空发送文本框Private Sub Button_SEND_C_Click() Text_RECV.Text=“” 清空发送文本框3.8.3 单片机终端串行通信程序 COMMUNICATION: MOV R3,#7 ;要发送的字节数 M
16、OV R0,#40H ;待发送数据的起始地址SENDBACK: MOV A,R0 ;向PC机发送数据 MOV SBUF,AWAIT: JNB TI,WAIT CLR TI INC R0 ;移动地址指针 DJNZ R3,SENDBACK ;发送完否3.9 主程序 ORG 0000HSJMP MAINORG 0003H ;外部0中断入口地址LJMP INTDATAORG 0013H ;外部1中断入口地址LJMP PROC INT1ORG 0023H ;串行中断入口地址LJMP SERVEORG 0100H ;主程序开始MAIN:MOV SP,#60HMOV P1,18H ;键盘初始化MOV TMO
17、D,#20H ;定时器T1初始化MOV TH1,#0F3HMOV TL1,#0F3HMOV SCON,#50H ;串行口初始化MOV PCON,#80H ;SMOD=1SETB TR1 ;启动定时器T1SETB EA ;开中断SETB ES ;允许串口中断SETB EX1 ;允许外部中断T1NEXT: LCALL SAMP ;调用数据采集程序,结果存于30HMOV A,#30HADD A,18HDEC AMOV B,#196MUL ABMOV 39H,A ;39H、3AH分别存储二进制数的地位和MOV 3AH,B ;高位MOV R0,#39HMOV R1,3BHLCALL NIBTB ;双字节二进制整数转换为压缩BCD码存于起始地址为3BH的单元LCALL BCDA ;压缩BCD转换成ASCII码MOV A,18HADD A,#30HMOV 40H,AMOV 46H,45HMOV 45H,#2EHLCALL LCD ;调用显示子程序LCALL COMMUNICATION;调用串行通信子程序JMP NEXT
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1