PIC单片机液晶显示模块编程
- 格式:doc
- 大小:146.00 KB
- 文档页数:13
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为页设置指令。
;*************************************************;* 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液晶显示屏实物图图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单片机是一种常用的嵌入式系统开发平台,其具有低功耗、成本低廉、易于编程等优点,在工业自动化、电子设备控制等领域有着广泛应用。
本文将为读者提供一份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是一款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显示时钟演示程序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单片机(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语言教程是一个庞大而丰富的话题,需要通过实践和深入学习来掌握。
PIC单片机的C语言编程简介PIC(Peripheral Interface Controller)是一种广泛使用的单片机系列,由美国微芯科技公司(Microchip Technology Inc.)开发和生产。
其特点是体积小、功耗低、功能强大,并且具有高性价比,因此在嵌入式系统领域得到了广泛的应用。
在PIC单片机的编程中,C语言是最常用的编程语言之一。
本文将介绍如何在PIC单片机上使用C语言进行编程。
准备工作在开始C语言编程之前,我们需要准备以下工具和设备:1.PIC单片机开发板:选择一款适合你的需求的PIC单片机开发板,例如PIC16F877A。
2.编程软件:Microchip公司的MPLAB IDE是最常用的PIC单片机编程软件之一,可以在官方网站上免费下载安装。
3.编程语言:C语言是PIC单片机常用的编程语言,具有丰富的库函数和易于学习的语法。
第一个C程序编写第一个C程序是入门PIC单片机编程的第一步。
以下是一个简单的LED闪烁程序示例:#include <xc.h>// 包含使用于PIC单片机的头文件#define _XTAL_FREQ 4000000 // 定义晶振频率为4MHz// 主函数void main(void){TRISB = 0b00000000; // 将PORTB所有引脚设为输出PORTB = 0b00000001; // 将RB0引脚输出高电平while(1){PORTBbits.RB0 = 1; // RB0引脚输出高电平__delay_ms(1000); // 延时1秒PORTBbits.RB0 = 0; // RB0引脚输出低电平__delay_ms(1000); // 延时1秒}}在这个程序中,我们使用了xc.h头文件来包含适用于PIC单片机的库函数和宏定义。
使用#define指令定义了晶振频率为4MHz,可以根据自己的实际情况进行修改。
在main函数中,通过TRISB寄存器将PORTB所有引脚设置为输出模式,并使用PORTB寄存器将RB0引脚输出高电平。