历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2019年10月19日 | PIC单片机的LCD例程1

2019-10-19 来源:eefocus

; LCD_F84.ASM
; LCD_RESET - provides a means for the user to manually reset the LCD
; - brings RA.0 (serial lead) low for 2.5 secs. During this
; time, the user should manually reset the LCD.
; - routine then clears the LCD and ouptuts ten dots.
; - LCD is then cleared again.
; - W and STATUS are saved.
; LCD_DEBUG
; - displays W content and the state of the Z and C flags on line 1.
; - prints value of location 40H as a character on line 2.
; - displays values of locations 10, 11, 12, 13 on line 3.
; - locations 14, 15, 16, 17 on line 4.
; - this is followed by a one second delay.
; - the W and STATUS registers are saved and restored in returning
; to the calling program.
;
; LCD_CHAR - displays character in W on LCD. W and STATUS are saved.
; LCD_VAL - converts value in W to two hex characters and displays on LCD.
;
; LCD_BCD_WORD - displays quantity in 41H and 42H as unsigned decimal
; quantity. Note, this is limited to 9999 decimal.
;PIC单片机学习网www.pic16.com
; LIST p=16f84
; #include
; __CONFIG 11h
RADIX HEX
CONSTANT _MAX_VAR=4FH
CONSTANT TX=0 ; PORTA, Bit 0

_SER_DATA EQU _MAX_VAR-0 ; 4F
_SER_LOOP EQU _MAX_VAR-1 ; 4E
_SER_TIME EQU _MAX_VAR-2 ; 4D

_TEMP1 EQU _MAX_VAR-3 ; 4C
_TEMP2 EQU _MAX_VAR-4 ; 4B

_H EQU _MAX_VAR-3 ; 4C
_L EQU _MAX_VAR-4 ; 4B

_TH EQU _MAX_VAR-5 ; 4A
_HU EQU _MAX_VAR-6 ; 49
_TE EQU _MAX_VAR-7 ; 48
_UN EQU _MAX_VAR-8 ; 47

_SAVE_W EQU _MAX_VAR-9 ; 46
_SAVE_STAT EQU _MAX_VAR-0A ; 45

_LOOP1 EQU _MAX_VAR-1 ; used for pace timing, same location as _SER_LOOP
_LOOP2 EQU _MAX_VAR-2 ; used for pace timing, same location as _SER_TIME

_N_MSEC EQU _MAX_VAR-0B ; 44
_N1 EQU _MAX_VAR-0C ; 43

ORG 300H

LCD_BCD_WORD: ; displays a natural binary word in locations 41 and 42
; in decimal.
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F ; status saved in true form

MOVF 41H, W
MOVWF _H
MOVF 42H, W
MOVWF _L

CLRF _TH
CLRF _HU
CLRF _TE
CLRF _UN
_BCD_1:
MOVLW .1
SUBWF _L, F
BTFSC STATUS, C ; a borrow occurred
GOTO _INC_DEC
MOVLW .1
SUBWF _H, F
BTFSC STATUS, C
GOTO _INC_DEC

SWAPF _TH, W
IORWF _HU, W
CALL _LCD_VAL

SWAPF _TE, W
IORWF _UN, W
CALL _LCD_VAL

GOTO _RETURN

_INC_DEC:
CLRWDT
INCF _UN, F
MOVLW .10
SUBWF _UN, W
BTFSS STATUS, Z
GOTO _BCD_1

CLRF _UN

INCF _TE, F
MOVLW .10
SUBWF _TE, W
BTFSS STATUS, Z
GOTO _BCD_1

CLRF _TE

INCF _HU, F
MOVLW .10
SUBWF _HU, W
BTFSS STATUS, Z
GOTO _BCD_1

CLRF _HU

INCF _TH, F
GOTO _BCD_1

LCD_RESET:
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F ; save in true form

BSF STATUS, RP0
BCF TRISA, 0
BCF STATUS, RP0

BCF PORTA, 0 ; output a zero to LCD

MOVLW .10
MOVWF _N1
_RESET_1:
MOVLW .250
MOVWF _N_MSEC
CALL _DELAY_N
DECFSZ _N1, F
GOTO _RESET_1

