历史上的今天
返回首页

历史上的今天

今天是:2025年01月06日(星期一)

正在发生

2018年01月06日 | LED电子屏字符显示器程序

2018-01-06 来源:eefocus

;         四个显示字符数据表放在50H-6FH单元内,字符用8*8点阵,R4(30H)用于 
;         控制显示静止字的时间,R5(31H)静止字显示跳转地址步距,B内放显示首址 

;************;

;中断入口程序; 
;************; 

ORG     0000H    ;程序执行开始地址 
LJMP    START    ;跳至START执行 
ORG     0003H    ;外中断0中断入口地址 
RETI             ;中断返回(不开中断) 
ORG     000BH    ;定时器T0中断入口地址 
RETI             ;中断返回(不开中断) 
ORG     0013H    ;外中断1中断入口地址 
RETI             ;中断返回(不开中断) 
ORG     001BH    ;定时器T1中断入口地址 
RETI             ;中断返回(不开中断) 
ORG     0023H    ;串行口中断入口地址 
RETI             ;中断返回(不开中断) 
ORG     002BH    ;定时器T2中断入口地址 
RETI             ;中断返回(不开中断) 

;初始化程序 
CLEARMEN:       MOV     A,#0FFH      ;四端口置1 
                MOV     P1,A         ; 
                MOV     P2,A         ; 
                MOV     P3,A         ; 
                MOV     P0,A         ; 
                MOV     DPTR,#TAB    ;取"电子设计"字符表首址值 
                CLR     A            ; 
                MOV     21H,A        ;21H-24H内存单元清0 
                MOV     22H,A        ; 
                MOV     23H,A        ; 
                MOV     24H,A        ; 
                MOV     R3,A         ;R3寄存器清0 
                MOV     R1,#50H      ;设字符表移入内存单元首址 
                MOV     R2,#20H      ;设查表次数(32次) 
CLLOOP:         MOVC     A,@A+DPTR   ;查表将"电子设计"字符数据移入内存单元 
                MOV     @R1,A         ; 
                MOV     A,R3          ; 
                INC     A             ; 
                MOV     R3,A          ; 
                INC     R1            ; 
                DJNZ    R2,CLLOOP     ;查表32次,不到转CLLOOP再查 
                RET                   ;子程序返回 

;主体程序 
START:          MOV       20H,#00H    ;20H内存单元清0 
                SETB      00H         ;20H.0位置1 
START1:         LCALL     CLEARMEN    ;调用上电初始化子程序 
                JB        00H,FUN0    ;20H.0位为1,执行FUN0 
                JB        01H,FUN1    ;20H.1位为1,执行FUN1 
                JB        02H,FUN2    ;20H.2位为1,执行FUN2 
                AJMP      START1      ;跳回START1循环 

;键扫描子程序 
KEYWORK:        MOV       P1,#0FFH    ;置输入状态 
                JNB       P1.0,KEY1   ;P1.0为0(键按下)转KEY1 
                JNB       P1.1,KEY2   ;P1.1为0(键按下)转KEY2 
                JNB       P1.2,KEY3   ;P1.2为0(键按下)转KEY3 
KEYRET:         RET                   ;无键按下,子程序返回 
;按键1功能处理 
KEY1:           LCALL   DL10MS        ;延时10MS削抖动 
                JB      P1.0,KEYRET   ;是干扰转KEYRET结束 
                SETB    00H           ;置逐字显示方式标志(20H.0=1) 
                CLR     01H           ; 
                CLR     02H           ; 
                RET                   ;子程序返回 
; 按键2功能处理 
KEY2:           LCALL   DL10MS        ; 
                JB      P1.1,KEYRET   ; 
                SETB    01H           ;置上移显示方式标志(20H.1=1) 
                CLR     00H           ; 
                CLR     02H           ; 
                RET                   ; 
; 按键3功能处理 
KEY3:           LCALL   DL10MS        ; 
                JB      P1.2,KEYRET   ; 
                SETB    02H           ;置左移显示方式标志(20H.2=1) 
                CLR     01H           ; 
                CLR     00H           ; 
                RET 

