PIC单片机液晶显示模块编程
pic单片机LCD显示控制

LIST P=16F877IN CLUDE"P16F877.I NC" W_ EQU70HS TATUS_ EQU 71HPCL ATH_EQU 72HT MR0BEQU .5E EQ U 00HRW EQ U 01HRS EQ U 02HCS2 EQ U 03HCS1 EQ U 04HBZW EQ U 2BH;标志位LCD_D ATA EQU20H;l cd数据缓存器XY EQU21H;选择页缓冲器R0 EQ U 22H;缓存器R1 EQ U 23H;缓存器XP EQ U 24H;选屏寄存器XLEQU 25H;选择显示列缓存器XHEQU 26H;选择行缓存器RA EQ U 27H;查表指针SZJE QU 28H;显示数据上半页XZJ EQ U 29H;显示数据下半页CBYM EQU 2AH;查表页面选择T0R0 EQU 2BHT1R1 EQU 2CHR4 EQU 2DHR5 EQ U 2E HSHI EQU 2FHQIAN WEI EQU 30HFEN EQU 31HB AIWEIE QU 32HMI AO EQ U 33HSHI WEI EQU 34HHAOM EQU 35HGEWEIEQU 36HC RCH E QU 37HCR CL EQ U 38HR3 E QU 39H;变量寄存器R10 EQ U 3AH;BCD码高8位,16位除数高8位R11 EQ U 3BH;BCD码中8位,16位除数低8位R12 EQ U 3CH;BCD码低8位,16位被除数高8位R13 E QU 3D H;二进制转BCD中间寄存器,16位被除数低8位 R14EQU 3EH;二进制高8位,16位商高8位R15 EQ U 3FH;二进制低8位,16位商低8位R16 EQU40H;余数高8位R17EQU 41H;余数低8位R18 E QU 42H;中间缓存高8位R19EQU 43H;中间缓存低8位R20 EQU44H;A DC结果缓存器J L EQU45H;16位减数低字节J H EQU46H;16位减数高字节B JL EQU47H;16位被减数低字节BJH EQU 48H;16位被减数高字节CAL EQ U 49H;16位差低字节CAH EQU 4AH;16位差高字节B TLJS EQU4BH;数据接收结束时间R2 EQU4CH;变量寄存器R6 EQ U 7FH;变量寄存器R7EQU 7EH;R8 EQU 7DHR9 EQ U 7CHTXSJE QU 4D H;数据接收缓存区为A0到B F;数据发送缓冲器为C0到E F;读取的数据区为190开始的寄存器ORG 0000HN OP GOT O SAT RT ORG0004HM OVWFW_ SWAP F STA TUS,WMOVWF STAT US_ MOV F PCL ATH,WMOVWF PCLA TH_;入栈保护 BCF INTC ON,GI E;关闭总中断 BCFSTATU S,RP0BC F INT CON,T0IF INC F R4,1MOVFR4,WSUBLW .1 BTF SS ST ATUS,ZGOTOFANHCL RF R4I NCF H AOM,1M OVF H AOM,W;TR0时间继电器数据SUBLW .10BT FSS S TATUS,Z GOTO FANHC LRF H AOMS J1S INCFMIAO,1MOVFMIAO,WSUBLW .10BT FSS S TATUS,Z GOTO FANHC LRF M IAO INC F FEN,1 MOVF FEN,W;TR1时间继电器数据 SUBL W .10B TFSSSTATU S,Z GOT O FAN HCLRFFEN INC F SHIM OVF S HI,W;TR1时间继电器数据S UBLW.10 BTF SS ST ATUS,ZGOTOFANHCL RF SH IFANH MO VLW T MR0BMOVWF TMR0FANH0 BSF INTC ON,GI E MOVF PCLA TH_,WMOVWF PCLA TH SWA PF ST ATUS_,W MOV WF ST ATUSS WAPFW_,FS WAPFW_,WR ETFIESATR T BSF STAT US,RP0 MO VLW 07HMOVWF 0C3H MOVW F OPT ION_R EGCLRFTRISB;B端口输出MOVLW B'10000000'MOVWF TRIS C;C端口输出MOVLW 0H MOVW F TRI SD;D端口输出 MOVL W 19H MO VWF S PBRG MOV LW B'00100100' MOV WF TX STA ;B SF PI E1,5;使能SCI串行接收中断B CF ST ATUS,RP0;选择数据体0 MOVL W B'10100000' ;MOVWF INTC ON MO VLW B'10010000' MOVW F RCS TA MO VLW T MR0BMOVWF TMR0 CL RF PO RTD CLRF RA MOVL W 0FF HM OVWFR5CALLYANSH IC ALL Y ANSHI CA LL YA NSHI CAL L YAN SHI CALL YANS HIDECFS Z R5 GOT O $-6 CA LL MO DBUS GOT O $;延时子程序YA NSHIMOVLW 0FFH MOVW F R16G1 DECF SZ R16 GOTOG1 RE TURN;忙判断子程序MA NGPDBCF S TATUS,RP0;选择数据体0 ;忙判断B CF PO RTC,R SB SF PO RTC,R WB SF PO RTC,E BS F STA TUS,R P0MOVLW 0FFH MO VWF T RISB;把B端口设置为输入 BC F STA TUS,R P0A1 BTF SS PO RTB,7 GO TO A1 BC F POR TC,E BSF STAT US,RP0C LRF T RISB BCF STAT US,RP0 D E4 RETU RN;写命令子程序XMLCALLMANGP D;调用忙判断子程序 BC F POR TC,RS BC F POR TC,RW MO VF LC D_DAT A,W MOVW F POR TBBSF P ORTC,EN OPNOP BCFPORTC,ERETUR N;写数据子程序XS J CALL MANG PDBSF P ORTC,RSBCF P ORTC,RWMOVFLCD_D ATA,W MO VWF P ORTB BSF PORT C,E NOP NOP BC F POR TC,E RET URN;设置显示的页子程序SZY MO VLW 0B8H;B8为页设置指令。
pic单片机KS0066U控制器的液晶LCD面板的控制程序