MOVLW 0CH
CALL _LCD_CHAR

MOVLW .10
MOVWF _N1
_RESET_2:
MOVLW "."
CALL _LCD_CHAR
DECFSZ _N1, F
GOTO _RESET_2

MOVLW .4 ; one second delay
MOVWF _N1

_RESET_3:
MOVLW .250
MOVWF _N_MSEC
CALL _DELAY_N
DECFSZ _N1, F
GOTO _RESET_3

MOVLW 0CH
CALL _LCD_CHAR

GOTO _RETURN

LCD_DELAY: ; delays number of msecs in W
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F ; save in true form

MOVF _SAVE_W, W ; get W
MOVWF _N_MSEC
CALL _DELAY_N

GOTO _RETURN

LCD_DEBUG:
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F

MOVLW 0CH ; clear the LCD
CALL _LCD_CHAR

MOVLW "W" ; W=
CALL _LCD_CHAR
MOVLW "="
CALL _LCD_CHAR
MOVF _SAVE_W, W ; display value of W in hex
CALL _LCD_VAL

MOVLW " "
CALL _LCD_CHAR

MOVLW "Z" ; Z=
CALL _LCD_CHAR
MOVLW "="
CALL _LCD_CHAR

BTFSS _SAVE_STAT, Z
MOVLW "0"
BTFSC _SAVE_STAT, Z
MOVLW "1"

CALL _LCD_CHAR ; display either a zero or one

MOVLW " "
CALL _LCD_CHAR

MOVLW "C" ; C=
CALL _LCD_CHAR
MOVLW "="
CALL _LCD_CHAR

BTFSS _SAVE_STAT, C
MOVLW "0"
BTFSC _SAVE_STAT, C
MOVLW "1"
CALL _LCD_CHAR ; display either a zero or a one

MOVLW 0DH ; go to second line
CALL _LCD_CHAR
MOVLW 0AH
CALL _LCD_CHAR

MOVF 40H, W ; display location 40H as a char
CALL _LCD_CHAR

MOVLW 0DH ; go to third line
CALL _LCD_CHAR
MOVLW 0AH
CALL _LCD_CHAR

MOVLW 10H ; initialize pointer to RAM location 10
MOVWF FSR

MOVLW .4 ; four values on line
MOVWF _N1
_DEBUG_1:
MOVF INDF, W
CALL _LCD_VAL ; display values in loc 10, 11, 12, 13
INCF FSR, F
MOVLW " "
CALL _LCD_CHAR
DECFSZ _N1, F
GOTO _DEBUG_1

MOVLW 0DH ; go to 4th line
CALL _LCD_CHAR
MOVLW 0AH
CALL _LCD_CHAR

MOVLW .4 ; same for 14, 15, 16 and 17
MOVWF _N1
_DEBUG_2:
MOVF INDF, W
CALL _LCD_VAL
MOVLW " "
CALL _LCD_CHAR
INCF FSR, F
DECFSZ _N1, F
GOTO _DEBUG_2

MOVLW .250
MOVWF _N_MSEC

CALL _DELAY_N ; 250 msecs
CALL _DELAY_N

CALL _DELAY_N
CALL _DELAY_N

GOTO _RETURN

LCD_VAL: ; converts byte in W to two characters and outputs
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F ; save it in true form

MOVF _SAVE_W, W ; get back W
_LCD_VAL:
MOVWF _TEMP1 ; save a copy of W
MOVF PCLATH, W
MOVWF _TEMP2 ; save PCLATH

MOVLW .3 ; page 3
MOVWF PCLATH

SWAPF _TEMP1, W ; high nibble now in lo nibble of W
ANDLW 0FH ;
CALL _HEX_LOOK
CALL _SEROUT

MOVF _TEMP1, W
ANDLW 0FH
CALL _HEX_LOOK
CALL _SEROUT

MOVF _TEMP2, W
MOVWF PCLATH ; previous value of PCLATH
GOTO _RETURN

_HEX_LOOK:
ADDWF PCL, F
DT "0", "1", "2", "3", "4", "5", "6", "7"
DT "8", "9", "A", "B", "C", "D", "E", "F"

