历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2019年10月21日 | 以汇编语言写的PIC18Fxxxx的LCD驱动程序

发布者:TranquilSmile 来源: eefocus关键字:汇编语言  PIC18Fxxxx  LCD驱动 手机看文章 扫描二维码
随时随地手机看文章

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

;* 18F_LCD.asm *

;* Microchip Taiwan                             *

;* Date : Sept. 24 2002 *

;* Version : v1.00 *

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

;* Contains subroutines to control an external  *

;* lcd panel in 4-bit mode.  These routines     *

;* were designed specifically for the panel on  *

;* the PICdemo 2 Plus demo board, but should    *

;* work with other LCDs with a HD44780 type     *

;* controller.                                  *

;* Routines include:                            *

;*   - InitLCD to initialize the LCD panel      *

;*   - putcLCD to write a character to LCD      *

;*   - SendCmd to write a command to LCD        *

;*   - clrLCD to clear the LCD display          *

;*   - L1homeLCD to return cursor to line 1 home*

;*   - L2homeLCD to return cursor to line 2 home*

;*   - PutHexLCD to write a HEX Code to LCD     *

;*   - Hex2ASCII to convert 4 bits to ASCII Code*

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

;

list p=18F452

#include

;

global InitLCD

global putcLCD

global clrLCD

global L1homeLCD

global L2homeLCD

global  Send_Cmd

global PutHexLCD

global Hex2ASCII

global Delay_xMS

global Delay_1mS

;

; Defines for I/O ports that provide LCD data & control

; PORTD[0:3]-->DB[4:7]: Higher order 4 lines data bus with bidirectional

;   : DB7 can be used as a BUSY flag

; PORTA,1 --> [E] : LCD operation start signal control 

; PORTA,2 --> [RW]: LCD Read/Write control

; PORTA,3 --> [RS]: LCD Register Select control

;   : "0" for Instrunction register (Write), Busy Flag (Read)

;   : "1" for data register (Read/Write)

;

;

LCD_CTRL equ TRISD

LCD_DATA equ PORTD

#define LCD_E_DIR TRISA,1

#define LCD_RW_DIR TRISA,2

#define LCD_RS_DIR TRISA,3

#define LCD_E PORTA,1

#define LCD_RW PORTA,2

#define LCD_RS PORTA,3  



; LCD Module commands

CLR_DISP equ b'00000001' ; 1.64mS , Clear display and return cursor to home

Cursor_Home equ b'00000010' ; 1.64mS , Return cursor to home position


ENTRY_DEC equ b'00000100' ; 40uS , Decrement cursor position & No display shift

ENTRY_DEC_S equ b'00000101' ; 40uS , Decrement cursor position & display shift

ENTRY_INC equ b'00000110' ; 40uS , Increment cursor position & No display shift

ENTRY_INC_S equ b'00000111' ; 40uS , Increment cursor position & display shift


DISP_OFF equ b'00001000' ; 40uS , Display off

DISP_ON equ b'00001100' ; 40uS , Display on control

DISP_ON_C equ b'00001110' ; 40uS , Display on, Cursor on

DISP_ON_B equ b'00001111' ; 40uS , Display on, Cursor on, Blink cursor


FUNC_SET equ b'00101000' ; 40uS , 4-bit interface , 2-lines & 5x7 dots

CG_RAM_ADDR equ b'01000000' ; 40uS , Least Significant 6-bit are for CGRAM address

DD_RAM_ADDR equ b'10000000' ; 40uS , Least Significant 7-bit are for DDRAM address

;


; Directs linker to provide 4 variables in GPR memory

UDATA

LCD_Byte RES 1

LCD_Temp RES 1

Count_uS RES 1

Count_mS RES 1

W_BUFR RES 1

Hex_Bfr RES 1

;

LCD_CODE CODE

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

;* The LCD Module Subroutines                                      *

;* Command sequence for 2 lines of 5x16 characters                 *

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

InitLCD

bcf LCD_E ; Clear LCD control line to Zero

bcf LCD_RW 

bcf LCD_RS 

;

bcf LCD_E_DIR ;configure control lines for Output pin

bcf LCD_RW_DIR

bcf LCD_RS_DIR

;

movlw b'00001110' ; configure AN0 as A/D inut pin

movwf ADCON1

movf LCD_CTRL,W ; get I/O directional settng

andlw 0xF0

movwf LCD_CTRL ; set LCD bus  DB[4:7] for output

;

movlw .50 ; Power-On delay 50mS

rcall Delay_xMS

;

movlw   b'00000011' ; #1 , Init for 4-bit interface

rcall Send_Low_4bit

;

movlw .10 ;  Delay 10 mS

rcall Delay_xMS

;

movlw b'00000011' ; #2 , Fully Initial LCD module 

rcall Send_Low_4bit ; Sent '0011' data  

rcall Delay_1mS

;

movlw b'00000011' ; #3 , Fully Initial LCD module 

rcall Send_Low_4bit ; Sent '0011' data  

rcall Delay_1mS

;

movlw b'00000010' ; #4 , Fully Initial LCD module 

rcall Send_Low_4bit ; Sent '0010' data  

rcall Delay_1mS

;

movlw FUNC_SET ; #5,#6 , Set 4-bit mode , 2 lines & 5 x 7 dots

rcall Send_Cmd

rcall Delay_1mS

;

movlw DISP_ON ; #7,#8 , Turn display on (0x0C)

rcall Send_Cmd

rcall Delay_1mS

;

movlw CLR_DISP ; #9,#10 , Clear LCD Screen

rcall Send_Cmd

movlw .5 ; Delay 5mS for Clear LCD Command execution

rcall Delay_xMS

;

movlw ENTRY_INC ; #11,#12 , Configure cursor movement

rcall Send_Cmd

rcall Delay_1mS

;

movlw DD_RAM_ADDR ; Set writes for display memory

rcall Send_Cmd

rcall Delay_1mS

;

return

;

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

;*SendChar - Sends character to LCD                                *

;*This routine splits the character into the upper and lower       * 

;*nibbles and sends them to the LCD, upper nibble first.           *

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

putcLCD

movwf LCD_Byte ; Save WREG in Byte variable

rcall Send_High_LCD ; Send upper nibble first

movf LCD_Byte,W

rcall Send_Low_LCD ; Send lower nibble data

rcall Delay_100uS

return

;

Send_High_LCD 

swapf WREG,W ; swap high/low nibble

Send_Low_LCD 

bcf LCD_RW ; set LCD Write Mode

andlw 0x0F ; Clear high nibble

movwf LCD_Temp

movf LCD_DATA,W ; Read back PORT

andlw 0xF0 ; keep data for PORTD[4:7]

iorwf LCD_Temp,W

movwf LCD_DATA ; Write data to LCD bus for low nibble bus DB[4:7]

bsf LCD_RS ; Set for data input

nop

bsf LCD_E ; Clock nibble into LCD

nop

bcf LCD_E

return

;

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

;*      To put the HEX value to LCD Display ,,

;*      High nibble first than Low nibble 

;*      Input : W Reg.

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

PutHexLCD

movwf W_BUFR ; Save W Register !!

swapf W_BUFR,W ; High nibble first !!

rcall Hex2ASCII

rcall putcLCD

;

movf W_BUFR,W

rcall Hex2ASCII

rcall putcLCD

return

;

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

;*       Convert a low nibble to ASCII code

;*       Input : W Reg.

;*       Output: W Reg.

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

Hex2ASCII

andlw 0x0f ; Mask Bit 4 to 7

movwf Hex_Bfr

sublw .09

btfsc STATUS,C ; If W less than A (C=1) --> only add 30h

bra _Add_W_30  

_Add_W_37 movlw 0x37

bra _Hex_cont 

_Add_W_30 movlw 0x30

_Hex_cont addwf Hex_Bfr,W ; The correct ASCII code for this char !!

return

;

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

;* SendCmd - Sends command to LCD                                  *

;* This routine splits the command into the upper and lower        * 

;* nibbles and sends them to the LCD, upper nibble first.          *

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

;     _    ______________________________

; RS  _>--<______________________________

;     _____

; RW       _____________________________

;                  __________________

; E   ____________/                  ___

;     _____________                ______

; DB  _____________>--------------<______

;

Send_Cmd

movwf LCD_Byte ; Save WREG in Byte variable

rcall Send_High_4bit ; Send upper nibble first

movf LCD_Byte,W

rcall Send_Low_4bit ; Send lower nibble data

rcall Delay_100uS

return

;

Send_High_4bit

swapf WREG,W ; swap high/low nibble

Send_Low_4bit

bcf LCD_RW ; set LCD Write Mode

andlw 0x0F ; Clear high nibble

movwf LCD_Temp

movf LCD_DATA,W ; Read back PORT

andlw 0xF0 ; keep data for PORTD[4:7]

iorwf LCD_Temp,W

movwf LCD_DATA ; Write data to LCD bus for low nibble bus DB[4:7]

bcf LCD_RS ; Clear for command inut

nop

bsf LCD_E ; Clock nibble into LCD

nop

bcf LCD_E

return

;

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

;* clrLCD - Clear the contents of the LCD                          *

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

clrLCD

movlw CLR_DISP ; Clear LCD screen

rcall Send_Cmd

movlw .5 ; Delay 5mS for Clear LCD Command execution

bra Delay_xMS

;

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

;* L1homeLCD - Moves the cursor to home position on Line 1         *

[1] [2]
关键字:汇编语言  PIC18Fxxxx  LCD驱动 引用地址:以汇编语言写的PIC18Fxxxx的LCD驱动程序

上一篇:以C语言完成读写24LCxx系列的EEPROM的实例
下一篇:用HI-TECH C写的使用PIC12C508单片机读写93LC46范例程式

推荐阅读

需用到的".c"库函数为 stm32f10x_gpio.c 和stm32f10x_rcc.c 1. 启动相应Port x的RCC(复位始终控制) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE); x可以是A到G , GPIO都由APB2(高速外设)时钟控制2. GPIO初始结构中的三个参数赋值(该结构名需程序前定义:"GPIO_InitTypeDef GPIO_InitStructure;") 三个参数分别为...
华为电视推出也有近两个月时间了,一直以来它都强调不做低价破坏者,而要做电视产业的创新者,以创新推动电视行业找到新的机遇,在当下电视市场价格战激烈的情况下这一言论颇为清新,然而如果仔细分析它在多个行业都普遍采用价格战的做法就可以看出它在电视行业迟早会开打价格战。华为向来善于运用价格战在通信设备市场,华为作为后来者,能在爱立信、阿尔...
(ADI)今日宣布推出AD7134无混叠模数转换器(ADC),可以大幅简化前端设计,加快精密DC-350kHz应用上市的时间。传统的精密数据采集信号链设计非常耗费时间,因为设计人员需要在抗混叠滤波器要求、无源元件容差、相位和增益误差,以及高速ADC驱动要求之间实现平衡。AD7134采用全新的精密ADC架构,从根本上改变了整个设计过程。新器件无需再使用抗混叠滤波器,...
罗德与施瓦茨在射频方面比较突出,罗德的网络分析仪不管是手持还是台式个人觉得都比较好用,仪器使用久了就需要定期进行维护保养。也需要做自检自校准测试,那么问题来了,有的工程师不知道如何去操作,下面安泰网络分析仪维修中心分享一些罗德自检自校准的方法:网络分析仪1、ZNA/ZNB/ZNBT/ZNC/ZND<1>自检[Setup]>Info>selftest<2>固件检查、升级或修复[S...

史海拾趣

问答坊 | AI 解惑

广深高速公路监控方案

广州-深圳高速公路原CCTV系统采用光端机+矩阵的模式,外场视频采用点对点光端机,传输至收费站后由复用光端机复用上传到路段监控中心矩阵输出进行监控。 由于原系统采用的是光端机多级级联方式,且线路已经老化,图像质量已不能满足监控需求。针 ...…

查看全部问答∨

我想问一下关于单片机前景与公司的情况

我刚学单片机,感觉挺有兴趣的,想问一下单片机的前景如何,是否有发展空间? 世界上最好的单片机与嵌入式系统有关的公司是哪一家啊?…

查看全部问答∨

quartus ii 中自动分配管脚的三种方法

本文转载于网络 1.编写tcl文件 (1)在Quartus中新建一个Tcl Scripe File,文件内容的格式如下: #setup.tcl#setup pin settingset_global_assignment -name RESERVE_ALL_UNUSED_PINS \"AS INPUT TRI-STATED\"set_global_assignment -name ENA ...…

查看全部问答∨

如何使用FLASH(非EPCS) 配置FPGA

有套FPGA开发板没EPCS记得有种用FLASH配置FPGA方法,好像需要转换成JIC文件(时间太长久了,好久没用过这种没EPCS的板子了),求助各位大虾…

查看全部问答∨

注册参加Altera 2011亚太技术巡展

注册参加Altera 2011亚太技术巡展 日期: 2011年8月至9月地区:成都、上海、杭州、南京、深圳广州、北京、武汉、西安立即了解活动详情 Altera 2011技术巡展主要介绍业界领先的最新28-nm技术是怎样满足用户各种设计需求的。在这些研讨会上,您将 ...…

查看全部问答∨

串口调试问题

想请教个串口调试问题,用上位机控制单片机五个IO口的状态,同时通过单品机读取另外五个状态 #include <reg51.h> #include <intrins.h> sfr AUXR = 0x8e; sfr AUXR1 =0xA2; sfr BRT = 0x9c; sbit MCU_Run_Led = P1^3;   / ...…

查看全部问答∨

矩阵键盘扫描显示,编译通过,但实验板上没有效果,困惑呀!!!

#include<reg52.h>#define uchar unsigned char#define uint unsigned intvoid delay10ms();void delay(uint t);void display(uint num,uchar weishu);uchar keyscan();sbit wei=P2^7;sbit duan=P2^6;uchar code weima[]={0x01,0x02,0x04,0x08, ...…

查看全部问答∨

让操作库变得简单(野火的)

呵呵新手可以好好学习下…

查看全部问答∨

关于旋转倒立摆大家的控制程序怎么写的?

本帖最后由 paulhyde 于 2014-9-15 03:21 编辑 亲们说说你们对程序的思路,参考参考    …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved