历史上的今天
返回首页

历史上的今天

今天是:2025年01月25日(星期六)

2018年01月25日 | 合泰单片机矩阵键盘程序

2018-01-25 来源:eefocus

合泰HOLTEK 单片机 写的,对初学者来说里面的分析思路很有帮助。 
#include ht48c10-1.inc 
;------------------------------------------------------- 
data .section ’data’            ;== data section ==


temp    db      ?               ;temporary data register 
disp    db      ?               ;key display register 
count1  db      ?               ;delay loop counter 
mask    db      ?               ;mask register 
matrix  db      ?               ;key matrix register 
;------------------------------------------------------- 
code .section at 0 ’code’       ;== program section == 
        org     00h             ; 
        jmp     start           ; 
        org     04h             ;external interrupt subroutine 
        reti                    ;for guarantee 
        org     08h             ;timer/event 0 interrupt subroutine 
        reti                    ;for guarantee 
        org     0ch             ;timer/event 1 interrupt subroutine 
        reti                    ;for guarantee 
         
start:                          ; 
        clr     iNTC            ;initialize registers 
        clr     tmrc            ;to guarantee performance 
        clr     tmr             ;(interrupts) 
        set     PAC             ;(ports) 
        set     pbc             ;(input mode) 
        set     pCC             ; 
main: 
        set     pac         ;(1);set port A to input mode 
        clr     pbc             ;set port B to output mode 
        clr     pa              ;zero port A (latch=0) 
        set     pb              ;off LEDs 
keyloop:                        ; 
         MOV      a,0feh      ;(2);sCAN first row of keys 
         MOV      matrix,a        ;hold scan code 
         MOV      pac,a           ;pa.0 output 0 (latch) 
         MOV      a,pa            ;read input state 
        cpl     acc             ;;distill input state 
        and     a,0f0h          ;; 
        sz      acc             ;if any input? 
        jmp     get_key         ;yes. get input info 
         MOV      a,0fdh      ;(2);no. scan second row 
         MOV      matrix,a        ;hold scan code 
         MOV      pac,a           ;pa.1 output 0 (latch) 
         MOV      a,pa            ;read input state 
        cpl     acc             ;;distill input state 
        and     a,0f0h          ;; 
        sz      acc             ;if any input? 
        jmp     get_key         ;yes. get input info 
         MOV      a,0fbh      ;(2);no. scan third row 
         MOV      matrix,a        ;hold scan code 
         MOV      pac,a           ;pa.2 output 0 (latch) 
         MOV      a,pa            ;read input state 
        cpl     acc             ;;distill input state 
        and     a,0f0h          ;; 
        sz      acc             ;if any input? 
        jmp     get_key         ;yes. get input info 
         MOV      a,0f7h      ;(2);no. scan fourth row 
         MOV      matrix,a        ;hold scan code 
         MOV      pac,a           ;output pa.3 0 (latch) 
         MOV      a,pa            ;read input state 
        cpl     acc             ;;distill input state 
        and     a,0f0h          ;; 
        sz      acc             ;if any input? 
        jmp     get_key         ;yes. get input info 
        jmp     keyloop         ;repeat from keyloop 
get_key:                        ;get input key info 
        call    delays          ;debounce 
         MOV      a,pa            ;test port A 
        or      a,0fh           ; 
        cpl     acc             ; 
        sz      acc             ;any key hold? 
        jmp     go_on           ;yes. go on (some key is pressed) 
        jmp     keyloop         ;no. return to scan key again 
go_on: 
        call    key_in     ;(3) ;calculate table index 
        tabrdl  disp       ;(10);load display data 
         MOV      a,disp          ;;output data to port B 
         MOV      pb,a       ;(11);; 
        jmp     keyloop         ;repeat keyloop 
key_in proc                     ;get key number 
         MOV      a,pa            ;;hold port A state 
         MOV      temp,a     ;(4) ;; 
   get_release:                 ;wait for the key to be released 
         MOV      a,pa            ;;test port A state 
        cpl     acc             ;; 
        and     a,0f0h          ;; 
        sz      acc        ;(6) ;if release? 
        jmp     get_release     ;no. keep up waiting 
         MOV      a,0fh           ;yes. calculate key number 
        andm    a,matrix   ;(7) ;mask low nibble of scan code 
         MOV      a,0             ;keep table index at register A 
   get_row:                     ;calculate row number 
        rrc     matrix          ;;check each bit to get row number 
        snz     status.0        ;; 
        jmp     get_next        ;if bingo goto get_next 
        clr     c               ; 
        add     a,4h       ;(8) ;table index +4 (4 keys a row) 
        jmp     get_row         ;continue calculating 
   get_next:                    ; 
         MOV      tblp,a          ;hold table index at register TBLP 
         MOV      a,0efh          ; 
         MOV      mask,a          ;; mask = 0111 1111 
         MOV      a,0fh           ; 
        orm     a,temp          ;; temp = XXXX 1111 
   get_column:                  ;calculate column number 
         MOV      a,temp          ;load temp 
        xor     a,mask          ;;test column number 
        snz     z               ;; 
        jmp     index           ;no. test next column 
        ret                     ;yes. return (TBLP) 
   index:                       ;next column 
        inc     tblp       ;(9) ;table index +1 
        set     c               ; 
        rlc     mask            ;shift mask left (LSB=1) 
        jmp     get_column      ;repeat get_column 
