单片机课程设计的程序

菜鸟编程 十五楼的鸟儿 1019浏览 0评论

貌似还是去年的东西,差点被我弄丢了,放在这里保存下吧,算是个纪念。 注:程序中有一个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分频后的每秒脉冲数的程

转载请注明:鸟儿博客 » 单片机课程设计的程序

游客
发表我的评论 换个身份
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

等待大佬打赏中~