LCD_CHAR: ; outputs character in W to LCD
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F ; save in true form

MOVF _SAVE_W, W ; get back W
_LCD_CHAR:
CALL _SEROUT
MOVLW .10
MOVWF _N_MSEC
CALL _DELAY_N
GOTO _RETURN

_SEROUT: ; transmits content of W at 9600 Baud

MOVWF _SER_DATA

BSF STATUS, RP0 ; make TX bit an output
BCF TRISA, TX ;
BCF STATUS, RP0
BCF PORTA, TX ; set to stop bit

MOVLW .255
MOVWF _SER_TIME ; be sure stop bit has been high present
_SEROUT1: ; for some time
DECFSZ _SER_TIME, F
GOTO _SEROUT1

MOVLW .9
MOVWF _SER_LOOP

BCF STATUS, C ; set C to 0, start bit

_SEROUT2:
BTFSC STATUS, C
BCF PORTA, TX ; send a one
BTFSS STATUS, C
BSF PORTA, TX ; or a zero

MOVLW .31
MOVWF _SER_TIME ; one bit delay. 104 usecs at 9600 baud
_SEROUT3:
DECFSZ _SER_TIME, F
GOTO _SEROUT3

;NOP ; CHANGE

RRF _SER_DATA, F ; least sign bit now in C
DECFSZ _SER_LOOP, F ; does not affect status
GOTO _SEROUT2 ; next character

BCF PORTA, TX ; send stop bit

RETURN

_DELAY_N: ; delays number of msecs specified in _N_MSEC
MOVF _N_MSEC, W
MOVWF _LOOP1
_DELAY_1:
MOVLW .247 ; close to 1.0 msec delay when set to .247
MOVWF _LOOP2
_DELAY_2:

CLRWDT
DECFSZ _LOOP2, F ; decrement and leave result in LOOP2
; skip next statement if zero
GOTO _DELAY_2
DECFSZ _LOOP1, F
GOTO _DELAY_1
RETURN

_RETURN:
SWAPF _SAVE_STAT, W
MOVWF _TEMP2
SWAPF _TEMP2, W
MOVWF STATUS
SWAPF _SAVE_W, W ; get back W without altering STATUS
MOVWF _TEMP2
SWAPF _TEMP2, W

RETURN


推荐阅读

史海拾趣

明微公司的发展小趣事

随着全球半导体行业向中国市场的转移,明微公司意识到拓展海外市场的重要性。为了加快海外市场拓展步伐,公司积极加强与国际知名企业的合作与交流,引进先进的技术和管理经验。同时,公司还积极参加国际展会和论坛等活动,提升品牌影响力。这些举措使明微公司在国际市场上逐渐树立起良好的口碑和形象。

Elpaq公司的发展小趣事
Hokuriku公司的发展小趣事

90年代初期,随着全球化进程的加速,Hokuriku Electric开始将目光投向国际市场。公司首先在欧洲和北美设立了销售分支机构,随后又逐步拓展至亚洲其他地区。通过参加国际展会、建立合作伙伴关系等多种方式,Hokuriku Electric成功将其优质产品推向全球市场。这一过程中,公司不仅积累了丰富的国际销售经验,还提升了品牌知名度和影响力,为后续的全球化发展奠定了坚实基础。

High Tech Chips Inc公司的发展小趣事

进入80年代,随着电子技术的不断进步和应用领域的拓宽,Hokuriku Electric意识到单一产品线的局限性。于是,公司开始实施多元化产品战略,相继推出了传感器、贴片保险丝、机械零件、电路基板等一系列新产品。这些产品不仅丰富了公司的产品线,还进一步巩固了其在电子行业中的地位。通过多元化布局,Hokuriku Electric成功抵御了市场波动带来的风险,实现了持续稳定的增长。

华润微(CRMICRO)公司的发展小趣事

2020年,华润微成功在科创板上市,开启了公司发展的新篇章。上市以来,华润微充分利用资本市场的力量,不断扩大生产规模,提升技术水平。在科创板挂牌上市的推动下,公司业绩实现了快速增长。2022年,公司营收突破百亿大关,净利润达到26亿元,较2019年增长5.5倍。这一成绩的取得,充分展示了华润微在电子行业中的强大实力和竞争力。