;逐字显示功能程序 
FUN0:           MOV     30H,#80H     ;1帧显示时间控制(约1秒) 
                MOV     31H,#08H     ;换帧跳转步距为8 
                LJMP    DISP1        ;转显示子程序DISP1 
; 上移显示功能程序 
FUN1:           MOV     30H,#0AH     ;1帧显示时间控制(约80毫秒) 
                MOV     31H,#01H     ;换帧跳转步距为1 
                LJMP    DISP1        ;转显示子程序DISP1 
;左移显示功能程序 
FUN2:           LJMP     DISP2       ; 

;显示控制程序 
DISP1:          MOV     B,#50H       ;显示数据首址 
                MOV     R4,30H       ;放入1帧显示时间控制数据 
                MOV     R5,31H       ;放入跳转步距控制数据 
LOOP:           LCALL   DISPLAY      ;调用显示子程序一次 
                DJNZ    R4,LOOP      ;1帧显示时间未到再转LOOP循环 
                MOV     R4,30H       ;1帧显示时间到,重装初值 
                MOV     A,B          ; 
                CJNE    A,#68H,CONT  ;不是末地址转CONT 
                AJMP    START1       ;是末地址,一次显示结束跳回START1 
CONT:           ADD     A,R5         ;次帧扫描首址调整 
                MOV     B,A          ; 
                AJMP    LOOP         ;转LOOP进行次帧扫描 

;显示子程序,字符数据从P0口输出,扫描控制字从P2口输出,显示1帧约需8MS 
DISPLAY:        MOV     A,#0FFH      ; 
                MOV     P0,A         ;关显示数据 
                MOV     P2,A         ;关扫描 
                MOV     R6,#0FEH     ;赋扫描字 
                MOV     R0,B         ;赋显示数据首地址 
                MOV     R7,#08H      ;一次扫描8行 
DISLOOP:        MOV     A,@R0        ;取显示数据 
                MOV     P0,A         ;放入P0口 
                MOV     P2,R6        ;扫描输出(显示某一行) 
                LCALL   DL1MS        ;亮1毫秒 
                INC     R0           ;指向下一行数据地址 
                MOV     A,R6         ;扫描字移入A 
                RL      A            ;循环左移一位 
                MOV     R6,A         ;放回R6 
                DJNZ    R7,DISLOOP   ;8行扫描未完转DISLOOP继续 
                RET               ;8行扫描结束 

;左移显示控制程序 
DISP2:          MOV        R5,#32      ; 左移32次 
DISP22:            LCALL   DISPP     ;调用左移显示控制子程序 
                LCALL   MOVH      ;调用高位移出处理子程序MOVH 
                LCALL   MOVH1     ;调用高位移出处理子程序MOVH1 
                DJNZ    R5,DISP22 ;左移显示32次控制 
                LJMP    START1    ;跳回主程序 

; 左移显示控制子程序 
DISPP:          MOV     B,#50H    ;第一显示字符首址 
                MOV     R4,#25H   ;1帧显示时间控制 
DISPP1:         LCALL   DISPLAY   ;调用显示子程序一次 
                DJNZ    R4,DISPP1  ;1帧显示时间不到转DISPP再循环 
                RET 

; 高位移出处理子程序。将"电子设计"四个字符数据的最高位移出至21H-24H单元内 
MOVH:           MOV     R1,#21H       ;最高位移出存放单元首址 
                MOV     R0,#50H       ;"电子设计"字符数据首址 
                MOV     R2,#08H       ;每"字"移8次 
MOV1:           MOV     A,@R0         ;取"电子设计"字符数据 
                CLR     C             ;清进位C 
                RLC     A             ;带进位循左移 
                MOV     @R0,A         ;放回原单元 
                MOV     A,@R1         ;存放单元数据入A 
                RRC     A             ;带进位循右移 
                MOV     @R1,A         ;放回存放单元 
                INC     R0            ;字符数据地址加1 
                DJNZ    R2,MOV1       ;移8次未完转MOV1再移 
                MOV     R2,#08H       ;8次移完赋初值 
                INC     R1            ;存放单元地址加1 
                MOV     A,R1          ;判断地址是否小于25H 
                SUBB    A,#25H        ; 
                JZ      OUT           ;等于25H退出 
                AJMP    MOV1          ;小于25H转MOV1继续 