key_in endp 
delays proc                     ;delay subroutine 
         MOV      a,0ffh          ;load counter 
         MOV      count1,a        ; 
d1: 
        sdz     count1          ;count down count1 
        jmp     d1 
        ret 
delays  endp 


推荐阅读

史海拾趣

Datasensor公司的发展小趣事

为了进一步扩大市场份额和增强技术实力,DATASENSOR公司积极进行收购和扩张。2004年,公司成功收购INFRA和SPECIALVIDEO公司,这两家公司在工业自动化领域拥有丰富的经验和先进的技术,为DATASENSOR公司带来了更多的市场机会和技术优势。此外,公司还在法国、德国、英国和西班牙等国家和地区设立了子公司,实现了全球化的战略布局。

CHENMKO公司的发展小趣事

1978年,DATALOGIC公司成功研制出欧洲第一台条码扫描器,并将此产品应用于商业领域。这一创新不仅展示了公司在光电技术领域的实力,也为其在工业自动化领域赢得了良好的声誉。条码扫描器的成功推出,为公司带来了可观的收益,也为公司后续的技术研发和市场拓展提供了强有力的支持。

CETC公司的发展小趣事

CETC深知人才是企业发展的根本。因此,公司一直注重人才培养和团队建设。公司设立了完善的培训体系,为员工提供各种学习和发展的机会。同时,CETC还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队在公司的各个领域都发挥着重要作用,为公司的持续创新和发展提供了有力保障。

ELPIDA公司的发展小趣事

2012年,由于无法承受巨大的财务压力和市场竞争压力,ELPIDA宣布破产保护。随后,美国美光科技公司(Micron Technology)以较低的价格收购了ELPIDA。这一事件标志着日本在DRAM领域的彻底失败,同时也为美光公司带来了重要的技术和市场资源。

Anderson Power Products公司的发展小趣事

在成立初期,ELPIDA凭借其强大的技术实力和规模效应,迅速在全球DRAM市场中占据了重要地位。公司不断推出创新产品,扩大市场份额,成为行业内的重要参与者。然而,随着市场竞争的加剧和技术的快速变化,ELPIDA也面临着巨大的挑战。

Densei-Lambda (TDK)公司的发展小趣事

在被美光收购后,ELPIDA的技术和人才得到了保留和传承。美光利用ELPIDA的技术优势和市场经验,继续推出了一系列高性能的DRAM产品。同时,ELPIDA也在新的领域进行探索和尝试,如生物生产等。这些努力不仅为美光公司带来了新的增长点,也为ELPIDA品牌注入了新的活力。

以上五个故事概述了ELPIDA公司在电子行业中的重要发展历程。这些故事反映了公司在市场竞争中的起伏和挑战,以及公司在技术和市场上的不断探索和创新。

问答坊 | AI 解惑

频谱可用性对移动电视解决方案的影响 (转贴)

在移动运营商寻求非语音业务收入增长时,终端用户对高级多媒体应用范围和业务的需求也在飞速增长。那些期望从其他来源获取收入增长的运营商在可下载游戏、应用程序和音轨等方面已取得成功。移动电视提供了一个潜在的盈利业务,这是当前很多运营商考 ...…

查看全部问答>

急问:EDA软件能不能二次开发?

能不能将EDA软件进行二次开发,用软件逐一的进行下列操作“修改器件参数---〉进行仿真---〉记录结果”?…

查看全部问答>

MSP430全系列源资选型

MSP430全系列源资选型…

查看全部问答>

小弟出入嵌入式,希望前辈给点指点

如题 谢谢啦 本人另建QQ高级群一个 92208632 嵌入式 大家可以互相学习…

查看全部问答>

gm放大器的补偿方法及实例详解

gm放大器的补偿方法及实例详解…

查看全部问答>

怎样判断SD卡驱动是否安装阿 ?

如果SD卡的驱动被编译进内核了,是否肯都九存在 /dev/mmcblk0文件 阿 。…

查看全部问答>

error: A1355U: A Label was found which was in no AREA (keil3.22(for arm))

2410h.sct(5): error: A1355U: A Label was found which was in no AREA LR_ROM1 0x00000000        {    ; load region错再此行,但不知为何   ER_ROM1 0x00000000 0x0100000  { ...…

查看全部问答>

usb设备的驱动到底是在什么时候加载的

usb设备的驱动到底是在什么时候加载的 请大家说到最详细 谢谢!!!…

查看全部问答>

应急灯设计的几点建议

关于应急灯设计,给大家几点参考建议:       对于LED应急灯,设计之前应明确几点基本功能.      1:根据壳体情况,如果是便携的应急灯,实际上就是一个可充电手电筒,以下按固定应急灯功能讨论.  & ...…

查看全部问答>

RM0008文档有误?

RM0008 Rev11 第843页: Bit 16 for OUT endpoint 0, bit 18 for OUT endpoint 3 是否 Bit 16 for OUT endpoint 0 Bit 17 for OUT endpoint 1 Bit 18 for OUT endpoint 2   ??? 怎么理解??? 0008.jpg (32.17 ...…

查看全部问答>