;*************************************************;* LCD.ASM **;*************************************************;* 本程序包含控制外部液晶面板的4-BIT控制模式子程序。
;*这些程序是专门为演示板设计的。
但它也可作为其他类;*型的使用KS0066U控制器的液晶面板的控制程序。
;* 占用I/O RB1-RB5,RA5;* 使用RAM 2个字节;* 程序包括:;* - InitLCD 初始化液晶面板函数;* - putcLCD 将字符写入LCD的函数;* - SendCmd 将命令写入LCD的函数;* - clrLCD 清LCD显示函数;* 入口参数WREG;* 出口参数无;*LCD显示RAM地址:第一行0x80~8F;第二行0xC0~CF;************************************************#include p16f876a.inc ;定义所用单片机的头文件;******************************************************************** ***********;* 外部函数及变量;******************************************************************** ***********extern LongDelay,Delay;******************************************************************** ***********;* 定义LCD数据& 控制I/O口;可以用任意的6个普通的I/O管脚定义;实际连线依据该部分定义;******************************************************************** ***********#define LCD_DB7 PORTB,5 ;占用的I/O口定义#define LCD_DB6 PORTB,4 ;该行硬件连接:LCD的DB6与RB4连接,其它类推#define LCD_DB5 PORTB,3 ;#define LCD_DB4 PORTB,2 ;#define LCD_E PORTA,5 ;#define LCD_RS PORTB,1 ;#define LCD_DB7_DIR TRISB,5 ;对应的方向寄存器定义#define LCD_DB6_DIR TRISB,4 ;#define LCD_DB5_DIR TRISB,3 ;#define LCD_DB4_DIR TRISB,2 ;#define LCD_E_DIR TRISA,5 ;#define LCD_RS_DIR TRISB,1 ;;******************************************************************************; LCD 模块命令#define DISP_ON 0x00C ; 开显示#define DISP_ON_C 0x00E ; 开显示, 开指针#define DISP_ON_B 0x00F ; 开显示, 开指针,开闪烁#define DISP_OFF 0x008 ; 关显示#define CLR_DISP 0x001 ; 清显示的操作数#define ENTRY_INC 0x006 ; 操作数#define ENTRY_INC_S 0x007 ; 操作数#define ENTRY_DEC 0x004 ; 操作数#define ENTRY_DEC_S 0x005 ; 操作数#define DD_RAM_ADDR 0x080 ; 初始化第一行显示的操作数#define DD_RAM_UL 0x0c0 ; 初始化第二行显示的操作数;*******************************************************LCD_group udata ;数据区;*******************************************************LCD_TEMP res 1Byte res 1LCD_DATA1 res 1;****************************************************************** PROG_LCD CODE ;程序区;******************************************************************* ;* LCD 模块子函数* ;******************************************************************* ;InitLCD——初始化LCD模块* ;******************************************************************* InitLCDglobal InitLCDbsf STATUS,RP0 ;Bank 1bcf STATUS,RP1 ;初始化相关I/O引脚bcf LCD_DB7_DIRbcf LCD_DB6_DIRbcf LCD_DB5_DIRbcf LCD_DB4_DIRbcf LCD_E_DIRbcf LCD_RS_DIRbcf STATUS,RP0 ;Bank 0bcf LCD_DB7bcf LCD_DB6bcf LCD_DB5bcf LCD_DB4bcf LCD_Ebcf LCD_RSbsf LCD_E ;清数据线bcf LCD_Ebsf LCD_DB5 ;设置LCD工作方式bsf LCD_Ebcf LCD_Ecall LongDelaymovlw 0x28 ;再次设置工作方式call SendCmd ;四位数据总线,两行显示,5X7点阵字符movlw DISP_ON ;开显示call SendCmdmovlw ENTRY_INC ;设置指针移动方式call SendCmdmovlw DD_RAM_ADDR ;设置起始地址call SendCmdcall clrLCD ;清屏return;******************************************************************* ;*putcLCD——将字符数据送入LCD*;* 本程序将字符数据分成了高半字节和低半字节分别输入* ;* 先送入的是高半字节* ;******************************************************************* putcLCDglobal putcLCDbsf LCD_RS ;设置为送数据模式movwf Byte ;存WREG 到Byte 寄存器call write ;写入高半字节swapf Byte,F ;送入数据的低字节call write ;接着送低半字节call Delayreturn;******************************************************************* ;* SendCmd - 送命令到LCD * ;* 本程序将命令数据分成了高半字节和低半字节分别输入* ;* 先送入的是高半字节* ;******************************************************************* SendCmdglobal SendCmdbcf LCD_RS ;设置为送命令模式movwf Byte ;存WREG 到Byte 寄存器call write ;送入命令的高字节swapf Byte,F ;送入命令的低字节call writecall Delayreturn;******************************************************************* ;* clrLCD - 清除LCD 显示* ;******************************************************************* clrLCDglobal clrLCDmovlw CLR_DISP ;call SendCmdreturn;******************************************************************* ;*write - 送半个字节数据;****************************************************************** writebcf LCD_DB7 ;清数据线bcf LCD_DB6bcf LCD_DB5bcf LCD_DB4btfsc Byte,7 ;写入半字节bsf LCD_DB7btfsc Byte,6bsf LCD_DB6btfsc Byte,5bsf LCD_DB5btfsc Byte,4bsf LCD_DB4bsf LCD_E ;发送数据信号bcf LCD_Ereturn;*********************************************************** END。
单片机IIC模块LCD1602液晶显示屏——电气原理图、实物图、源程序代码

单片机IIC模块LCD1602液晶显示屏电气原理图单片机IIC模块LCD1602液晶显示屏实物图图1 LCD1602IIC模块图2 PCF8574T模块(IIC模块)图3 LCD1602模块单片机IIC模块LCD1602液晶显示屏源程序#include<reg52.h> //STC89C52RC单片机#define uchar unsigned charsbit sda=P2^4;sbit scl=P2^5;uchar i;uchar code t0[]="XWDZLCD1602 TEST";uchar code t1[]="1234567890ABCDEF";void delay(){;;}void start() //开始信号{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //应答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}void init(){sda=1;delay();scl=1;delay();}void write_byte(uchar date){uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;delay();}void delay1(uchar x){uchar a,b;for(a=x;a>0;a--)for(b=200;b>0;b--);}void write_add(uchar date1){start();write_byte(0x7e); //8574A地址+写入(8574 地址+写入0x4e) respons();write_byte(date1);respons();stop();}void write_com(uchar com) //写命令函数{uchar com1,com2;com1=com|0x0f;write_add(com1 &0xfc);delay1(2);write_add(com1 &0xf8);com2=com<<4;com2=com2|0x0f;write_add(com2&0xfc);delay1(2);write_add(com2&0xf8);}void write_date(uchar date) //写数据函数{uchar date1,date2;date1 =date|0x0f;write_add(date1 &0xfd);delay1(2);write_add(date1 &0xf9);date2=date<<4;date2=date2|0x0f;write_add(date2&0xfd);delay1(2);write_add(date2&0xf9);}void init_lcd() //初始化函数{write_add(0x08); //默认开始状态为关使能端,见时序图选择状态为写write_com(0x0f);write_com(0x28); //显示模式设置0x28中高位2,设置4线。
PIC单片机的C语言编程指南

