|
|
| | -文章搜索 - 最新文章 - | |
LCD1502驱动程序 |
| 发布时间:2005年9月18日 点击次数:2492 |
| 来源: 作者: |
-------------------------------------------------------------------------------- ;LCD部分用到的RAM 0200H~~~~021FH 用到的Rn有R15/R14 ;LCD复位子程序(LCD_REST)不须要设事先置直接调用即可 ;半屏显示子程序(LCD)在调用前必须送入页地址 例如:MOV.B #0B8H,LCD_PAGE_BRAM ; CALL #LCD 显示上屏 ; :MOV.B #0BAH,LCD_PAGE_BRAM ; CALL #LCD 显示下屏 ;LCDUP_WORD0_BRAM~~~LCDUP_WORD6_RAM 是上屏显示字的代码寄存器一屏显示7个字 ;LCDDOWN_WORD0_BRAM~~~LCDDOWN_WORD6_RAM 是下屏显示字的代码寄存器一屏显示7个字 ;每屏显示是以中间为基准向两边平均显示 在调用半屏显示子程序时已经自动计算LCD的列地址 ;清屏指令可分全屏清除(LCD_CLEAR_ALL)和半屏清除(LCD_CLEAR) ;注 全屏清除子程序不需入口直接调用就行 而半屏清除子程序在调用前入口与半屏显示子程序相同 #include "msp430x14x.h" NAME LCD MODULE LCD PUBLIC LCD RSEG PROM ;=========LCD================================== ;A0=1为数据 A0=0为命令 #define A0 04H #define E1 02H #define E2 01H #define BIT_OUT P4OUT #define DATA_BUS P2OUT ;=============LCD____8RAM的位定义=============== #define LCD_COM_BRAM 0200H #define LCD_DATA_BRAM 0201H #define LCD_LIE_BRAM 0202H #define LCD_PAGE_BRAM 0203H ;=============LCD_UP_RAM============================ #define LCDUP_WORD0_BRAM 0204H #define LCDUP_WORD1_BRAM 0205H #define LCDUP_WORD2_BRAM 0206H #define LCDUP_WORD3_BRAM 0207H #define LCDUP_WORD4_BRAM 0208H #define LCDUP_WORD5_BRAM 0209H #define LCDUP_WORD6_BRAM 020AH ;==========下面的RAM只是在测试状态下才会用到===== #define LCDUP_WORD7_BRAM 020BH ;=============LCD_DOWN_RAM===================== #define LCDDOWN_WORD0_BRAM 020CH #define LCDDOWN_WORD1_BRAM 020DH #define LCDDOWN_WORD2_BRAM 020EH #define LCDDOWN_WORD3_BRAM 020FH #define LCDDOWN_WORD4_BRAM 0210H #define LCDDOWN_WORD5_BRAM 0211H #define LCDDOWN_WORD6_BRAM 0212H ;==========下面的RAM只是在测试状态下才会用到===== #define LCDDOWN_WORD7_BRAM 0213H ;=============LCD_数据寄存器_RAM================= #define LCD_R0_BRAM 0214H #define LCD_R1_BRAM 0215H ;=============LCD____16RAM的位定义=============== #define LCD_COUNT_WRAM 021CH #define LCD_WORD_WRAM 021EH ;=============LCD____BIT的位定义=============== #define LCD_BIT_RAM 0220H #define LCD_E1_E2 0000H ;是LCD左右屏选择为BIT=1选通左边 BIT=0选通右边 #define LCD_INV 02H ;高电平时显示反白 ;--------------------------------------------------- ;=========================================================== LCD_E1_COM BIC.B #A0,&BIT_OUT ;A0置低 设为命令通道 MOV.B LCD_COM_BRAM,&LCD_BUS ;输出命令 BIS.B #E1,&BIT_OUT ;开E1 BIC.B #E1,&BIT_OUT ;关E1 RET ;反回 LCD_E2_COM BIC.B #A0,&BIT_OUT ;A0置低 设为命令通道 MOV.B LCD_COM_BRAM,&LCD_BUS ;输出命令 BIS.B #E2,&BIT_OUT ;开E2 BIC.B #E2,&BIT_OUT ;关E2 RET ;反回 LCD_E1_DATA BIS.B #A0,&BIT_OUT ;A0置高 设为命令通道 MOV.B LCD_DATA_BRAM,&LCD_BUS ;输出命令 BIS.B #E1,&BIT_OUT ;开E1 BIC.B #E1,&BIT_OUT ;关E1 RET ;反回 LCD_E2_DATA BIS.B #A0,&BIT_OUT ;A0置高 设为数据通道 MOV.B LCD_DATA_BRAM,&LCD_BUS ;输出命令 BIS.B #E2,&BIT_OUT ;开E2 BIC.B #E2,&BIT_OUT ;关E2 RET ;反回 ;================CLEAR_LCD_DISPALY============== ;每次直接调用程序就可以清全屏显示 不须入口 LCD_CLEAR_ALL CLR R15 CLR R14 LCD_CLEAR_ALL_1 BIS.B #0B8H,R15 MOV.B R15,LCD_COM_BRAM CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #00H,LCD_COM_BRAM CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #61D,R14 LCD_CLEAR_ALL_2 MOV.B #000H,LCD_DATA_BRAM CALL #LCD_E1_DATA CALL #LCD_E2_DATA CLRZ DEC.B R14 JNZ LCD_CLEAR_ALL_2 INC.B R15 CLRZ CMP.B #0BCH,R15 JNE LCD_CLEAR_ALL_1 RET ;================CLEAR_LCD_DISPALY============= ;每次直接调用程序就可以清半屏显示 ;调用前必须送入页地址到LCD_PAGE_RAM(页地址寄存器) ;例如:MOV.B #0B8H,LCD_PAGE_BRAM ; :CALL #LCD_CLEAR 就是清上半屏显示 ; :MOV.B #0BAH,LCD_PAGE_BRAM ; :CALL #LCD_CLEAR 就是清下半屏显示 LCD_CLEAR CLR R15 MOV.B LCD_PAGE_BRAM,LCD_LIE_BRAM ADD.B #2D,LCD_LIE_BRAM LCD_CLEAR_1 BIS.B LCD_PAGE_BRAM,R15 MOV.B R15,LCD_COM_BRAM CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #00H,LCD_COM_BRAM CALL #LCD_E1_COM CALL #LCD_E2_COM MOV #61D,R14 LCD_CLEAR_2 MOV.B #00H,LCD_DATA_BRAM CALL #LCD_E1_DATA CALL #LCD_E2_DATA CLRZ DEC.B R14 JNZ LCD_CLEAR_2 INC.B R15 CLRZ CMP.B LCD_LIE_BRAM,R15 JNZ LCD_CLEAR_1 RET ;===============RESETTING_LCD_MODE============= ;调用此程序是使LCD复位并进入工作状态 LCD_REST MOV.B #0E2H,LCD_COM_BRAM ;复位 CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #0A4H,LCD_COM_BRAM ;关闭休闲状态 CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #0A9H,LCD_COM_BRAM ;设置1/32占空比 CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #0A0H,LCD_COM_BRAM ;正向排序设置 CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #0C0H,LCD_COM_BRAM ;设置显示起始行为第一行 CALL #LCD_E1_COM CALL #LCD_E2_COM MOV.B #0AFH,LCD_COM_BRAM ;开显示设置 CALL #LCD_E1_COM CALL #LCD_E2_COM RET ;查LCD PAGE #0B8H.#0B9H/#0BAH.#0BBH上屏须要显示的个数 ;这段程序已测试过 03-3-12 9:55 ;R15/R14/R13 LCD_CHK CLR LCD_COUNT_RAM MOV.B #8,LCD_R0_RAM ;查殉上屏须要显示的个数,一屏最多可以显示7个16X16 CLR.B LCD_LIE_BRAM ;清上屏查殉结果寄存器 MOV LCD_WORD_RAM,R14 ;把须要检查字的首位16位地址放进R14.LCD_WORD_RAM ;定义时必须是16位地址 LCD_CHK_0 DEC.B LCD_R0_RAM JZ LCD_CHK_1 ;测试完成退出 CLRZ MOV.B @R14+,LCD_COUNT_RAM TST.B LCD_COUNT_RAM ;测试每个字寄存器是否为零 JZ LCD_CHK_0 ;为零时转 INC.B LCD_LIE_BRAM ;大于零查殉结果寄存器加一 JMP LCD_CHK_0 ;反回测试 LCD_CHK_1 CLR LCD_COUNT_RAM MOV.B LCD_LIE_BRAM,LCD_COUNT_RAM MOV LCD_COUNT_RAM,&MPY ;把检测的结果乘以16 MOV #16D,&OP2 MOV &RESLO,LCD_COUNT_RAM ;相乘的结果放回寄存器 MOV.B LCD_COUNT_RAM,LCD_LIE_BRAM RRA.B LCD_LIE_BRAM ;结果除2.放到上屏页的寄存器 MOV.B #61D,LCD_COUNT_RAM SUB.B LCD_LIE_BRAM,LCD_COUNT_RAM MOV.B LCD_COUNT_RAM,LCD_LIE_BRAM RET ;调用前必须把要显示屏第一个字的地址放在R15内 ;列:MOV #LCDUP_WORD0_BRAM,LCD_WORD_RAM ;MOV #LCDDOWN_WORD0_BRAM,LCD_WORD_RAM ;用到的寄存器R15/R14 LCD CLRZ CMP.B #0B8H,LCD_PAGE_BRAM JNE LCD_1 MOV #LCDUP_WORD0_BRAM,LCD_WORD_RAM JMP LCD_0 LCD_1 MOV #LCDDOWN_WORD0_BRAM,LCD_WORD_RAM LCD_0 CALL #LCD_CHK BIS.B #BIT0,LCD_BIT_RAM MOV.B #7D,LCD_R1_RAM ;每次调用均连续显示7个16X16的字 而遇到字寄存器是 MOV LCD_WORD_RAM,R15 ;零就反回因为字表里面是没有零的 LCD_DISPALY CLR R14 MOV.B @R15+,R14 TST R14 ;R15是显示字首位地址寄存器,准备用于间接寻址 JZ LCD_RET ;字寄存器是零就反回 MOV #32D,&MPY ;查表然后吧结果送到寄存器 MOV R14,&OP2 MOV &RESLO,LCD_COUNT_RAM ADD #LCD_DB,LCD_COUNT_RAM MOV LCD_COUNT_RAM,R14 MOV.B #32D,LCD_R0_RAM ;R14用于放计算查找数据的个数 LCD_PAGE MOV.B LCD_PAGE_BRAM,LCD_COM_BRAM;把页地址送到命令寄存器 CLRZ BIT.B #BIT0,LCD_BIT_RAM ;LCD_BIT_RAM的BIT0=LCD_E1_E2为高时转到E1发送,第就是E2 JZ LCD_PAGE_E2 ;Z为零就转到E2 否则向下工作 LCD_PAGE_E1 CALL #LCD_E1_COM ;向E1发送页地址 JMP LCD_LIE ;跳去列发送 LCD_PAGE_E2 CALL #LCD_E2_COM ;向E2发送页地址 LCD_LIE MOV.B LCD_LIE_BRAM,LCD_COM_BRAM;把列地址送到命令寄存器 CLRZ BIT.B #BIT0,LCD_BIT_RAM ;LCD_BIT_RAM为高时转到E1发送,第就是E2 JZ LCD_LIE_E2 ;Z为零就转到E2 否则向下工作 LCD_LIE_E1 CALL #LCD_E1_COM ;向E1发送列地址 JMP LCD_DATA LCD_LIE_E2 CALL #LCD_E2_COM ;向E2发送列地址 LCD_DATA CALL #LCD_FIND_DATA ;调用数据发送命令 CLRZ BIT.B #BIT0,LCD_PAGE_BRAM ;测试页寄存器的BIT0位 JNZ LCD_PAGE_0 ;大于零(即是BIT0=1)就转 BIS.B #BIT0,LCD_PAGE_BRAM ;把页寄存器的BIT0位置高(原来是低#0B8H/#0BAH) JMP LCD_RETURN LCD_PAGE_0 BIC.B #BIT0,LCD_PAGE_BRAM ;把页寄存器的BIT0位置低(原来是高#0B9H/#0BBH) INC.B LCD_LIE_BRAM ;列地址加一 CLRZ CMP.B #61D,LCD_LIE_BRAM ;检查列有没有超过61列 JNZ LCD_RETURN ;Z大于零就转 等于零就向下工作 CLR.B LCD_LIE_BRAM ;清列寄存器 CLRZ BIT.B #BIT0,LCD_BIT_RAM ;测试LCD_BIT_RAM位 在E1就转为E2 在E2就立即反回 JNZ LCD_PAGE_1 ;Z为零就转到E2 否则向下工作 JMP LCD_RET ;转到子程序反回命令 LCD_PAGE_1 BIC.B #BIT0,LCD_BIT_RAM ;把LCD_BIT_RAM位置低 设为E2显示状态 JMP LCD_PAGE ;反回页传送命令地址 LCD_RETURN CLRZ DEC.B LCD_R0_RAM ;查找数据的个数寄存器减1 JNZ LCD_PAGE ;R14大于零转回页传送命令地址 CLRZ DEC.B LCD_R1_RAM ;字个数寄存器减1 BIC.B #BIT0,LCD_PAGE_BRAM JNZ LCD_DISPALY ;反回主显示调用程序 LCD_RET RET ;反回主程序 ;=================================================== LCD_FIND_DATA MOV.B @R14+,LCD_DATA_BRAM CLRZ BIT.B #INV_BIT,LCD_BIT_RAM JZ NO_INV INV.B LCD_DATA_BRAM NO_INV CLRZ BIT.B #BIT0,LCD_BIT_RAM ;测试LCD_BIT_RAM位 在E1就转为E2 在E2就立即反回 JZ LCD_FIND_E2 ;Z为零就转到E2 否则向下工作 CALL #LCD_E1_DATA ;调用E1数据发送子程序 JMP LCD_FIND_DATA_RET LCD_FIND_E2 CALL #LCD_E2_DATA ;调用E2数据发送子程序 LCD_FIND_DATA_RET RET END LCD |
|
|
|
|
[技术文章] 相关文章: 缓熔表面贴装保险丝简介:
生产商: 瑞侃 Raychem 产品说明: 该系列缓熔表面贴装保险丝符合有害物质限制指令(RoHS ),按照行业标准的1206芯片尺寸进行生产。产品的电流值范围为1.0~8.0A,其突出的时间特性为:在100%额定电流下至少运行4个小时;在200%额定电流下最大120s和至少1s的运行时间;在300%额定电流下最大3s和至少0.1s的运行时间;在400%额定电流下最大0.05s和至少0.002s的运行时间。 该系列缓熔保险丝应用范围是上限为63V的直流电源,它提供的过电流保护适用于在正常运行中频繁出现较大浪涌电...... 关于串口连接线的制作方法
嵌入式处理器漫谈
vxworks开发的一点心得
1/6英寸VGA CMOS图像传感器OV7670
关于计算机接口的小结
国内外EDA软件浅视
运放型号简介
常用元器件的识别
PCB抄板密技 |
|
|
|