貌似还是去年的东西,差点被我弄丢了,放在这里保存下吧,算是个纪念。 注:程序中有一个bug,没有启用优先寄存器,导致键盘响应的时候无法跳回,貌似我知道的解决方式只能是用扫描式键盘而不能用中断式键盘,叹息下,下面只这个有bug的程序源码:
;106017型的单片机系统设计
EOC BIT P3.3 ;预定义EOC为P3.3口的值
ORG 0000H ;主程序开始
BEGIN:LJMP XS ;调用显示子程序
ORG 0003H ;键盘使用外部中断0(INT0)中断入口
LJMP JP ;调用键盘处理子程序
ORG 000BH ;T0中断入口
LJMP CJJS ;调用采集计数处理子程序
;以下为显示学号后六位程序部分
ORG 0060H
XS:MOV SCON,#00H ;使用串行口的方式0发送数据
MOV R1,#07H ;对R1赋初值,R1为反复滚动显示次数
MOV R2,#06H ;对R2赋初值,R2为显示数码管分5次显示出来,外加一次全空显示,构造出从上进入的效果.
LOOP:CLR A ;清零
MOV DPTR,#TAB ;送表TAB的首地址入DPTR
MOVC A,@A+DPTR ;查表
DJNZ R1,CHSONG ;判断R1减一后是否为0,不为0开始发送,为0继续
LCALL DELAY ;延时1秒,构造从上进入视觉效果
MOV R1,#06H ;再次对R1赋值,以免R1减至0,使得可以一直滚动显示
DJNZ R2,CHSONG ;判断R2减一后是否为0,不为0开始发送,为0继续
MOV R2,#06H ;当R2减少至0时,再次对R2赋值,使得下一次还能持续显示
CHSONG:MOV SBUF,A ;开始发送数据
LOOP1:JBC TI,LOOP2 ;判断发送结束标志位TI,TI为1时跳转,不为1则等待数据发送
LOOP2:CLR TI ;软件置位,使得TI为0
INC DPTR ;DPTR加1,使得地址指向下一个数据
LJMP LOOP ;转到LOOP,完成下一次显示
LOOP3:LCALL DELAY ;调用延时子程序,构造从上进入视觉效果
RET
TAB:
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FEH,0FEH,0FEH,0FFH
DB 0FDH,0FDH,9DH,9DH,9DH,0FDH
DB 0FDH,0FDH,9DH,9CH,9DH,0FDH
DB 0F9H,0F9H,0C1H,83H,0C1H,0F9H
DB 0F8H,0F9H,0C0H,02H,0C0H,0F9H
;以下为键盘处理程序部分
JP:MOV IE,#80H ;禁止外部中断
LCALL DELAY2 ;延时10ms去抖动
LCALL KS ;调用KS判断是否真的有键按下
JNZ SM ;有键按下,A≠0,转SM求键值
LJMP BEGIN ;无键按下,返回继续显示学号
SM:SETB RS0 ;用第1组工作寄存器,保护第0组工作寄存器
MOV P1,#0F0H ;使得P1.0~P1.3输出0
MOV A,P1 ;读取P1口
ANL A,#0F0H ;屏蔽低四位,保留高四位
MOV B,A ;P1.4~P1.7送入B
MOV P1,#0FH ;反转设置,使得P1.4~P1.7输出0
MOV A,P1 ;读P1口
ANL A,#0FH ;屏蔽高四位,保留低四位
ORL A,B ;与P1.4~P1.7相或形成键码存入A
MOV B,A ;键码送入B
MOV R0,#00H ;置键号初值
MOV DPTR,#TAB1 ;把TAB1的首地址送入DPTR
LOO:MOV A,R0 ;使A为0
MOVC A,@A+DPTR ;查表获取键值
CJNE A,B,NEXT ;比较键值,如不相等转NEXT
SJMP MM ;若相等则返回,键码存在A中
NEXT:INC R0 ;键值加1
CJNE R0,#4H,LOO ;判断是否到最后一个按键,一共四个键
MM:CLR RS0 ;恢复第0组工作寄存器
LCALL COMP1 ;进行第一次比较,查看按下的键是否为1
LCALL COMP2 ;进行第二次比较,查看按下的键是否为2
COMP1:CJNE A,#7DH,NEXT0 ;如果不是1键,跳转至NEXT0
LJMP DACY ;如果是1键按下,则跳转至采集子程序部分
COMP2:CJNE A,#0EEH,NEXT1 ;如果也不是2键,跳转至程序首,继续显示学号后六位
LJMP ADZH ;如果是2键按下,则跳转至A/D转换子程序部分
NEXT0:RET ;返回
NEXT1:RETI ;中断程序返回
KS:CLR P1.0 ;此句以及下一句使得键盘的行线输出为0
CLR P1.1 ;此句以及上一句使得键盘的行线输出为0
MOV A,P1 ;读P1口
CPL A ;取反,以高电平表示有键按下
ANL A,#0FH ;屏蔽高四位
RET ;出口状态:A≠0时,有键按下
TAB1:DB 0EDH,7DH,0EEH,7EH ;0,1,2,3的键码值
;以下部分为采集ALE经过74LS393 16分频后的每秒脉冲数的程
转载请注明:鸟儿博客 » 单片机课程设计的程序