历史上的今天
今天是:2025年01月26日(星期日)
2018年01月26日 | HT48R50A的 5X7 LED点阵+LCD显示示例程序
2018-01-26 来源:eefocus
****************************************
; Function : 5X7 LED点阵+LCD显示示例程序 *
; MICroProcessor : HT48R50A-1/28SKDIP-A *
; Author: www.picavr.com *
; Crystal : 4MHz *
; ********************************************
#INCLUDE HT48R50A-1.INC
LCD_DATA EQU PB
LCD_DATA_CTRL EQU PBC
LCD_CTRL EQU PC
LCD_CTRL_CTRL EQU PCC
E EQU 5
RS EQU 3
TIME_OUT EQU 11H
CLR_WDT EQU 22H
EXE_HALT EQU 33H
CLR_WDT1_WDT2 EQU 44H
;--------------------------------------------------------------------
DATA .SECTION AT 60H ’DATA’
DELAY_COUNTER_1 DB ? ;[60H]
DELAY_COUNTER_2 DB ? ;[61H]
DELAY_COUNTER_3 DB ? ;[62H]
DATA DB ? ;[63H]
COUNTER DB ? ;[64H]
WARM_RESET DB ? ;[65H]
DISPLAY_FLAG DB ? ;[66H]
;--------------------------------------------------------------------
CODE .SECTION AT 00H ’CODE’
ORG 00H
JMP START
START:
CLR PAC
CLR LCD_DATA_CTRL
CLR LCD_CTRL_CTRL
CLR LCD_DATA
CLR LCD_CTRL
;--------------------------------------------------------------------
MOV A,07H ; set watch dog time out
MOV WDTS,A ; 2.6 sec
CLR WDT ; clear watch dog timer
;--------------------------------------------------------------------
MOV A,WARM_RESET
MOV DISPLAY_FLAG,A
SUB A,TIME_OUT
SZ ACC
JMP CHK_CLR_WDT
JMP GO_TIME_OUT
CHK_CLR_WDT:
MOV A,WARM_RESET
MOV DISPLAY_FLAG,A
SUB A,CLR_WDT
SZ ACC
JMP CHK_EXE_HALT
JMP GO_CLR_WDT
CHK_EXE_HALT:
MOV A,WARM_RESET
MOV DISPLAY_FLAG,A
SUB A,EXE_HALT
SZ ACC
JMP CHK_CLR_WDT_12
JMP GO_EXE_HALT
CHK_CLR_WDT_12:
MOV A,WARM_RESET
MOV DISPLAY_FLAG,A
SUB A,CLR_WDT1_WDT2
SZ ACC
JMP BEGIN
JMP GO_CLR_WDT_12
BEGIN:
CALL LCD_RESET
CLR WDT ; clear watch dog timer
;--------------------------------------------------------------------
GO_TIME_OUT:
MOV A,CLR_WDT
MOV WARM_RESET,A
MOV A,OFFSET LCD_MESSAGE_1
MOV TBLP,A
CALL LCD_DISPLAY
TIME_OUT_LOOP:
CALL LED_DISPLAY
JMP TIME_OUT_LOOP
RET
;--------------------------------------------------------------------
GO_CLR_WDT:
MOV A,EXE_HALT
MOV WARM_RESET,A
MOV A,OFFSET LCD_MESSAGE_2
MOV TBLP,A
CALL LCD_DISPLAY
CLR_WDT_LOOP:
CALL LED_DISPLAY
JMP CLR_WDT_LOOP
RET
;--------------------------------------------------------------------
GO_EXE_HALT:
MOV A,CLR_WDT1_WDT2
MOV WARM_RESET,A
MOV A,OFFSET LCD_MESSAGE_3
MOV TBLP,A
CALL LCD_DISPLAY
EXE_HALT_LOOP:
CALL LED_DISPLAY
JMP EXE_HALT_LOOP
RET
;--------------------------------------------------------------------
GO_CLR_WDT_12:
MOV A,TIME_OUT
MOV WARM_RESET,A
MOV A,OFFSET LCD_MESSAGE_4
MOV TBLP,A
CALL LCD_DISPLAY
CLR_WDT_12_LOOP:
CALL LED_DISPLAY
JMP CLR_WDT_12_LOOP
RET
;--------------------------------------------------------------------
LED_DISPLAY PROC
SET PA
CALL DELAY
MOV A,OFFSET SEGMENT_DATA
MOV TBLP,A
MOV A,10H
MOV COUNTER,A
DISPLAY_START:
TABRDL DATA
MOV A,DATA
MOV PA,A
CALL DELAY
INC TBLP
MOV A,DISPLAY_FLAG
SUB A,CLR_WDT
SZ ACC
JMP LED_CLR_WDT12
CLR WDT
JMP DISPLAY_END
LED_CLR_WDT12:
MOV A,DISPLAY_FLAG
SUB A,CLR_WDT1_WDT2
SZ ACC
JMP LED_EXE_HALT
CLR WDT1
CLR WDT2
JMP DISPLAY_END
LED_EXE_HALT:
MOV A,DISPLAY_FLAG
SUB A,EXE_HALT
SZ ACC
JMP DISPLAY_END
HALT
DISPLAY_END:
SDZ COUNTER
JMP DISPLAY_START
RET
LED_DISPLAY ENDP
;--------------------------------------------------------------------
LCD_RESET PROC
MOV A,30H ; LCD reset , step 1
MOV LCD_DATA,A ;
CALL WRITE ;
CALL DELAY ; LCD reset , step 2
MOV A,30H ; LCD reset , step 3
MOV LCD_DATA,A ;
CALL WRITE ;
CALL DELAY ; LCD reset , step 4
MOV A,30H ; LCD reset , step 5
MOV LCD_DATA,A ;
CALL WRITE ;
MOV A,38H ; LCD setting , step 1
MOV LCD_DATA,A ; function set
CALL WRITE ;
MOV A,06H ; LCD setting , step 2
MOV LCD_DATA,A ; entry mode set
CALL WRITE ;
MOV A,01H ; LCD setting , step 3
MOV LCD_DATA,A ; display clear
CALL WRITE ;
CALL DELAY ;
MOV A,0EH ; LCD setting , step 4
MOV LCD_DATA,A ; display turn on
CALL WRITE ;
RET
LCD_RESET ENDP
;--------------------------------------------------------------------
LCD_DISPLAY PROC
MOV A,01H ; LCD setting , step 5
MOV LCD_DATA,A ; display clear
CALL WRITE ;
CALL DELAY ;
MOV A,80H ; LCD setting , setp 6
MOV LCD_DATA,A ; DD RAM address setting
CALL WRITE ; address = 00h (first line)
SET LCD_CTRL.RS ; LCD setting , step 7
MOV A,10H ; write data to DD RAM
MOV COUNTER,A
DISPLAY1:
TABRDL DATA
MOV A,DATA
MOV LCD_DATA,A
CALL WRITE
INC TBLP
SDZ COUNTER
JMP DISPLAY1
CLR LCD_CTRL.RS
MOV A,0C0H ; LCD setting , step 8
MOV LCD_DATA,A ; DD RAM address setting
CALL WRITE ; address = 40h (second line)
SET LCD_CTRL.RS ; LCD setting , step 9
MOV A,10H ; write data to DD RAM
MOV COUNTER,A
DISPLAY2:
TABRDL DATA
MOV A,DATA
MOV LCD_DATA,A
CALL WRITE
INC TBLP
SDZ COUNTER
JMP DISPLAY2
RET
LCD_DISPLAY ENDP
;--------------------------------------------------------------------
WRITE PROC
SET LCD_CTRL.E
CLR LCD_CTRL.E
MOV A,0FFH
MOV DELAY_COUNTER_1,A
WAIT:
SDZ DELAY_COUNTER_1
JMP WAIT
RET
WRITE ENDP
;--------------------------------------------------------------------
DELAY PROC
MOV A,003H
MOV DELAY_COUNTER_1,A
MOV DELAY_COUNTER_2,A
MOV DELAY_COUNTER_3,A
DELAY_WAIT:
SDZ DELAY_COUNTER_3
JMP DELAY_WAIT
SDZ DELAY_COUNTER_2
JMP DELAY_WAIT
SDZ DELAY_COUNTER_1
JMP DELAY_WAIT
RET
DELAY ENDP
;--------------------------------------------------------------------
ORG 0F00H
LCD_MESSAGE_1: ;[Now , watch dog ]
;[will be time out]
DC 4EH,6FH,77H,20H,2CH,20H,77H,61H
DC 74H,63H,68H,20H,64H,6FH,67H,20H
DC 77H,69H,6CH,6CH,20H,62H,65H,20H
DC 74H,69H,6DH,65H,20H,6FH,75H,74H
LCD_MESSAGE_2: ;[Without time out]
;[Because CLR WDT ]
DC 57H,69H,74H,68H,6FH,75H,74H,20H
DC 74H,69H,6DH,65H,20H,6FH,75H,74H
DC 42H,65H,63H,61H,75H,73H,65H,20H
DC 43H,4CH,52H,20H,57H,44H,54H,20H
LCD_MESSAGE_3: ;[Executing the ]
;[HALT instruction]
DC 45H,78H,65H,63H,75H,74H,69H,6EH
DC 67H,20H,74H,68H,65H,20H,20H,20H
DC 48H,41H,4CH,54H,20H,69H,6EH,73H
DC 74H,72H,75H,63H,74H,69H,6FH,6EH
LCD_MESSAGE_4: ;[Without time out]
;[CLR WDT1 & WDT2 ]
DC 57H,69H,74H,68H,6FH,75H,74H,20H
DC 74H,69H,6DH,65H,20H,6FH,75H,74H
DC 43H,4CH,52H,20H,57H,44H,54H,31H
DC 20H,26H,20H,57H,44H,54H,32H,20H
SEGMENT_DATA: ;7 SEGMENT DISPLAY DATA (COMMON ANODE)
DC 081H,0CFH,092H,086H ;0123
DC 0CCH,0A4H,0A0H,08FH ;4567
DC 080H,084H,088H,0E0H ;89AB
DC 0B1H,0C2H,0B0H,0B8H ;CDEF
;--------------------------------------------------------------------
END
史海拾趣
|
如何应用定时器实现中断呢?具体的操作步骤有呢些?应该注意什么问题?下面由工程师讲解一个应用定时器中断的实例: 现要求编制一段程序,使P1.0端口线上输出周期为2ms的方波脉冲。设单片机晶振频率 Fosc=6MHZ. 1、方法:利用定时器T0作1ms定 ...… 查看全部问答> |
|
听风且饮 16:48:08请问下在ccs仿真的时候,程序运行的时候中断向量表所在的地址内的内容会不会被修改,现在的程序运行的时候观测到中断向量表所在的地址空间内容被修改了。… 查看全部问答> |
|
求助:用C51系列的单片机模拟一个非标准的SPI接口的从机? 大家知道有什么办法么?怎么才能及时的响应主机clk信号的,就是用单片机对主机的响应返回一定的值?我暂时想到用单片机C51来模拟,不知道大家在这方面有什么建议?不胜感激~~~~~~~… 查看全部问答> |
|
我用EVC4写的程序 可以修改WM5的注册表 就是Today下面的 用我写的程序修改后 用EVC自带的注册表编辑器查看显示修改是正确地 但是 只要一重启 就还原了 不知道这个问题怎么解决 谢谢了 ps 最好不要用破解注册表这种办法… 查看全部问答> |
|
各位大侠:我写了一个简单的关于字符串转换为无符号长整形秒数的程序。因为EVC不支持mktime()和localtime()等函数, 我自己写了一个。目前此程序单步执行可以,但是如果直接run,在模拟器上就会看到The application has performed an Illegal Opera ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 请教一下这个芯片是做什么使的?com口接的是多大的电压?数据手册上没有讲太明白,不胜感激! … 查看全部问答> |
|
用的就是网上常用的电路 可是接收的信号不确定而且都不正确 求教用过cx20106的大侠帮忙一下 谢谢了 我是用105电容接一个5欧的电阻 5脚是220K电阻 接收头到cx20106这个我画图时太水了 用的是跳线(单面板) 而 ...… 查看全部问答> |
|
大家有没有想过这样一个问题,用MSP430和我们的智能机通信,你能想到什么办法呢? 全双工的、半双工的、单工的都可以,当然双工最好啦! 你能想到什么样的办法呢?… 查看全部问答> |