Cynergy 3公司的发展小趣事

Cynergy 3注重企业的社会责任和文化建设。公司积极参与公益事业和环保活动,致力于为社会做出贡献。同时,Cynergy 3还注重员工的培养和发展,为员工提供良好的工作环境和福利待遇。这种注重社会责任和企业文化建设的做法使得Cynergy 3在行业中树立了良好的形象,也为公司的长期发展奠定了坚实的基础。

以上五个故事框架涵盖了Cynergy 3在电子行业中的发展历程、技术创新、国际化战略、客户需求驱动以及社会责任与企业文化等方面。每个框架都可以进一步扩展为完整的故事,详细描述Cynergy 3在不同阶段的发展情况和取得的成就。

问答坊 | AI 解惑

急招!!!

招聘任职要求: 1、为TD-SCDMA Node B执行RF测试用例 2、在板卡级别组织和开发 HW RF测试环境 3、负责HW Node B系统的测试。 4、本科以上,硕士优先,主修通信或者相关领域。 5、非常了解HW RF的测试(必须要有RF仪器经验 ) 6、RF 电路开发 ...…

查看全部问答>

MC9S08JM60技术手册USB部分中文翻译

这是从网上找到的MC9S08JM60单片机USB部分的翻译,该单片机是飞思卡尔推出的集成USB的S08单片机,对于需要实现USB连接的项目来说,是不错的选择。翻译的不是很好,有的地方还是要参考英文手册 …

查看全部问答>

USB 端口接线示意图(耳机+软件下载+耳机+数据线+FM)...

USB 端口接线示意图(耳机+软件下载+耳机+数据线+FM)...…

查看全部问答>

vc 添加程序的快捷方式到启动菜单里[转载http://blog.sina.com.cn/s/blog_5fd6e7ac01

vc 添加程序的快捷方式到启动菜单里#include <io.h>HRESULT CCreatescDlg::CreateLink(LPCSTR lpszPathObj, LPCSTR lpszPathLink, LPCSTR lpszDesc){    HRESULT hres;    IShellLink* psl;    h ...…

查看全部问答>

底薪 + 提成 + 分红 请Linux Wince 软硬件合作高手

行业PDA研发、销售 ARM7 ARM9 ARM11硬件平台 WINCE LINUX软件平台 QQ:1459635026 广东地区为佳。…

查看全部问答>

有没有做数码相框软件开发的?

有没有做数码相框软件开发的?有个活想找人做一下 QQ:3836435…

查看全部问答>

window ce 系统下怎么访问 pc机上的oracle数据库!

window ce 系统下怎么访问 pc机上的oracle数据库!我用的是vs2008,poketpc是windows mobile 5.0,不知那位高人能给解决。…

查看全部问答>

我的液晶是汉升19264-6的,驱动芯片是ks0108,我写了个驱动程序,怎么驱动不起来呢

下面是我的程序,是用STC52RC  驱动的,硬件检查过多次,绝对正确,哪位帮忙看看我的程序那有问题,显示不出来,谢谢。 #include\"reg52.h\" #include\"intrins.h\" #define uint unsigned int #define uchar unsigned char sbit E ...…

查看全部问答>

请教关于奇晶的2.83寸OLED显示屏:C0283QGLC-T(采用的是S6E63D6驱动IC)的驱动问题----有人做过么?

原来用的三星的LMS283显示屏,最近停产了,不得不从新找屏做驱动。 新找来的奇晶的LCD,修改了硬件电路和spi初始化配置,点亮-进入系统都没有问题,但是象素上 发现了一个奇怪的问题:     颜色显示都基本正确,红.绿.蓝都还可以。 ...…

查看全部问答>

算了,我也不较真了。

如果我有空我也会过来贴点东西。 这个板子全套开源的批量生产的东西,都已经发布了。 显卡ipcore虽然没发布,但网上有放多现成的,直接抄过来就能用,学习够了。 以后谁看到我发布的开源版,或者俺心情好了,或许过来发布一下。 在eeworld斑竹 ...…

查看全部问答>