⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scan_key.asm

📁 基于SPMC75F2413A的LCD驱动程式序, 使用128X64的液晶模块,包含有画线,画圆和BMP,字符串等显示处理,全部源码,完整的工程.愿对从事单片机开发的工程式师有用.
💻 ASM
字号:
//****************************************************************************************************
// 键盘服务子程序包
// 设计者: 牟联树
// 描  述: 键盘服务
// 日  期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
//.INCLUDE hardware.inc                 //系统头文件
.INCLUDE spce.inc
.DEFINE    Key_CLK        0x8000      //键盘时钟         (IOA15)
.DEFINE    Key_DAT        0x4000      //键盘数据输出     (IOA14)
.DEFINE    Key_In         0x2000      //键盘中断或查询脚 (IOA13)
.DEFINE    TX_CLK         0x8000      //IO接口的发送时钟
.DEFINE    RX_CLK         0x2000      //IO接口的接收时钟
.DEFINE    IO_DAT         0x4000      //IO接口的数据引脚
.DEFINE    TX_Load        0x1000      //IO接口的输出锁存
.DEFINE    RX_Load        0x0800      //IO接口的输入锁存
.DEFINE    TX_DAT         0x0100
.DEFINE    Key_Port       P_IOA_Data
.DEFINE    Key_Port_B     P_IOA_Buffer
.DEFINE    IO_Port        P_IOB_Data
.DEFINE    IO_Port_B      P_IOB_Buffer
.PUBLIC    _Key_Dlay
.RAM
.VAR  _Key_Dlay
.TEXT
//****************************************************************************************************
// 键盘扫描  int Scan_Key()
// 设计者: 牟联树
// 描  述: 返回一键值,r1
// 日  期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
.PUBLIC  _Scan_Key,_Scan_Keya
_Scan_Keya:push r2,r3 to [sp]
           r2 = 0
           call Key_TX
           r3 = [Key_Port]
           r3&= Key_In
           jnz Key_endx
           jmp Key_ka
  Key_endx:r1 = 100
           pop r2,r3 from [sp]
           retf         
 _Scan_Key:push r2,r3 to [sp] 
           r2 = 0
           call Key_TX
   Key_Sa: r3 = [Key_Port]
           r3&= Key_In
           jnz  Key_Sa               //无键则转
   Key_ka: r1 = 15                    //延时时间
           [_Key_Dlay] = r1
           call _Dlay
           r3 = [Key_Port]
           r3&= Key_In
           jnz  Key_Sa               //无键则转           
           r2 = 0xfffe
           call Key_TX
           r3 = [Key_Port_B]   
           r3|= Key_DAT + Key_In     //千万记住,在检测Key_In时Key_In对应的IO口要是上拉
           [Key_Port_B] = r3
           r1 = 0                    //键值返回
   Key_Sb: r3 = [Key_Port]
           r3&= Key_In
           jz Key_Sc                 //已查到转
           r1+=1
           r3 = [Key_Port_B]
           r3|= Key_CLK              //产生CLK脉冲
           [Key_Port_B] = r3
           r3&=~Key_CLK
           [Key_Port_B] = r3
           cmp r1,16
           jbe Key_Sb
           jmp Key_endx              
   Key_Sc: r3 = [Key_Port]
           r3&= Key_In
           jz  Key_Sc                //判断键是否放开
           r3 = 15
           [_Key_Dlay] = r3          //延时时间
           call _Dlay           
           cmp r1,8
           jcc Key_end1
           r1-=8
           jmp Key_end
 Key_end1: r1+=8             
  Key_end: pop r2,r3 from [sp]
           retf
    _Dlay: r3 = [_Key_Dlay];
           jnz _Dlay
           retf                     
//用来发送16位的扫描字          
   Key_TX: r3 = 16                 
           r1 = [Key_Port_B]
           r1|= Key_In
  Key_TXa: r2+= r2
           jcc Key_TXb               //判断发0还是发1           
           r1|= Key_DAT
           jmp Key_TXc
  Key_TXb: r1&=~Key_DAT
  Key_TXc: [Key_Port_B] = r1                  
           r1|= Key_CLK              //产生CLK脉冲
           [Key_Port_B] = r1
           r1&=~Key_CLK
           [Key_Port_B] = r1
           r3-=1
           jnz Key_TXa               //没发完,继续
           r1|=Key_DAT
           [Key_Port_B] = r1
           retf
.PUBLIC  _TX_Data
 _TX_Data: push r1,r3 to [sp]
           r3 = 16                 
           r2 = [IO_Port_B]
           r2&=~TX_CLK
           [IO_Port_B] = r2
           r2&=~TX_Load
           [IO_Port_B] = r2
  T_Dataa: r1+= r1
           jcc T_Datab               //判断发0还是发1           
           r2|= TX_DAT
           jmp T_Datac
  T_Datab: r2&=~TX_DAT
  T_Datac: [IO_Port_B] = r2                  
           r2|= TX_CLK              //产生CLK脉冲
           [IO_Port_B] = r2
           r2&=~TX_CLK
           [IO_Port_B] = r2
           r3-=1
           jnz T_Dataa               //没发完,继续           
           r2|= TX_Load              //产生装载信号
           [IO_Port_B] = r2
           r2&=~TX_Load
           [IO_Port_B] = r2                                      
           pop r1,r3 from [sp]
           retf
           
.PUBLIC _RX_Data 
 _RX_Data: push r2,r3 to [sp]
           r2 = [IO_Port_B]
           r2&=~RX_Load              //产生装载信号
           [IO_Port_B] = r2           
           r2|= RX_Load          
           [IO_Port_B] = r2           
           r3 = 16                                       
  R_Dataa: r1+=r1
           r2 = [IO_Port]
           r2&= IO_DAT
           jz R_Datab
           r1|=0x0001
           jmp R_Datac               //判收到0还是1           
  R_Datab: r1&=~0x0001
  R_Datac: r2 = [IO_Port_B]
           r2|= RX_CLK              //产生CLK脉冲
           [IO_Port_B] = r2
           r2&=~RX_CLK
           [IO_Port_B] = r2
           r3-=1
           jnz R_Dataa               //没收完,继续
           pop r2,r3 from [sp]
           retf                    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -