;************************************************
;* 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 *
上一篇:以C语言完成读写24LCxx系列的EEPROM的实例
下一篇:用HI-TECH C写的使用PIC12C508单片机读写93LC46范例程式
推荐阅读
史海拾趣
在电子行业中,艾迪沃德公司(Beijing IDworld Science & Technology Development Co., Ltd.)的发展历程充满了技术创新与市场拓展的亮点。以下是五个关于艾迪沃德公司发展起来的相关故事,每个故事均基于事实描述,旨在展现其成长轨迹。
1. 创立与技术创新起点
艾迪沃德公司成立于2004年6月,自创立之初便确立了以研究、开发国际先进指纹识别技术为基本战略的发展方向。在那个指纹识别技术刚刚兴起的时代,艾迪沃德凭借其前瞻性的视野,迅速投入到这一领域的探索中。公司自主研发的指纹识别技术,经过不断迭代与优化,逐渐成为了业界公认的优秀指纹识别核心算法之一。这一技术突破不仅为公司赢得了市场的初步认可,更为后续的产品开发奠定了坚实的基础。
2. 产品多元化与市场拓展
随着技术的不断成熟,艾迪沃德开始将指纹识别技术应用于更多领域,推出了包括指纹考勤机、指纹门禁系统、指纹保险柜在内的多元化产品系列。这些产品凭借其高安全性、便捷性和稳定性,迅速在市场中占据了一席之地。特别是在安防、金融、教育等行业,艾迪沃德的产品得到了广泛应用,进一步巩固了其在指纹识别领域的市场地位。
3. OEM与ODM业务的发展
为了满足不同客户的定制化需求,艾迪沃德积极拓展OEM(原始设备制造商)和ODM(原始设计制造商)业务。公司凭借其强大的研发能力和生产能力,为众多合作伙伴提供从产品设计、生产到售后的全方位服务。这一业务模式不仅为公司带来了稳定的收入来源,还进一步提升了艾迪沃德在电子行业中的知名度和影响力。
4. 技术支持与解决方案提供
艾迪沃德深知技术支持对于客户的重要性,因此公司组建了一支专业的技术支持团队,为客户提供包括技术咨询、方案设计、系统集成在内的全方位服务。无论是大型项目还是小型应用,艾迪沃德都能根据客户的具体需求,提供量身定制的解决方案。这种以客户为中心的服务理念,赢得了客户的广泛赞誉和信赖。
5. 国际合作与品牌建设
在国际化战略的推动下,艾迪沃德积极参与国际交流与合作,与多家国际知名企业建立了良好的合作关系。通过引进国外先进技术和管理经验,艾迪沃德不断提升自身的竞争力和创新能力。同时,公司还加大了品牌建设的力度,通过参加国际展会、发布新品等方式,提升品牌知名度和美誉度。这些努力不仅为公司带来了更多的国际合作机会,也为艾迪沃德在全球电子行业中树立了良好的品牌形象。
为了更好地服务全球客户,Horn公司积极实施全球化战略。通过在海外设立分公司和与分销商建立紧密合作关系,Horn公司的产品和服务能够迅速覆盖到全球各地。这种全球化布局不仅提升了公司的市场影响力,还促进了技术交流与合作,为公司带来了更多的发展机遇。
随着国内市场的饱和,C-TON开始将目光投向国际市场。公司制定了全球化的发展战略,通过设立海外分公司、参加国际展会等方式,积极开拓海外市场。同时,C-TON还加强了与国际同行的交流与合作,学习借鉴他们的先进经验和技术。这些举措使得C-TON的产品逐渐在国际市场上占据了一席之地,公司的业务范围也得到了极大的拓展。
在质量管理方面,Esterline Power Systems始终坚持以客户为中心,追求卓越品质。公司引入了先进的质量管理体系,并通过了ISO 9001等国际标准认证。同时,公司还建立了严格的质量检测机制,确保每一件产品都符合高标准的质量要求。此外,公司还鼓励员工提出改进建议,通过持续改进来不断提升产品质量和客户满意度。
在质量管理方面,Esterline Power Systems始终坚持以客户为中心,追求卓越品质。公司引入了先进的质量管理体系,并通过了ISO 9001等国际标准认证。同时,公司还建立了严格的质量检测机制,确保每一件产品都符合高标准的质量要求。此外,公司还鼓励员工提出改进建议,通过持续改进来不断提升产品质量和客户满意度。
在电子行业的快速发展中,芯力微公司始终保持着敏锐的市场洞察力。2010年,随着智能手机市场的崛起,公司迅速识别到电源管理芯片的巨大潜力。通过持续的技术研发,芯力微成功推出了具有低压低功耗特点的电源管理芯片,赢得了市场的广泛认可。这一技术突破不仅帮助公司进入了新的市场领域,也为后续的发展奠定了坚实的基础。
广州-深圳高速公路原CCTV系统采用光端机+矩阵的模式,外场视频采用点对点光端机,传输至收费站后由复用光端机复用上传到路段监控中心矩阵输出进行监控。 由于原系统采用的是光端机多级级联方式,且线路已经老化,图像质量已不能满足监控需求。针 ...… 查看全部问答∨ |
|
本文转载于网络 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 ...… 查看全部问答∨ |
|
有套FPGA开发板没EPCS记得有种用FLASH配置FPGA方法,好像需要转换成JIC文件(时间太长久了,好久没用过这种没EPCS的板子了),求助各位大虾… 查看全部问答∨ |
注册参加Altera 2011亚太技术巡展 日期: 2011年8月至9月地区:成都、上海、杭州、南京、深圳广州、北京、武汉、西安立即了解活动详情 Altera 2011技术巡展主要介绍业界领先的最新28-nm技术是怎样满足用户各种设计需求的。在这些研讨会上,您将 ...… 查看全部问答∨ |
矩阵键盘扫描显示,编译通过,但实验板上没有效果,困惑呀!!! #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, ...… 查看全部问答∨ |
|