OUT:            RET                   ;子程序结束 

;高位移出处理子程序。 
MOVH1:          MOV     A,21H        ;21H与22H、23H、24H单元数据循交换 
                XCH     A,24H        ;21H与24H全交换 
                XCH     A,23H        ;23H与24H全交换 
                XCH     A,22H        ;23H与22H全交换 
                MOV     21H,A        ;22H与21H全交换 
                MOV     R1,#21H      ;以下是重新组成显示字符数据表程序 
                MOV     R0,#50H      ;将21H-24H的各位分别移入50H-6FH的低位 
                MOV     R2,#08H      ;移位次数 
MOV2:           MOV     A,@R0        ;取字符数据 
                RR      A            ;右移 
                MOV     @R0,A        ;放回原单元 
                MOV     A,@R1        ;取原移出最高位存放单元数 
                CLR     C            ;清C 
                RRC     A            ;带进位循环右移 
                MOV     @R1,A        ;放回原单元 
                MOV     A,@R0        ;取字符数据 
                RLC     A            ;带进位循环左移 
                MOV     @R0,A        ;放回字符数据 
                INC     R0           ;字符数据地址加1 
                DJNZ    R2,MOV2      ;8次未完转MOV2再继续 
                MOV     R2,#08H      ;8次完赋初值 
                INC     R1           ;原移出最高位存放单元地址加1 
                MOV     A,R1         ;判断地址是否小于25H 
                SUBB    A,#25H       ; 
                JZ      OUT          ;等于25H转OUT退出 
                AJMP    MOV2         ;小于25H转MOV2继续 

;1毫秒延时子程序,采用调用扫键子程序延时,可快速读出按纽的状态 
DL1MS:          MOV     R3,#64H  ;100*(10+2)us 
LOOPK:          LCALL   KEYWORK 
                DJNZ    R3,LOOPK 
                RET 

;0.5毫秒延时子程序 
DL512:          MOV      R2,#0FFH 
LOOP1:          DJNZ     R2,LOOP1 
                RET 

; 10毫秒延时子程序 
DL10MS:         MOV      R3,#14H 
LOOP2:          LCALL    DL512 
                DJNZ     R3,LOOP2 
                RET 

;"电子设计"显示用ROM数据表 
TAB:    DB      0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H     ;   电 
        DB      0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH   ;   子 
        DB      0B1H,0B5H,04H,0BFH,0B1H,0B5H,9BH,0A4H    ;   设 
        DB      0BBH,0BBH,1BH,0A0H,0BBH,0BBH,9BH,0BBH    ;   计 
        DB      00H,00H,00H,00H 
        END                                              ;程序结束 


推荐阅读

史海拾趣

Fullywell Semiconductor Co Ltd公司的发展小趣事

随着全球对环境保护和可持续发展的重视,Fullywell也积极响应这一趋势,开始实施绿色转型战略。公司投入大量资源研发环保型半导体材料和生产工艺,致力于降低生产过程中的能耗和排放。同时,Fullywell还加强了与产业链上下游企业的合作,共同推动绿色供应链的建设。这些举措不仅提升了公司的社会责任感,也为公司的可持续发展奠定了坚实的基础。通过绿色转型,Fullywell在行业内树立了良好的企业形象,吸引了更多关注环保和可持续发展的客户和合作伙伴。

Autonics公司的发展小趣事

Autonics始终将产品质量放在首位,建立了严格的质量管理体系。公司引进了先进的生产设备和检测设备,确保产品的生产和质量控制达到国际先进水平。同时,Autonics还积极申请并获得了多项国际产品质量认证,如ISO9001、UL、CE等,进一步提升了产品的竞争力和市场认可度。

展恒电子(Broadic)公司的发展小趣事