PIC单片机的C语言编程指南PIC单片机是一种常用的嵌入式系统开发平台,其具有低功耗、成本低廉、易于编程等优点,在工业自动化、电子设备控制等领域有着广泛应用。
本文将为读者提供一份PIC单片机的C语言编程指南,帮助初学者快速入门并掌握基本的编程技巧。
首先,我们需要了解一些PIC单片机的基本概念。
PIC单片机采用哈佛结构,具有多种型号和系列,每个系列有多个型号可供选择。
不同的型号和系列有不同的特性和功能,因此在编程时需要根据具体的芯片型号进行适配。
PIC单片机的编程语言常用的是C语言,其语法简洁,易于理解和学习,并且具有较高的可移植性。
在编写PIC单片机的C语言程序时,我们需要按照以下步骤进行:1. 引入头文件:使用#include指令引入所需的头文件,头文件包含了定义和声明所需的函数和变量。
3.初始化:在程序开始时对所需的资源进行初始化,包括引脚配置、中断设置、定时器初始化等。
4.主循环:编写主循环代码,其中包括需要重复执行的功能,例如读取传感器数据、处理输入输出等。
5.中断处理:根据需要,编写中断处理函数,处理外部中断、定时器中断等。
6.清理工作:在程序结束时,进行一些清理工作,例如释放资源、关闭设备等。
下面是一个PIC单片机的C语言编程示例:```c#include <xc.h> // 引入XC8编译器的头文件#define LED_PIN RC0 // 定义LED连接的引脚void iniTRISC0=0;//配置RC0引脚为输出模式void maiinit(; // 初始化while(1)LED_PIN=1;//点亮LED__delay_ms(500); // 延时500毫秒LED_PIN=0;//关闭LED__delay_ms(500); // 延时500毫秒}```上述代码实现了一个简单的功能,即使LED灯以500毫秒的间隔交替点亮和关闭。
在程序中,我们首先引入了`<xc.h>`头文件,然后定义了一个宏`LED_PIN`来表示连接LED的RC0引脚。
pic16f877a编程实例

pic16f877a编程实例pic16f877a是一款常用的单片机,被广泛应用于嵌入式系统中。
它具有多种功能和强大的性能,可以实现各种应用需求。
本文将以pic16f877a编程实例为主题,介绍其基本特性和常见应用。
pic16f877a是一款8位单片机,采用哈佛架构,具有高性能和低功耗的特点。
它内置了8KB的程序存储器,368字节的数据存储器,以及35个I/O引脚,可以满足大多数嵌入式系统的需求。
我们来看一个简单的实例,通过pic16f877a控制LED灯的开关。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,LED灯亮__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,LED灯灭__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们首先将RB0引脚设置为输出引脚,然后进入一个无限循环。
在循环中,我们将RB0引脚电平设置为高,LED灯亮起,然后延时1秒;然后将RB0引脚电平设置为低,LED灯熄灭,再次延时1秒。
通过不断重复这个过程,我们可以实现LED灯的闪烁效果。
除了控制LED灯,pic16f877a还可以用来控制其他外设,如蜂鸣器、液晶显示屏等。
下面是一个使用pic16f877a控制蜂鸣器的实例。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,蜂鸣器鸣叫__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,蜂鸣器停止鸣叫__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们同样将RB0引脚设置为输出引脚,并进入一个无限循环。
单片机液晶显示程序设计

单片机液晶显示程序设计单片机液晶显示程序设计是指使用单片机控制液晶显示屏进行信息显示的程序编写和设计。
液晶显示屏是一种常见的显示设备,广泛应用于各种电子设备中,如计算器、手机、电视等。
在单片机系统中,通过控制液晶显示屏可以实现各种提示、警告、数据显示等功能。
在进行单片机液晶显示程序设计时,需要考虑以下几个方面:1.硬件连接:首先要确保单片机和液晶显示屏之间的连接正常。
一般来说,通过GPIO口来控制液晶显示屏。
液晶显示屏通常需要连接多个引脚,如数据线、使能线、读写线、控制线等。
2.初始化液晶显示屏:在程序开始时,需要对液晶显示屏进行初始化设置。
这包括设置液晶显示屏的工作模式、显示模式、光标位置等。
一般情况下,可以使用液晶显示屏提供的指令集来进行设置。
3.数据显示:单片机通过向液晶显示屏写入数据来实现信息显示。
可以通过调用相关的函数或直接操作寄存器来向液晶显示屏写入数据。
注意,写入数据时需要考虑字节数和显示位置。
5.数据更新:当需要更新液晶显示屏上显示的信息时,需要重新写入新的数据。
可以通过定时器或外部中断来触发数据更新操作。
例如,可以将单片机与其他外部设备连接起来,在外部设备有数据更新时,通过中断触发单片机将新数据写入液晶显示屏。
首先,根据液晶显示屏的型号和引脚连接,来设计硬件连接。
然后,在程序中进行液晶显示屏的初始化设置。
这包括设置液晶显示屏的工作模式、显示模式、光标位置等。
具体的设置可以参考液晶显示屏的技术手册。
接下来,设计字库,将字符的点阵信息保存到单片机中。
然后,根据需要,在液晶显示屏上显示相应的信息。
可以通过调用相关的函数或直接操作寄存器来写入数据。
最后,根据需要进行数据的更新和刷新。
可以通过定时器或外部中断来触发数据更新操作。
需要注意的是,在进行单片机液晶显示程序设计时,需要考虑到硬件和软件之间的配合,以及液晶显示屏的特性和功能。
如果对于液晶显示屏的使用不熟悉,可以参考相关的技术手册和资料,或者查找一些液晶显示屏的驱动库和示例程序来学习和借鉴。
PIC单片机在ICD做lcd显示时钟演示程序

PIC单片机在ICD做lcd显示时钟演示程序include <p16f877.inc>;*----; 定义LCD数据& 控制I/O口LCD_DA TA equ PORTBLCD_CNTL1 equ PORTBLCD_CNTL2 equ PORTA; 定义 LCD控制相应的I/O引脚RS equ 1E equ 5; LCD 模块命令DISP_ON EQU 0x00C ; 开显示DISP_ON_C EQU 0x00E ; 开显示, 开指针DISP_ON_B EQU 0x00F ; 开显示, 开指针,开闪烁DISP_OFF EQU 0x008 ; 关显示CLR_DISP EQU 0x001 ; 清显示的操作数ENTRY_INC EQU 0x006 ; 操作数ENTRY_INC_S EQU 0x007 ; 操作数ENTRY_DEC EQU 0x004 ; 操作数ENTRY_DEC_S EQU 0x005 ; 操作数DD_RAM_ADDR EQU 0x080 ; 初始化第一行显示的操作数DD_RAM_UL EQU 0x0c0 ; 初始化第二行显示的操作数; 设置显示相关寄存器Byte EQU 20HCount EQU 21HCount1 EQU 22HCount2 EQU 23HLCD_DATA1 EQU 24HPORTDB EQU 25HTemp EQU 26HTempH EQU 27HTempL EQU 28HINTSIG EQU 29HRTCCSIG1 EQU 2AHRTCCSIG EQU 2BHALRSIG EQU 2CHHour EQU 2DHHourH EQU 2EHHourL EQU 2FHHourL1 EQU 30HHourH1 EQU 31HMins EQU 32HMins1 EQU 33HMinsH EQU 34HMinsL EQU 35HMinsH1 EQU 36HMinsL1 EQU 37HSecs EQU 38HSecsH EQU 39HSecsL EQU 3AHALRH1 EQU 3BHALRM1 EQU 3CHALRH2 EQU 3DHALRM2 EQU 3EHALRH3 EQU 3FHALRM3 EQU 40H_WREG EQU 41H_STATUS EQU 42HHour1 EQU 43HADRESB EQU 44HBKM EQU 45H;*----org 0nopgoto startorg 4goto ISRorg 10CalTablebcf STATUS,RP0bcf PCLATH,0movlw 0x66 ; 进行校准处理subwf Temp,w ;addwf PCL,f ; 将补偿结果与 PCL相加dt 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5dt 6,6,6,7,7,7,8,8,8,9,9,0xa,0xa,0xb,0xb,0xc,0xcdt 0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x10,0x10,0x10dt 0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x14 dt 0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x18,0x18 dt 0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1cdt 0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0x1f,0x20,0x20dt 0x21,0x21,0x22,0x22,0x23,0x23,0x24,0x24,0x25,0x25dt 0x26,0x26,0x27,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2b dt 0x2c,0x2d,0x2e,0x2f,0x30,0x32startcall InitLCDclrf RTCCSIGclrf RTCCSIG1clrf INTSIGclrf Hourclrf Hour1clrf Minsclrf Mins1clrf Secsclrf ALRSIGmovlw 20hmovwf BKMmovlw b'10001111'movwf PORTDBmovlw 0ffhmovwf TMR0movlw 00movwf TMR1Lmovlw 80hmovwf TMR1Hmovlw b'00001111'movwf T1CONbsf STATUS,RP0bsf PIE1,TMR1IEbcf STATUS,RP0movlw b'10111111'OPTIONmovlw b'11110000'movwf INTCONmainmovlw 80hcall SendCmdcall DisplayTime ;显示时间movlw 0c0hcall SendCmdmovlw 'H'call putcLCDmovlw 'e'call putcLCDmovlw 'l'call putcLCDmovlw 'l'call putcLCDmovlw 'o'call putcLCDmovlw ' 'call putcLCDmovlw '!'call putcLCDmovlw ' 'call putcLCDmovlw ':'call putcLCDmovlw ')'call putcLCDmovlw ' 'call putcLCDmovlw ' 'call putcLCDcall BkLight ;背光控制call TempM ;显示温度btfsc ALRSIG,1call ALR1btfsc ALRSIG,2call ALR2btfsc ALRSIG,3call ALR3bcf STATUS,RP0bcf PCLATH,0movf RTCCSIG,Waddwf PCL,1goto maingoto RtccS1goto RtccS2goto Rtccs3goto Rtccs4clrf RTCCSIGclrf RTCCSIG1goto main;*=====ALR1 bcf STATUS,RP0 movf Hour,Wxorwf ALRH1,Wbtfss STATUS,Zmovf Mins,Wxorwf ALRM1,Wbtfss STATUS,Zgoto ALRENDbsf STATUS,RP0clrf TRISDbcf STATUS,RP0bcf STATUS,Crlf PORTDB,1btfsc STATUS,Cbsf PORTDB,0movf PORTDB,W movwf PORTDreturn;*---ALR2 bcf STATUS,RP0 movf Hour,Wxorwf ALRH2,Wbtfss STATUS,Zgoto ALRENDmovf Mins,Wxorwf ALRM2,Wbtfss STATUS,Zgoto ALRENDbsf STATUS,RP0clrf TRISDbcf STATUS,RP0bcf STATUS,Crlf PORTDB,1btfsc STATUS,Cbsf PORTDB,0movf PORTDB,W movwf PORTDreturn;*----ALR3 bcf STATUS,RP0 movf Hour,Wxorwf ALRH3,Wbtfss STATUS,Zgoto ALRENDmovf Mins,Wxorwf ALRM3,Wbtfss STATUS,Zbsf STATUS,RP0clrf TRISDbcf STATUS,RP0bcf STATUS,Crlf PORTDB,1btfsc STATUS,Cbsf PORTDB,0movf PORTDB,Wmovwf PORTDreturn;*---ALRENDbsf STATUS,RP0movlw 0ffhmovwf TRISDreturn;*=====RtccS1movlw 80hcall SendCmdcall DisplayTimecall LongDelaymovlw 0c0hcall SendCmd ;line2, 00 movlw 'S'call putcLCDmovlw 'e'call putcLCDmovlw 't'call putcLCDmovlw ' 'call putcLCDmovlw 'T'call putcLCDmovlw 'i'call putcLCDmovlw 'm'call putcLCDmovlw 'e'call putcLCD ;show "Set Time" movlw ' 'call putcLCDmovlw ' 'call putcLCD movlw ' 'call putcLCD movlw ' 'call putcLCD bsf PCLATH,0 movf RTCCSIG1,W addwf PCL,1 goto SetHour goto SetMins clrf INTSIGincf RTCCSIG clrf RTCCSIG1 goto main;*----SetHourmovlw 80hcall Selshow movlw d'24' subwf INTSIG,W btfsc STATUS,C goto $+4movf INTSIG,w movwf Hourgoto RtccS1clrf INTSIG movwf Hourgoto RtccS1;*----SetMinsmovlw 83hcall Selshow movlw d'60' subwf INTSIG,W btfsc STATUS,C goto $+4movf INTSIG,w movwf Minsgoto RtccS1clrf INTSIG movwf Minsgoto RtccS1;*=====RtccS2bcf STATUS,RP0 movlw 0c0hcall SendCmdcall Alarm movlw '1'call putcLCD movlw ' 'call putcLCDS2 movlw 80hcall SendCmdcall DisplayTime call DispTime call LongDelay bsf PCLATH,0 movf RTCCSIG1,W addwf PCL,1goto SetAlH2 goto SetAlM2 movf Hour1,w movwf ALRH1 movf Mins1,w movwf ALRM1clrf INTSIGclrf RTCCSIG1 incf RTCCSIG goto main;*---SetAlH2movlw 0c7hcall Selshow movf INTSIG,W btfss STATUS,Z bsf ALRSIG,1 movf INTSIG,W movwf Hour1 movlw d'24' subwf Hour1,W btfss STATUS,C goto S2clrf INTSIGclrf Hour1goto S2SetAlM2movlw 0cahcall Selshow movf INTSIG,W btfss STATUS,Z bsf ALRSIG,1 movf INTSIG,W movwf Mins1 movlw d'60' subwf Mins1,W btfss STATUS,C goto S2clrf INTSIGclrf Mins1goto S2;*----Alarm movlw 'A' call putcLCD movlw 'l'call putcLCD movlw 'a'call putcLCD ; movlw 'r'call putcLCD movlw 'm'call putcLCD ; return;*----Selshowcall SendCmd movlw ' 'call putcLCD movlw ' 'call putcLCD call LongDelay return;*=====Rtccs3bcf STATUS,RP0 movlw 0c0hcall SendCmd call Alarm movlw '2'call putcLCD movlw ' 'call putcLCDS3 movlw 80hcall SendCmdcall DisplayTime call DispTime call LongDelay bsf PCLATH,0 movf RTCCSIG1,w addwf PCL,1goto SetAlH3 goto SetAlM3 movf Hour1,w movwf ALRH2 movf Mins1,w movwf ALRM2clrf INTSIGclrf RTCCSIG1 incf RTCCSIG goto main;*---SetAlH3movlw 0c7hcall Selshow movf INTSIG,W btfss STATUS,Z bsf ALRSIG,2 movf INTSIG,W movwf Hour1 movlw d'24' subwf Hour1,W btfss STATUS,C goto S3clrf INTSIGclrf Hour1goto S3SetAlM3movlw 0cahcall Selshow movf INTSIG,W btfss STATUS,Z bsf ALRSIG,1 movf INTSIG,W movwf Mins1 movlw d'60' subwf Mins1,Wgoto S3clrf INTSIGclrf Mins1goto S3;*=====Rtccs4movlw 80hcall SendCmdcall DisplayTime bcf STATUS,RP0 movlw 0c0hcall SendCmdcall Alarm movlw '3'call putcLCD movlw ' 'call putcLCDS4 call DispTime call LongDelay bsf PCLATH,0 movf RTCCSIG1,w addwf PCL,1goto SetAlH4 goto SetAlM4 movf Hour1,w movwf ALRH3 movf Mins1,w movwf ALRM3clrf INTSIGclrf RTCCSIG1 incf RTCCSIG goto main;*---SetAlH4movlw 0c7hcall Selshow movf INTSIG,W btfss STATUS,Z bsf ALRSIG,3 movf INTSIG,W movwf Hour1 movlw d'24' subwf Hour1,Wgoto S4clrf INTSIGclrf Hour1goto S4SetAlM4movlw 0cahcall Selshowmovf INTSIG,Wbtfss STATUS,Zbsf ALRSIG,1movf INTSIG,Wmovwf Mins1movlw d'60'subwf Mins1,Wbtfss STATUS,Cgoto S4clrf INTSIGclrf Mins1goto S4;*=====ISRPushmovwf _WREG ; 存 WREG状态swapf STATUS,W ; 存 STATUS movwf _STATUS;*----bcf STATUS,RP0btfsc PIR1,TMR1IFcall TimeAdjbtfsc INTCON,INTFcall IntDealbtfsc INTCON,T0IFcall RtccDeal;*----Popswapf _STATUS,W ; Restore STATUS movwf STATUSswapf _WREG,F ; Restore WREG w/o swapf _WREG,W ; affecting STATUS retfie;*=====TimeAdjbcf PIR1,TMR1IFmovlw 00hmovwf TMR1Lmovlw 80hmovwf TMR1Hincf Secs,1movlw d'60'xorwf Secs,Wbtfss STATUS,Zgoto TEclrf Secsincf Mins,1movlw d'60'xorwf Mins,Wbtfss STATUS,Zgoto TEclrf Minsincf Hourmovlw d'24'xorwf Hour,Wbtfss STATUS,Zgoto TEclrf HourTEreturn;*=====IntDealbcf INTCON,INTFbsf PORTB,0btfsc PORTB,0 ;\goto $+5 ; \call Delaybsf PORTB,0 ; 按键去抖动btfsc PORTB,0goto $+2 ; /incf INTSIGreturn;*=====RtccDealbcf STATUS,RP0movlw 0ffh ;movwf TMR0bcf INTCON,T0IFbsf PORTA,4btfsc PORTA,4 ;\goto RtcWr ; \call Delaybsf PORTA,4 ; 按键去抖动btfsc PORTB,4goto RtcWr ; /movf RTCCSIG,Wsublw 04hbtfss STATUS,Cgoto WRONGmovf RTCCSIG1,Wsublw 03hbtfss STATUS,Cgoto WRONGmovf RTCCSIG,Waddwf RTCCSIG1,Wbtfsc STATUS,Zgoto $+3incf RTCCSIG1goto RtcWrincf RTCCSIGgoto RtcWrWRONGclrf RTCCSIGclrf RTCCSIG1RtcWr return;*=====BkLightbsf STATUS,RP0bcf ADCON1,ADFM ;ADRESH all 8-bit,H bcf STATUS,RP0movlw b'01010001'movwf ADCON0 ;select AD2,Fosc/8 decfsz BKMgoto $-1bsf ADCON0,GObtfss PIR1,ADIFgoto $-1bcf PIR1,ADIF;READ ADRES---movf ADRESH,Wmovwf ADRESBbsf STATUS,RP0bcf TRISE,0 ;SELECT RE0 OUTPUTbcf STATUS,RP0movlw b'10000000' ;critical value of lightness subwf ADRESB,Wbtfss STATUS,Cgoto $+4 ;c=0,ADRESB<criticalbcf STATUS,RP0bsf PORTE,0 ;c=1,backlight ongoto $+3bcf STATUS,RP0bcf PORTE,0movlw 20hmovwf BKMreturn;*=====TempM ;temprature measurebsf STATUS,RP0bcf ADCON1,ADFM ;ADRESH all 8-bitbcf STATUS,RP0movlw b'01001001' ;select AD1,FOSC/8movwf ADCON0decfsz BKMgoto $-1bsf ADCON0,GObtfss PIR1,ADIFgoto $-1bcf PIR1,ADIF;bsf STATUS,RP0movf ADRESH,W;bcf STATUS,RP0movwf Tempcall CalTablemovwf Tempcall Bin2BCDT ; 进行BCD码调整movlw 08ah ; 从第一行的第0A个位置开始call SendCmdmovf TempH,W ; 显示温度call putcLCDmovf TempL,Wcall putcLCDmovlw 'C' ; 显示“C”(表示摄氏度)call putcLCDmovlw 20hmovwf BKMreturn;************************************************ ;* Bin2BCDT - 将 Temp 寄存器内的二进制数转 *;* 换为相应的 ASCII 码并存为 TempH:TempL 的形式 * ;************************************************ Bin2BCDTbcf STATUS,RP0clrf TempH ; Initialize variablesmovf Temp,Wmovwf TempLTtenth ; Subtract 10 from low variablemovlw .10 ; until result is < 0. On eachsubwf TempL,W ; subtraction, increment thebtfss STATUS,C ; temperature high byte.goto Over0movwf TempLincf TempH,Fgoto TtenthOver0movlw 0x30 ; Make decimal ASCII by addingaddwf TempH,F ; '0' to high and low byteaddwf TempL,Freturn;************************************************* ;* DisplayTime - 将显示指针移至第一行,调用Bin2BCD* ;* 子程序将Secs 和 Mins寄存器内的数据转换为相应的* ;* ASCII 码, 然后送 LCD显示. *;************************************************* DisplayTimebcf STATUS,RP0call Bin2BCD ; 调用二进制与bcd码转换子程序movf HourH,W ; 显示小时高位call putcLCD ;movf HourL,W ; 显示小时低位call putcLCD ;movlw ':'call putcLCD ; 显示 ':'movf MinsH,W ; 显示分钟高位call putcLCD ;movf MinsL,W ; 显示分钟低位call putcLCD ;movlw ':' ; 显示 ':'call putcLCDmovf SecsH,W ; 显示秒钟高位call putcLCD ;movf SecsL,W ; 显示秒钟低位call putcLCD ;return;************************************************ ;* Bin2BCD - 将 Secs & Mins 寄存器内的二进制数转* ;* 换为相应的 ASCII 码并存为 SecsH:SecsL 及 *;* MinsH:MinsL,HourH:HourL的形式. *;************************************************ Bin2BCDbcf STATUS,RP0clrf HourH ; 初始化变量movf Hour,W ; 转换“时”movwf HourLHourth ; Loop to subtract 10movlw .10 ; from low byte andsubwf HourL,W ; increment high bytebtfss STATUS,C ; while low byte is > 0goto Nextmovwf HourLincf HourH,Fgoto HourthNextclrf MinsH ; 初始化变量movf Mins,W ; 转换“分”movwf MinsLMtenth ; Loop to subtract 10movlw .10 ; from low byte andsubwf MinsL,W ; increment high bytebtfss STATUS,C ; while low byte is > 0goto Next1movwf MinsLincf MinsH,Fgoto MtenthNext1clrf SecsH ; 初始化变量movf Secs,W ; 转换“秒”movwf SecsLStenth ; Loop to subtract 10movlw .10 ; from low byte andsubwf SecsL,W ; increment high bytebtfss STATUS,C ; while low byte is > 0goto Overmovwf SecsLincf SecsH,Fgoto StenthOvermovlw 0x30 ;addwf HourH,F ;addwf HourL,F ; Add 0x30 ('0') to all addwf MinsH,F ; variables to convertaddwf MinsL,F ; a number 0 - 9 to anaddwf SecsH,F ; ASCII equivalentaddwf SecsL,F ; '0' to '9'return;*====DispTimebcf STATUS,RP0movlw 0c7hcall SendCmdcall Bin2BCa ; 调用二进制与bcd码转换子程序movf HourH1,W ; 显示小时高位call putcLCD ;movf HourL1,W ; 显示小时低位call putcLCD ;movlw ':' ; 显示 ':'call putcLCDmovf MinsH1,W ; 显示分钟高位call putcLCD ;movf MinsL1,W ; 显示分钟低位call putcLCD ;return;*----Bin2BCabcf STATUS,RP0clrf HourH1 ; 初始化变量movf Hour1,W ; 转换“时”movwf HourL1Hourth1 ; Loop to subtract 10movlw .10 ; from low byte andsubwf HourL1,W ; increment high bytebtfss STATUS,C ; while low byte is > 0 goto Nextamovwf HourL1incf HourH1,Fgoto Hourth1Nextaclrf MinsH1 ; 初始化变量movf Mins1,W ; 转换“分”movwf MinsL1Mtenth1 ; Loop to subtract 10movlw .10 ; from low byte andsubwf MinsL1,W ; increment high bytebtfss STATUS,C ; while low byte is > 0goto Over1movwf MinsL1incf MinsH1,Fgoto Mtenth1Over1movlw 0x30 ;addwf HourH1,F ;addwf HourL1,F ; Add 0x30 ('0') to alladdwf MinsH1,F ; variables to convertaddwf MinsL1,F ; a number 0 - 9 to anreturn ; ASCII equivalent;******************************************************************* ;* LCD 模块子程序 *;******************************************************************* ;InitLCD——初始化LCD模块 *;******************************************************************* InitLCDbcf STATUS,RP0 ; Bank 0bcf STATUS,RP1clrf LCD_DATA ; 清 LCD 数据 & 控制位bsf STATUS,RP0 ; Bank 1movlw 0xc1 ; 设置RB1~RB5为输出movwf LCD_DATAbcf TRISA,5bcf STATUS,RP0 ;movlw 0x00 ;movwf LCD_DATAbsf LCD_CNTL2, Ebcf LCD_CNTL2, Emovlw 0x08 ;movwf LCD_DATAbsf LCD_CNTL2, Ebcf LCD_CNTL2, Ecall LongDelaycall LongDelaymovlw b'00101000'call SendCmdmovlw DISP_ON ; 开显示call SendCmdmovlw ENTRY_INC ; 设置指针移动方式call SendCmdmovlw DD_RAM_ADDR ; 设置起始地址call SendCmdInitLCDEnd ;bcf STATUS,RP0 ;movlw CLR_DISP ;call SendCmdreturn;******************************************************************* ;*putcLCD——将字符数据送入 LCD *;* 本程序将字符数据分成了高半字节和低半字节分别输入 *;* 先送入的是高半字节 *;******************************************************************* putcLCDbcf STATUS,RP0movwf Byte ; 存 WREG 到 Byte 寄存器swapf Byte,W ; 写入高半字节movwf LCD_DATA1rlf LCD_DATA1,1rlf LCD_DATA1,1movlw 0x3candwf LCD_DATA1,1movf LCD_DATA1,wmovwf LCD_DATAbsf LCD_CNTL1, RS ; 设置为送数据模式bsf LCD_CNTL2, E ; 发送数据信号bcf LCD_CNTL2, Emovf Byte,W ; 接着送低半字节movwf LCD_DATA1rlf LCD_DATA1,1rlf LCD_DATA1,1movlw 0x3candwf LCD_DATA1,1movf LCD_DATA1,wmovwf LCD_DATAbsf LCD_CNTL1, RS ; 设置为送数据模式bsf LCD_CNTL2, E ; 发送数据信号bcf LCD_CNTL2, Ecall Delayreturn;******************************************************************* ;* SendCmd - 送命令到 LCD *;* 本程序将命令数据分成了高半字节和低半字节分别输入 *;* 先送入的是高半字节 *;******************************************************************* SendCmdbcf STATUS,RP0movwf Byte ; 存 WREG 到 Byte 寄存器swapf Byte,W ; 送入命令的高字节movwf LCD_DATA1rlf LCD_DATA1,1rlf LCD_DATA1,1movlw 0x3candwf LCD_DATA1,1movf LCD_DATA1,wmovwf LCD_DATAbcf LCD_CNTL1,RS ; 设置为送命令模式bsf LCD_CNTL2,E ; 发送数据信号bcf LCD_CNTL2,Emovf Byte,W ; 接着送命令的低字节movwf LCD_DATA1rlf LCD_DATA1,1rlf LCD_DATA1,1movlw 0x3candwf LCD_DATA1,1movf LCD_DATA1,wmovwf LCD_DATAbcf LCD_CNTL1,RS ; 设置为送命令模式bsf LCD_CNTL2,E ; 发送数据信号bcf LCD_CNTL2,Ecall Delayreturn;******************************************************************* ;* Delay - 延时子程序 *;******************************************************************* Delay ; call指令占用2个指令周期bcf STATUS,RP0clrf Count ; 清 Count占用1个指令周期Dloopdecfsz Count,f ; 这两行指令将延时goto Dloop ; (256 * 3) -1 个指令周期return ; return占用2个指令周期;******************************************************************* ;* LongDelay - 长延时子程序 *;******************************************************************* LongDelaybcf STATUS,RP0clrf Countclrf Count1movlw 0x03movwf Count2LDloopdecfsz Count,fgoto LDloopdecfsz Count1,fgoto LDloopdecfsz Count2,fgoto LDloopreturn;*------END。
PIC单片机C语言教程

PIC单片机C语言教程PIC单片机(Peripheral Interface Controller)是德州仪器(Texas Instruments)公司生产的一款微控制器芯片。
它具有高性能、低功耗、易编程等特点,因此被广泛应用于各种电子设备中。
PIC单片机的编程语言主要是C语言。
C语言是一种广泛使用的高级程序设计语言,它结构简洁、表达能力强、可移植性好。
通过使用C语言,我们可以轻松地编写控制PIC单片机的程序,并且可以充分发挥PIC单片机的特性和功能。
在PIC单片机的C语言教程中,首先需要了解C语言的基础知识,包括变量、数据类型、运算符、控制语句等。
接下来,我们需要学习如何使用C语言编写PIC单片机的程序。
1.引脚配置:在PIC单片机的程序中,我们需要配置引脚的状态,包括输入输出模式、电平状态等。
通过使用C语言,我们可以方便地配置引脚,实现与外部器件的连接和通信。
2.中断编程:中断是PIC单片机的重要特性之一,可以使控制器在特定条件下停止当前任务执行,转而执行中断服务程序。
通过使用C语言,我们可以编写中断服务程序,实现特定条件下的任务切换和响应。
3.定时器编程:定时器是PIC单片机的另一个重要功能,可以实现一定时间间隔内的定时操作。
通过使用C语言,我们可以编程设置定时器的参数,以实现特定的定时操作。
4.串口通信:PIC单片机具有串口通信功能,可以与其他设备进行数据交换。
通过使用C语言,我们可以编写串口通信的程序,实现与其他设备的数据传输和交互。
5.外设控制:PIC单片机可以连接各种外设,如LCD显示屏、键盘、驱动器等。
通过使用C语言,我们可以编写控制程序,实现与外设的连接和控制。
以上只是PIC单片机C语言教程的一部分内容。
除了上述内容,我们还可以学习其他更高级的主题,如编码技巧、优化技术等。
通过系统学习和实践,我们可以掌握PIC单片机的C语言编程技巧,实现各种功能和应用。
总的来说,PIC单片机的C语言教程是一个庞大而丰富的话题,需要通过实践和深入学习来掌握。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//对液晶显示器写数据子程序(数据保存在WRITE寄存器中)
voidWRITE1()
{
TRANS=CLMADD;//设置列地址
TRANS1();
LCDSTA1();//查询液晶是否为空闲
TRISD=0X00;//D口为输出
RB0=1;//E1=1
RA3=0;//E2=0
RE0=0;//R/W=0
RE1=1;//A0=1
DISP1();//开显示
}
15.4 程序清单
下面给出一个已经在模板上调试通过的程序。注意在调试该程序时,需把模板上的J9跳针短接。
#include<pic.h>
//该程序用于液晶显示功能的演示
//运行程序后,液晶上显示"电流有效值"和"电压有效值"字样
//系统总的初始化子程序
unsignedcharTRANS;
TRANS=PAGEADD;
TRANS1();
CLMADD=0x00;//设置起始列
for(CLMSUM=0X50;CLMSUM>0;CLMSUM--){
LCDSTA1();//判断液晶是否为空闲
WRITE=0X00;
WRITE1();//写入00H以清屏
}
PAGEADD++;//页号增1
}}Biblioteka //关E1显示子程序unsignedchari,k;//通用寄存器
//系统各口的输入输出状态初始化子程序
voidINITIAL()
{
ADCON1=0X87;//设置PORTA口和PORTE口为数字I/O口
TRISA3=0;
TRISB0=0;
TRISE=0X00;//设置液晶的4个控制脚为输出
}
//读液晶显示器状态子程序
TRISD=0XFF;//设置D口为输入
RB0=1;//E1=1
RA3=0;//E2=0
RE0=1;//R/W=1
RE1=0;//A0=0
if(RD5==0)break;//如果液晶没被关闭,则继续关
}
}
//E1边清屏子程序
voidCLEAR1()
{
PAGEADD=0xB8;//设置页地址代码
for(PAGENUM=0X04;PAGENUM>0;PAGENUM--){
unsignedchari,k;//通用寄存器
const char table[192]={0X00,0XF8,0X48,0X48,0X48,0X48,0XFF,0X48,
0X48,0X48,0X48,0XFC,0X08,0X00,0X00,0X00,
0X00,0X07,0X02,0X02,0X02,0X02,0X3F,0X42,
TRANS1();//发出控制命令
TRANS=0XA9;//占空比为1/32
TRANS1();//发出控制命令
TRANS=0XE2;//复位
TRANS1();//发出控制命令
TRANS=0XA0;//ADC选择正常输出
TRANS1();//发出控制命令
CLEAR1();//清屏
LCDSTA1();//判断液晶是否为空闲
voidTRANS1()
{
LCDSTA1();//判断液晶是否为忙
TRISD=0X00;//置D口为输出
RB0=1;//E1=1
RA3=0;//E2=0
RE0=0;//R/W=0
RE1=0;//A0=0
PORTD=TRANS;//需要写入的命令字送入数据线
RB0=0;//E1=0写入指令
RE0=1;//R/W=1
PORTD=WRITE;//需要写入的数据放入D口
RB0=0;//E1=0,写入数据
CLMADD++;//列地址加1
RE0=1;//R/W=1
}
//开E1显示子程序
voidDISP1()
{
while(1)
{
TRANS=0XAF;
TRANS1();//送出控制命令
LCDSTA1();//判断液晶是否为空闲
第15章 液晶显示模块编程
15.2.2MG-12232模块的编程
下面以图15.1的接口电路为例。液晶显示区域分成E1边和E2边,下面只含E1边的程序(表15.1中E1=1,E2=0),E2边(表15.1中E1=0,E2=1)类推。
在系统程序的初始化部分,应对程序中用到的寄存器和临时变量作说明,如:
unsignedcharTRANS;
voidDISOFF1()
{
while(1)
{
TRANS=0XAE;
TRANS1();//发出控制命令
LCDSTA1();//判断液晶是否为空闲
TRISD=0XFF;//D口设置为输入
RB0=1;//E1=1
RA3=0;//E2=0
RE0=1;//R/W=1
RE1=0;//A0=0
if(RD5==1)break;//如果液晶没被关闭,则继续关
0X42,0X42,0X42,0X47,0X40,0X70,0X00,0X00,//"电"
0X00,0X00,0XFE,0X02,0X82,0X82,0X82,0X82,
unsignedcharPAGEADD;//存放页地址寄存器
unsignedcharPAGENUM;//存放总页数寄存器
unsignedcharCLMSUM;//存放总列数寄存器
unsignedcharCLMADD;//存放列地址寄存器
unsignedcharWRITE;//存放显示数据寄存器
unsignedcharrow;//存放显示起始行寄存器
unsignedcharPAGEADD;//存放页地址寄存器
unsignedcharPAGENUM;//存放总页数寄存器
unsignedcharCLMSUM;//存放总列数寄存器
unsignedcharCLMADD;//存放列地址寄存器
unsignedcharWRITE;//存放显示数据寄存器
unsignedcharrow;//存放显示起始行寄存器
voidLCDSTA1()
{
while(1) {
TRISD=0XFF;//设置D口为输入
RB0=1;//E1=1
RA3=0;//E2=0
RE0=1;//R/W=1
RE1=0;//A0=0
if(RD7==0)break;//为忙状态,则继续等待其为空闲
}
}
//对液晶显示器发指令子程序(指令保存在TRANS寄存器中)
}
}
有了以上的通用子程序,就可以构造出各种显示程序,如字符、汉字、曲线等。执行这些程序前,必须对液晶进行初始化。初始化的顺序为:关显示→正常显示驱动设置→占空比设置→复位→ADC选择→清屏→开显示,程序如下:
//E1边初始化
voidlcd1()
{
DISOFF1();//关显示E1
TRANS=0XA4;//静态显示驱动