2007年,Broadic在美国加州成立,以其前瞻性的视野和深厚的技术积累,迅速在电子行业中崭露头角。同年,公司开始着手研发创新的芯片技术,奠定了其未来发展的坚实基础。2008年,深圳市展恒电子有限公司应运而生,作为Broadic在国内的销售公司,它的成立标志着Broadic正式进入中国市场,开始了其在国内的快速发展之旅。

爱普特微(aptchip)公司的发展小趣事

创立不久,爱普特微电子便迎来了一次重大的技术突破。公司成功研发出了全国产、全自主可控、高可靠性的32位微处理器芯片。这一产品的推出,不仅填补了国内市场的空白,更以其卓越的性能和稳定性,赢得了市场的广泛认可。随后,公司又基于自研IP库及RISC架构内核,量产了一系列全国产高可靠性32位MCU产品,广泛应用于工业控制、物联网、智能家电等领域。

Eska公司的发展小趣事

为了满足全球客户的需求,Eska公司实施了市场拓展和国际化战略。公司在欧洲各大主要城市及美国设立了服务中心,以便为当地客户提供快速可靠的服务。此外,Eska还利用先进的分切设备,为当地客户集中快速地提供载切大小格式灰板的服务。同时,Eska的产品也通过全球代理商、经销商及存货商网络,覆盖到更广泛的市场。

Connection One公司的发展小趣事

为了进一步提升国际竞争力,Connection One公司开始实施全球化战略布局。公司在全球范围内设立研发中心和销售网络,以便更好地了解当地市场需求并提供定制化产品。这一举措不仅加速了公司的国际化进程,还为其带来了更多的商业机会。

问答坊 | AI 解惑

惠普 4416s(WP439PA) 怎么样

屏幕尺寸:14.1英寸 重量:2.27Kg 处理器:AMD 炫龙 II M340 主板芯片组:AMD RX881 显卡:ATI HD 4330 光驱类型:DVD刻录机 内存大小:2GB 硬盘大小:320GB 用途 单片机开发 程序开发…

查看全部问答>

什么错误能导致设备完全死机?

我有一台wince5.0的设备,装上调试版运行一程序,正常情况下,按键等操作都会在超级终端上打印出信息;我做了一些操作后(会频繁读写SD卡的操作),按键消息都打印不出来了。。。。那是驱动打印出来的,是不是驱动异常了?但超级终端上也没有异常信息 ...…

查看全部问答>

如何解决大的全局数组导致编译的目标文件太大的问题

在程序中有个跟FPGA相关的驱动,驱动中有个uint32的全局数组用来存放fpga的一个芯片的初始化配置数据,超级大,这些数据又不能动态生产,直接导致编译出的目标文件打了几十K,如何能减小全局变量过大导致目标文件大的问题呢?…

查看全部问答>

DSP2407中A0~A15和D0~D15怎么使用?

不扩展存储器时怎么做IO口用?只要能控制某个脚的高低就行…

查看全部问答>

汽车LED照明方案设计

发光二极管(LED)照明为标新立异、舒适和用户定制开启了一片新天地。这些设计机遇在迅速提升LED在车内的应用程度和速度。当把LED用在车内、车前和车尾照明时,有几种方法和设计技术可供选择。   对车用LED来说,其相对抗振、寿命长、高能效及 ...…

查看全部问答>

有谁知道变频器用的功率模块能修吗?

有谁知道变频器用的功率模块能修吗?我有一些坏的功率模块,不知道能不能修.我在网上找到它的内部结构图.又花了很长很长的时间把它的外壳弄碎,然后又用很长很长的时间,把它打扫干净.并找到了里面损坏的IGBT管.只是我不能把坏的IGBT拆下来,用烙铁不行. ...…

查看全部问答>

STM32GPIO问题

想模拟IIC SDA脚有输入也会有输出的时候,STM32管脚方式有八种, 该配置成什么方式呢?…

查看全部问答>

判断

刚买了一个单片机,为啥一通电8*8点阵就亮了,没输入任何的程序,求高手指教,是坏了吗…

查看全部问答>

LM4F

开始上LM4F,求中文手册,本人E文烂的要命,实在看不了E文资料,那位朋友手头有中文资料的,求顺手发份,谢谢…

查看全部问答>