PIC单片机液晶显示模块编程

合集下载

pic单片机LCD显示控制

pic单片机LCD显示控制

LIST ‎P=16F‎877I‎N CLUD‎E"P16‎F877.‎I NC"‎ W_ ‎ EQU‎70H‎S TATU‎S_ EQ‎U 71H‎PC‎L ATH_‎EQU ‎72H‎T MR0B‎EQU ‎.5E ‎ E‎Q U 0‎0HRW‎ E‎Q U 0‎1HRS‎ E‎Q U 0‎2HCS‎2 E‎Q U 0‎3HCS‎1 E‎Q U 0‎4HBZ‎W E‎Q U 2B‎H;标志位‎LCD_‎D ATA ‎ EQU‎20H;‎l cd数据‎缓存器X‎Y‎ EQU‎21H;‎选择页缓冲‎器R0 ‎ E‎Q U 2‎2H;缓存‎器R1 ‎ E‎Q U 2‎3H;缓存‎器XP ‎ E‎Q U 2‎4H;选屏‎寄存器X‎L‎EQU ‎25H;‎选择显示列‎缓存器X‎H‎EQU ‎26H;‎选择行缓存‎器RA ‎ E‎Q U 2‎7H;查表‎指针SZ‎J‎E QU ‎28H;显‎示数据上半‎页XZJ‎ E‎Q U 2‎9H;显示‎数据下半页‎CBYM‎ EQ‎U 2A‎H;查表页‎面选择T‎0R0 ‎EQU ‎2BH‎T1R1 ‎ EQU‎ 2CH‎R4 ‎ EQ‎U 2D‎HR5 ‎ E‎Q U 2‎E HSH‎I‎ EQ‎U 2F‎HQIA‎N WEI ‎ EQU‎ 30H‎FEN ‎‎EQU ‎31H‎B AIWE‎I‎E QU ‎32HM‎I AO ‎ E‎Q U 3‎3HSH‎I WEI ‎ EQ‎U 34‎HHAO‎M‎ EQU‎ 35H‎GEWE‎I‎EQU ‎36H‎C RCH ‎‎E QU ‎37HC‎R CL ‎ E‎Q U 3‎8H‎R3 ‎E QU 3‎9H;变量‎寄存器‎R10 E‎Q U 3A‎H;BCD‎码高8位,‎16位除数‎高8位‎R11 E‎Q U 3B‎H;BCD‎码中8位,‎16位除数‎低8位‎R12 E‎Q U 3C‎H;BCD‎码低8位,‎16位被除‎数高8位‎R13 ‎E QU 3‎D H;二进‎制转BCD‎中间寄存器‎,16位被‎除数低8位‎ R14‎EQU ‎3EH;二‎进制高8位‎,16位商‎高8位‎R15 E‎Q U 3F‎H;二进制‎低8位,1‎6位商低8‎位R1‎6 EQU‎40H;‎余数高8位‎R17‎EQU ‎41H;余‎数低8位‎R18 ‎E QU 4‎2H;中间‎缓存高8位‎R19‎EQU ‎43H;中‎间缓存低8‎位R2‎0 EQU‎44H;‎A DC结果‎缓存器‎J L ‎ EQU‎45H;‎16位减数‎低字节‎J H ‎ EQU‎46H;‎16位减数‎高字节‎B JL ‎ EQU‎47H;‎16位被减‎数低字节‎BJH ‎ EQ‎U 48H‎;16位被‎减数高字节‎CAL‎ E‎Q U 49‎H;16位‎差低字节‎CAH ‎ EQ‎U 4AH‎;16位差‎高字节‎B TLJS‎ EQU‎4BH;‎数据接收结‎束时间‎R2 ‎ EQU‎4CH;‎变量寄存器‎R6 ‎ E‎Q U 7F‎H;变量寄‎存器R‎7‎EQU ‎7EH;‎R8 ‎ EQ‎U 7DH‎R9 ‎ E‎Q U 7C‎HTXS‎J‎E QU 4‎D H;数‎据接收缓存‎区为A0到‎B F;数‎据发送缓冲‎器为C0到‎E F;读‎取的数据区‎为190开‎始的寄存器‎ORG ‎0000H‎‎N OP‎ GO‎T O SA‎T RT‎ ORG‎0004‎H‎M OVWF‎W_‎ SWA‎P F ST‎A TUS,‎W‎MOVW‎F STA‎T US_‎ MO‎V F PC‎L ATH,‎W‎MOVW‎F PCL‎A TH_;‎入栈保护‎ BC‎F INT‎C ON,G‎I E;关闭‎总中断‎ BCF‎STAT‎U S,RP‎0‎B‎C F IN‎T CON,‎T0IF‎ IN‎C F R4‎,1‎MOVF‎R4,W‎‎SUBL‎W .1‎ BT‎F SS S‎T ATUS‎,Z‎GOTO‎FANH‎C‎L RF R‎4‎I NCF ‎H AOM,‎1‎M OVF ‎H AOM,‎W;TR0‎时间继电器‎数据‎SUBL‎W .10‎B‎T FSS ‎S TATU‎S,Z‎ GOT‎O FAN‎H‎C LRF ‎H AOM‎S J1S ‎INCF‎MIAO‎,1‎MOVF‎MIAO‎,W‎SUBL‎W .10‎B‎T FSS ‎S TATU‎S,Z‎ GOT‎O FAN‎H‎C LRF ‎M IAO‎ IN‎C F FE‎N,1‎ MOV‎F FEN‎,W;TR‎1时间继电‎器数据‎ SUB‎L W .1‎0‎B TFSS‎STAT‎U S,Z‎ GO‎T O FA‎N H‎CLRF‎FEN‎ IN‎C F SH‎I‎M OVF ‎S HI,W‎;TR1时‎间继电器数‎据‎S UBLW‎.10‎ BT‎F SS S‎T ATUS‎,Z‎GOTO‎FANH‎C‎L RF S‎H I‎FAN‎H‎‎ M‎O VLW ‎T MR0B‎‎MOVW‎F TMR‎0FAN‎H0 BS‎F INT‎C ON,G‎I E‎ MOV‎F PCL‎A TH_,‎W‎MOVW‎F PCL‎A TH‎ SW‎A PF S‎T ATUS‎_,W‎ MO‎V WF S‎T ATUS‎‎S WAPF‎W_,F‎‎S WAPF‎W_,W‎‎R ETFI‎E‎SAT‎R T‎‎ BS‎F STA‎T US,R‎P0‎ M‎O VLW ‎07H‎‎MOVW‎F 0C3‎H‎ MOV‎W F OP‎T ION_‎R EG‎‎CLRF‎TRIS‎B;B端口‎输出‎‎MOVL‎W B'1‎00000‎00'‎‎MOVW‎F TRI‎S C;C端‎口输出‎‎MOVL‎W 0H‎‎ MOV‎W F TR‎I SD;D‎端口输出‎‎ MOV‎L W 19‎H‎ M‎O VWF ‎S PBRG‎‎ MO‎V LW B‎'0010‎0100'‎‎ MO‎V WF T‎X STA‎‎‎ ;‎B SF P‎I E1,5‎;使能SC‎I串行接收‎中断‎‎B CF S‎T ATUS‎,RP0;‎选择数据体‎0‎ MOV‎L W B'‎10100‎000'‎ ;‎MOVW‎F INT‎C ON‎ M‎O VLW ‎B'100‎10000‎'‎ MOV‎W F RC‎S TA‎ M‎O VLW ‎T MR0B‎‎MOVW‎F TMR‎0‎ C‎L RF P‎O RTD‎‎ CLR‎F RA‎‎ MOV‎L W 0F‎F H‎‎M OVWF‎R5‎‎CALL‎YANS‎H I‎‎C ALL ‎Y ANSH‎I‎ C‎A LL Y‎A NSHI‎‎ CA‎L L YA‎N SHI‎‎ CAL‎L YAN‎S HI‎‎DECF‎S Z R5‎‎ GO‎T O $-‎6‎ C‎A LL M‎O DBUS‎‎ GO‎T O $‎‎‎;‎延时子程序‎Y‎A NSHI‎‎‎MOVL‎W 0FF‎H‎‎ MOV‎W F R1‎6G1 ‎‎ DEC‎F SZ R‎16 ‎‎‎GOTO‎G1‎‎ R‎E TURN‎‎;忙判断‎子程序M‎A NGPD‎BCF ‎S TATU‎S,RP0‎;选择数据‎体0 ;忙‎判断‎‎B CF P‎O RTC,‎R S‎‎B SF P‎O RTC,‎R W‎‎B SF P‎O RTC,‎E‎ B‎S F ST‎A TUS,‎R P0‎‎MOVL‎W 0FF‎H‎ M‎O VWF ‎T RISB‎;把B端‎口设置为输‎入‎ B‎C F ST‎A TUS,‎R P0‎‎A1‎ BT‎F SS P‎O RTB,‎7‎ G‎O TO A‎1‎ B‎C F PO‎R TC,E‎‎ BS‎F STA‎T US,R‎P0‎‎C LRF ‎T RISB‎‎ BC‎F STA‎T US,R‎P0 ‎‎D E4 ‎ RET‎U RN‎;写命令子‎程序XM‎L‎‎CALL‎MANG‎P D;调用‎忙判断子程‎序‎ B‎C F PO‎R TC,R‎S‎ B‎C F PO‎R TC,R‎W‎ M‎O VF L‎C D_DA‎T A,W‎‎ MOV‎W F PO‎R TB‎‎BSF ‎P ORTC‎,E‎‎N OP‎‎NOP‎‎ BCF‎PORT‎C,E‎‎RETU‎R N‎;写数据‎子程序X‎S J‎‎ CAL‎L MAN‎G PD‎‎BSF ‎P ORTC‎,RS‎‎BCF ‎P ORTC‎,RW‎‎MOVF‎LCD_‎D ATA,‎W‎ M‎O VWF ‎P ORTB‎‎ BS‎F POR‎T C,E‎‎ NOP‎‎ NO‎P‎ B‎C F PO‎R TC,E‎‎ RE‎T URN‎;设置显‎示的页子程‎序SZY‎ M‎O VLW ‎0B8H;‎B8为页设‎置指令。

pic单片机KS0066U控制器的液晶LCD面板的控制程序

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液晶显示屏电气原理图单片机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单片机的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编程实例为主题,介绍其基本特性和常见应用。

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显示时钟演示程序

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单片机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单片机的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引脚输出高电平。

手把手教你学PIC单片机C语言设计(十)驱动128×64点阵图形液晶模块的实验

手把手教你学PIC单片机C语言设计(十)驱动128×64点阵图形液晶模块的实验
手把 手教你学 P C单 片机 c语言设 计( ) I 十
驱动 1 X6 2 4点阵图形液 晶模块 的实验 8
周 兴 华
点 阵 图 形 液 晶模 块 是 一 种 用于 显 示 1 x 6点 而 言 , 行 可 显 示 8个 中文 字 , HD 1 0 6l 每 6 2 2驱 动 , 第 一 颗 芯 片 U 2驱 动
2 18 6 . 2 x 4点 阵图 形液 晶模块
的每位数据 与 L CD每 点 的 像 素 状 态 1O 引脚 及 功 能 / 产 品 T 9 3 ; 日立 公 司 产 品 HD 1 3 完 全 一 致 ( =亮 ,= 灭 ) 66C 68 0 1 O 。 1脚 ( s )接 地 。 2脚 ( d ) 电 源 Vs : V d:
6 22 1 49 的 控 制 芯 片 生 产 厂 商 较 多 , 以 下 为 典 型 个 HD 1 0 , 每 个 有 5 2 字 节 (0 6 来 共 有 1 2 B t 存 器 。 4 ye寄 0
的几种。
位 ) R M 显 示 。 AM 显 示 存 储 器 单 元 供 A R
H 6 2 2 和 HD 1 0 芯 片 组 成 。 行 驱 动 : 列 驱 动 : 1 Y 2 ( 或 位 。 D 10 6 23 Y ~ 18 8脚 ( B1 : 向数 据 总线 的第 1 。 D )双 位 186 2 x 4点 阵 图 形液 晶 模 块 , 示横 向有 S G1 S G2 表 E ~ E I8)为列 位 址 ,由 两 颗 芯 片 9脚 ( 2)双 向 数 据 总 线 的 第 2位 。 1 DB : 1 1 8 点 , 纵 向 有 6 点 , 如 果 以 汉 字 2 4 脚 ( 3)双 向数 据 总 线 的第 3位 。 1脚 DB : 1 ( 4) DB :双 向数 据 总 线 的 第 4位 。 1 2脚

PIC单片机C语言编程实例——液晶显示模块编程

PIC单片机C语言编程实例——液晶显示模块编程

PIC单片机C语言编程实例——液晶显示模块编程15.2.2 MG-12232模块的编程下面以图15.1的接口电路为例。

液晶显示区域分成E1边和E2边,下面只含E1边的程序(表15.1中E1=1,E2=0),E2边(表15.1中E1=0,E2=1)类推。

在系统程序的初始化部分,应对程序中用到的寄存器和临时变量作说明,如:unsigned char TRANS;unsigned char PAGEADD; //存放页地址寄存器unsigned char PAGENUM; //存放总页数寄存器unsigned char CLMSUM; //存放总列数寄存器unsigned char CLMADD; //存放列地址寄存器unsigned char WRITE; //存放显示数据寄存器unsigned char row; //存放显示起始行寄存器unsigned char i,k; //通用寄存器//系统各口的输入输出状态初始化子程序void INITIAL(){ADCON1=0X87; //设置PORTA口和PORTE口为数字I/O口TRISA3=0;TRISB0=0;TRISE=0X00; //设置液晶的4个控制脚为输出}//读液晶显示器状态子程序void LCDSTA1(){while(1){TRISD=0XFF; //设置D口为输入RB0=1; //E1=1RA3=0; //E2=0RE0=1; //R/W=1RE1=0; //A0=0if(RD7==0) break; //为忙状态,则继续等待其为空闲}}//对液晶显示器发指令子程序(指令保存在TRANS寄存器中)void TRANS1(){LCDSTA1(); //判断液晶是否为忙TRISD=0X00; //置D口为输出RB0=1; //E1=1RA3=0; //E2=0RE0=0; //R/W=0RE1=0; //A0=0PORTD=TRANS; //需要写入的命令字送入数据线RB0=0; //E1=0写入指令RE0=1; //R/W=1}//对液晶显示器写数据子程序(数据保存在WRITE寄存器中) void WRITE1(){TRANS=CLMADD; //设置列地址TRANS1();LCDSTA1(); //查询液晶是否为空闲TRISD=0X00; //D口为输出RB0=1;//E1=1RA3=0;//E2=0RE0=0;//R/W=0RE1=1;//A0=1PORTD=WRITE; //需要写入的数据放入D口RB0=0; //E1=0,写入数据CLMADD++; //列地址加1RE0=1; //R/W=1}//开E1显示子程序void DISP1(){while(1){TRANS=0XAF;TRANS1(); //送出控制命令LCDSTA1(); //判断液晶是否为空闲TRISD=0XFF; //设置D口为输入RB0=1; //E1=1RA3=0; //E2=0RE0=1; //R/W=1RE1=0; //A0=0if(RD5==0) break; //如果液晶没被关闭,则继续关}}//E1边清屏子程序void CLEAR1(){PAGEADD=0xB8; //设置页地址代码for(PAGENUM=0X04;PAGENUM>0;PAGENUM-){TRANS=PAGEADD;TRANS1();CLMADD=0x00; //设置起始列for(CLMSUM=0X50;CLMSUM>0;CLMSUM-){LCDSTA1(); //判断液晶是否为空闲WRITE=0X00;WRITE1(); //写入00H以清屏}PAGEADD++; //页号增1}}//关 E1显示子程序void DISOFF1(){while(1){TRANS=0XAE;TRANS1(); //发出控制命令LCDSTA1(); //判断液晶是否为空闲TRISD=0XFF; //D口设置为输入RB0=1; //E1=1RA3=0; //E2=0RE0=1; //R/W=1RE1=0; //A0=0if(RD5==1) break; //如果液晶没被关闭,则继续关}}有了以上的通用子程序,就可以构造出各种显示程序,如字符。

基于PIC18F458单片机的LCD显示

基于PIC18F458单片机的LCD显示

基于PIC18F458单片机的LCD显示本文介绍一种新型的电网质量检测系统中显示测量结果的液晶显示系统,它主要由PIC18F458 和液晶显示模块MGLS12864 组成。

PIC18F458 单片机是美国微芯公司推出的16 位RISC 指令集的高级产品,与LCD 接口方便。

液晶显示器MGLS12864 是基于两片HD61202 和一片HD61203 所构成的128 乘以64 点阵液晶显示器;只要提供电源就能产生点阵驱动信号和各种同步信号。

其中HD61202 是一种点阵图形式液晶显示驱动器,它可以直接与16 位微处理器相连,与HD61203 配合对LCD 进行行、列驱动。

1PIC18F1458 的性能特点PIC18F458 单片机是一种高性能的RISC CPU。

该款单片机不仅集成了强大的外围功能模块,而且因其特殊的单片机特性(如:自振式看门狗、可编程代码保护功能、休眠省电方式等)及先进的FLASH 技术(低功耗、高增强型FLASH 技术,全静态设计,2.0~5.5V 宽范围的工作电压,工业级和扩展级温度范围),可以适用各种工业控制场合。

1.1 高性能的RISC CPU具有高达2MB 的程序存储器;高达4KB 的数据存储器;高达10MIPS 的执行速度;DC~40MHz 时钟输入;4~10MHz 带PLL 锁相环有源晶振/时钟输入;16 位宽指令,8 位宽数据通道;带优先级的中断;8 乘以8 单周期硬件乘法器。

1.2 外围功能模块具有PORTAPORTE 五组I/O 端口;定时器/计数器TMR0-TMR3 模块;捕捉/比较/PWM(CCP)模块;增强型捕捉/比较/PWM(ECCP)模块;主同步串型端口;可寻址的通用同步/异步收发器;CAN 控制模块;10 位A/D 转换器模块;比较。

PIC单片机应用开发典型模块程序

PIC单片机应用开发典型模块程序

(1)16×16位定点数加、减法程序LIST p=16f877INCLUDE p16f877.incACCALO EQU 20 ;存放加数或减数低8位ACCAHI EQU 21 ;存放加数或减数高8位ACCBLO EQU 23 ;存放被加数或被减数低8位ACCBHI EQU 24 ;存放被加数或被减数高8位ORG 0X0000START GOTO MAIN;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***D_sub CALL NEG_A ;求ACCA的补码;双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCBD_add MOVF ACCALO,0 ;ACCB和ACCA低半字节相加ADDWF ACCBLOBTFSC STATUS, C ;有进位否?INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHIMOVF ACCAHI,0 ;ACCA、ACCB高半字节相加ADDWF ACCBHIRETURN ;子程序返回;ACCA取补子程序NEG_A COMF ACCALO ;ACCALO取反加1INCF ACCALOBTFSC STATUS,Z ;低8位有进位吗?DECF ACCAHI ;有,ACCAHI减1,再取反COMF ACCAHI ;否则ACCAHI直接取反RETURN ;子程序返回(2)16×16位定点数乘法程序LIST p=16f877INCLUDE p16f877.incACCALO EQU 20 ;存放乘数低8位ACCAHI EQU 21 ;存放乘数高8位ACCBLO EQU 23 ;存放被乘数低8位和乘积第16~23位ACCBHI EQU 24 ;存放被乘数高8位和乘积第24~31位ACCCLO EQU 26 ;存放乘积低8位ACCCHI EQU 27 ;存放乘积高8位ACCDLO EQU 28 ;临时寄存器ACCDHI EQU 29 ;临时寄存器TEMP EQU 2A ;临时寄存器SIGN EQU 2B ;存放乘积的符号ORG 0X0000START GOTO MAINORG 0X0100D_mpy CALL S_SIGN ;求取乘积的符号,并对负数取补CALL SETUP ;调用子程序,将ACCB的值送ACCDINCF TEMPCLRF ACCCHI ;清ACCCCLRF ACCCLOMLOOP BCF STATUS,C ;清进位位RRF ACCDHI ;ACCD右移RRF ACCDLOBTFSC STATUS,C ;判断是否需要相加CALL D_add ;加乘数至ACCB,见加法程序BCF STATUS,C ;清进位位RRF ACCBHI ;右移部分乘积RRF ACCBLORRF ACCCHIRRF ACCCLODECFSZ TEMP ;乘法完成否?GOTO MLOOP ;否,继续求乘积BTFSS SIGN,7 ;是,确定乘积的符号GOTO OVER ;为正,乘法结束COMF ACCCLO ;为负,乘积取补INCF ACCCLOBTFSC STATUS,ZDECF ACCCHICOMF ACCCHIBTFSC STATUS,ZNEG_B DECF ACCBLOCOMF ACCBLOBTFSC STATUS,ZDECF ACCBHICOMF ACCBHIOVER RETURN ;子程序返回SETUP MOVLW 15 ;初始化TEMP寄存器MOVWF TEMPMOVF ACCBHI,0 ;ACCB送ACCDMOVWF ACCDHIMOVF ACCBLO,0MOVWF ACCDLOCLRF ACCBHI ;清ACCBCLRF ACCBLORETURN ;子程序返回S_SIGN MOVF ACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGN单元XORWF ACCBHI,0MOVWF SIGNBTFSS ACCBHI,7 ;ACCB为负吗?GOTO CHEK_A ;否,检查ACCACALL NEG_B ;是,求取ACCB绝对值CHEK_A BTFSC ACCAHI,7 ;ACCA为负吗?CALL NEG_A ;ACCA为负,求取ACCA绝对值,RETURN ;ACCA和ACCB均为正,返回(3)16×16位定点数除法程序LIST p=16f877INCLUDE p16f877.incACCALO EQU 20 ;存放除数低8位ACCAHI EQU 21 ;存放除数高8位ACCBLO EQU 22 ;存放被除数和商的低8位ACCBHI EQU 23 ;存放被除数和商的高8位ACCCLO EQU 24 ;存放余数低8位ACCCHI EQU 25 ;存放余数高8位ACCDLO EQU 26 ;临时寄存器ACCDHI EQU 27 ;临时寄存器TEMP EQU 28 ;临时寄存器SIGN EQU 29 ;存放商的符号ORG 0X0000START GOTO MAINORG 0X0100D_div CALL S_SIGN ;确定商的符号,并将负数取补CALL SETUP ;初始化TEMP,将被除数移至ACCD INCF TEMPCLRF ACCCHI ;清余数寄存器CLRF ACCCLODLOOP BCF STATUS,C ;清进位位RLF ACCDLO ;被除数、余数左移1位RLF ACCDHIRLF ACCCLORLF ACCCHIMOVF ACCAHI,0 ;ACCCHI-ACCAHISUBWF ACCCHI,0BTFSS STATUS,Z ;ACCCHI=ACCAHI?GOTO NOCHKMOVF ACCALO,0 ;是,ACCCLO-ACCALOSUBWF ACCCLO,0NOCHK BTFSS STATUS,C ;ACCC>ACCA?GOTO NOGOMOVF ACCALO,0 ;是,余数减除数SUBWF ACCCLOBTFSS STATUS,CDECF ACCCHIMOVF ACCAHI,0SUBWF ACCCHIBSF STATUS,C ;置进位位NOGO RLF ACCBLO ;商左移1位RLF ACCBHIDECFSZ TEMP ;循环完毕?GOTO DLOOPBTFSS SIGN,7 ;是,确定商的符号GOTO DIVOVER ;为正,除法结束,跳转到结束行COMF ACCCLO ;为负,商和余数分别取补INCF ACCCLOBTFSC STATUS,ZDECF ACCCHICOMF ACCCHICALL NEG_B ;见乘法程序中间NEG_BDIVOVER RETURN ;子程序返回S_SIGN MOVF ACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGN单元XORWF ACCBHI,0MOVWF SIGNBTFSS ACCBHI,7 ;ACCB为负?GOTO CHEK_A ;否,检查ACCACOMF ACCBLO ;是,ACCB取补INCF ACCBLOBTFSC STATUS,ZDECF ACCBHICOMF ACCBHICHEK_A BTFSC ACCAHI,7 ;ACCA为负?CALL NEG_A ;ACCA为负,取补(NEG_A子程序请参见;16×16位定点数乘法子程序NEG_A)RETURN ;ACCA和ACCB均为负,返回(4)浮点数加减法程序LIST p=16f877INCLUDE p16f877.incACCALO EQU 20 ;存放加数或减数的尾数ACCAHI EQU 21EXPA EQU 22 ;存放加数或减数阶码ACCBLO EQU 23 ;存放被加数或被减数尾数以及和或差ACCBHI EQU 24EXPB EQU 25 ;存放被加数或被减数阶码ACCCLO EQU 26 ;临时寄存器ACCCHI EQU 27 ;临时寄存器ACCDLO EQU 28 ;临时寄存器ACCDHI EQU 29 ;临时寄存器TEMP EQU 2A ;临时寄存器TEMP1 EQU 30 ;临时寄存器TIMES EQU 31 ;临时寄存器ORG 0X000START GOTO MAINORG 0X0100F_sub CALL NEG_A ;求ACCA的补码,将减法转换为补码加法F_add CALL SUBADJ ;调子程序判断EXPB和EXPA的大小BTFSC STATUS,Z ;参与运算的两个数阶码相等?GOTO PADD ;是,求尾数的和BTFSC STATUS,C ;EXPB>EXPA?CALL F_swap ;是,ACCB与ACCA 互换MOVF EXPA,0 ;否,求取两者的差值SUBWF EXPBSCLOOP CALL SHFTSR ;ACCB右移规格化INCFSZ EXPB ;EXPB=EXPA?GOTO SCLOOP ;否,继续右移MOVF EXPA,0 ;是,存和(差)的阶码MOVWF EXPBPADD MOVF ACCAHI,0 ;ACCAHI或ACCBHI IORWF ACCBHI,0MOVWF SIGN ;存于SIGN 寄存器MOVF ACCBHI,0 ;暂存ACCBHIMOVWF EXPACALL D_add ;尾数相加BTFSS SIGN,7 ;ACCA和ACCB有负数?BTFSC ACCBHI,7 ;否,把和的最高位和次高位同时进位?GOTO ADD2 ;否,转ADD2BTFSS ACCAHI,7 ;ACCA为负吗?GOTO ADD3 ;ACCA和ACCB不同时为负,转ADD3BTFSS EXPA,7 ;是,ACCB为负吗?GOTO ADD3BSF STATUS,C ;ACCA和ACCB同为负,带负号右移RRF ACCBHIRRF ACCBLOINCF EXPBADD3 CLRF ACCCHI ;和(差)规格化CLRF ACCCLOCALL F_normRETURN ;子程序返回ADD2 BCF STATUS,C ;最高位次高位不同时进位,ACCB右移INCF EXPBGOTO SHFTRSHFTSR BCF STATUS,C ;ACCB带符号右移子程序BTFSC ACCBHI,7BSF STATUS,CSHFTR RRF ACCBHIRRF ACCBLORETURN ;子程序返回F_swap MOVF ACCAHI,0 ;ACCAHI、ACCBHI互换MOVWF TEMPMOVF ACCBHI,0MOVWF ACCAHIMOVF TEMP,0MOVWF ACCBHIMOVF ACCALO,0 ;ACCALO、ACCBLO互换MOVWF TEMPMOVF ACCBLO,0MOVWF ACCALOMOVF TEMP,0MOVWF ACCBLOMOVF EXPA,0 ;EXPA、EXPB互换MOVWF TEMPMOVF EXPB,0MOVWF EXPAMOVF TEMP,0MOVWF EXPBRETURNSUBADJ MOVF EXPA,0 ;EXPA异或EXPB,结果送C_DIVXORWF EXPB,0MOVWF C_DIVMOVF EXPA,0 ;EXPB-EXPASUBWF EXPB,0BTFSS C_DIV,7 ;EXPA和EXPB同号?RETURN ;是,进位位的值真确反映两者的大小,返回BTFSS STATUS,C ;否,进位位的值取反GOTO CHANGECBCF STATUS,CRETURNCHANGEC BSF STATUS,CRETURNF_norm MOVF ACCBHI ;ACCB=0?BTFSS STATUS,ZGOTO C_normMOVF ACCBLOBTFSC STATUS,ZRETURN ;是,不需规格化,返回C_norm BTFSC ACCBHI,7;否。

pic单片机c语言

pic单片机c语言

PIC单片机 C 语言一、简介PIC(Peripheral Interface Controller)单片机是一种微控制器系列,由美国微芯科技公司推出。

PIC单片机广泛应用于嵌入式系统、自动化控制、仪器仪表等领域。

本文将介绍PIC单片机C语言编程的基础知识。

二、PIC单片机的开发环境准备在开始PIC单片机C语言编程前,我们需要准备开发环境。

以下是常用的开发环境工具:•MPLAB X IDE:Microchip官方推出的集成开发环境(IDE)。

可从Microchip官网免费下载。

•XC8编译器:Microchip官方提供的C语言编译器。

与MPLAB X IDE 配合使用,可编译生成PIC单片机的机器语言。

•PICKIT系列编程器:用于将编译生成的机器语言烧录到PIC单片机中。

在安装好开发环境工具后,我们可以开始进行PIC单片机C语言编程了。

三、PIC单片机的基本语法PIC单片机C语言编程的语法与标准C语言相似,但也有一些特殊的语法规则需要注意。

以下是一些常用的语法要点:1. 声明和定义变量在PIC单片机C语言中,我们可以使用关键字int、char、float等来声明和定义变量。

例如:int a; // 声明一个整型变量achar b; // 声明一个字符型变量bfloat c; // 声明一个浮点型变量c2. 控制语句PIC单片机C语言中的控制语句与标准C语言相似,包括条件语句、循环语句等。

例如:if (condition) {// 条件为真时执行的代码} else {// 条件为假时执行的代码}while (condition) {// 循环体}for (initialization; condition; update) {// 循环体}3. 函数在PIC单片机C语言中,我们可以定义和调用函数。

例如:int add(int a, int b) {return a + b;}int result = add(3, 5); // 调用函数add,并将返回值赋给result变量四、PIC单片机C语言编程实例下面我们以一个简单的实例来演示PIC单片机C语言编程的过程。

手把手教你学PIC单片机C语言设计(十一)驱动128×64点阵图形液晶模块的实验(续一)

手把手教你学PIC单片机C语言设计(十一)驱动128×64点阵图形液晶模块的实验(续一)
1 0 B s 1 O /F ee 0 O O O uy0 NO FRst
该 操作 将 H 6 2 2接 口部 的输 出寄 存 器 内容 读 出 , D 10 然后 列 地址计数器 自动加一。必须注意的是 , 进行读操作之前 , 必须有 次 空读 操 作 , 紧接 着 再读 才 会读 出所 要 读 的单 元 中 的数据 。
页。 f 1 - 1 D D D D _ D D D D
显示 R M 数据 的 X地址 A A 二进制 ) A A ( 被设置在 ×地址寄
O 1 D D D D D D D j D
读状 态
_
_
R ,D 7IB B D4 D 3 B D 1 B , D B 6D 5 W I D B B 2 B D O D
B s= u y ,等 待
MCU的访 问。
ON 0F : 示 当前 的显 示 状态 。 0NOF = 表 示关 显 示状 , F表 / F1 态 ; , F 示开 显 示状 态 。 ONOF 表 R s t当 R s t 1状 态 时 , D 10 e e : e e= H 6 2 2处于 复位 工作 状 态 ; 当 R st0 e e= 状态时 , 6 2 2为正常工作状态。 HD 1 0

R ~ D, ^ I
0 O
DB7 DB6 DB5 DB DB DB2 4 3 DB1 DB 0
1 0 1 1 1 A A A
RW D/ DB DB6 / l 7j DB DB DB DB DB1 DB 5 4 3 2 0
显 示开 始 行

1 .I PC单片 机驱动 1 8 6 0 2 x 4点阵 图形液 晶模 块的 子 函数
为 了实 现对 1 8 6 x 4点 阵 图形 液 晶模 块 的高 效控 制 , 们 也 2 我 必须 按 照模 块 设 计 方 式 , 立起 相 关 的子 程 序 模块 , 建 下面 详 细介 绍 各 功 能子 函数 。 判 L M 忙 子 函 数 C /一 一 一 … 一 一 … 一 一一 ~ 一 一 … … 判 L M 忙 子 函 数 C

PIC单片机做的与PLC控制器接口的四位LED数字显示表

PIC单片机做的与PLC控制器接口的四位LED数字显示表

第12章与PLC接口的4位LED数字显示表12.2 数显表头软件设计思路12.4 程序清单#include <pic16F87x.h>#include "mydefine.h"#include <pic.h>static int flag,flag0,flag1,flag3,led_d;static int data1[5],data2[5];static int data,data0,data_1,data_2,sdata;//=====================子程序=========================//端口初始化子程序void initport( ){PORTA=0;PORTB=0;PORTC=0;PORTD=0;ADCON1=0x07;TRISA=0x03; //设RA0,RA1为输入TRISB=0xE8; //设RB0,RB1,RB2,RB4为输出TRISC=0xFF; //设C口为输入TRISD=0; //设D口为输出}//判断地址是否相同子程序int adr_jud(int x){int adress,y;adress=PORTA&0x03;x&=0x60;adress=adress<<5;if (adress==x) y=1;else y=0;CLRWDT();return(y);}193//显示初始化子程序void initdis( ){PORTB=0xFE; //选通数码管1PORTD=0xC0;PORTB=0xFD; //选通数码管2PORTD=0xC0;PORTB=0xFB; //选通数码管3PORTD&=0x7F; //选通小数位PORTD=0xC0;PORTB=0xEF; //选通数码管4PORTD=0xC0;}//读5次数据判是否有4次相等int judge(arry)int arry[5];{int i,j,k;for(i=0;i<=4;i++){k=0;for(j=0;j<=4;j++){ if(arry[i]==arry[j]) k++;if(k>=4) {flag1=1;data0=arry[i];return(flag1);}else flag1=0;}}return(flag1);}//数据转换子程序int convert(int d1,int d2){auto int dd1,dd2;int i1,j1,k1,i2,j2,m;dd1=d1;194dd2=d2;j1=0x10;k1=2048;d1=0;for(i1=1;i1<=5;i1++) {if(j1==(dd1&j1)) m=1;else m=0;d1=d1+m*k1;j1=j1/2;k1=k1/2;}j2=0x40;d2=0;for(i2=1;i2<=7;i2++) {if(j2==(dd2&j2)) m=1;else m=0;d2=d2+m*k1;j2=j2/2;k1=k1/2;}data=d1+d2;return(data);}//显示子程序int display(int x){ int l1,l2,l3,l4;l1=x/1000;PORTB=0xFE; //选通数码管1PORTD=led[l1];l2=(x-l1*1000)/100;PORTB=0xFD; //选通数码管2PORTD=led[l2];l3=(x-l1*1000-l2*100)/10;PORTB=0xFB; //选通数码管3PORTD=0x7F;PORTD=led[l3];l4=x-l1*1000-l2*100-l3*10;PORTB=0xEF; //选通数码管4195PORTD=led[l4];}//中断服务子程序void interrupt int_serve( ){PIR1=0;TMR1L=0xE5;TMR1H=0xBE;di( );sdata=PORTC&0x80;ei( );}//开中断子程序void int_open( ){inportc=PORTC&0x80;if(inportc==1) return;else data1[0]=~PORTC;flag=adr_jud(data1[0]);if(flag==0) return; //地址不同返回else data1[1]=~PORTC;data1[2]=~PORTC;if(data1[0]==data1[1])if(data1[0]==data1[2]) {flag3=1;PIR1=0; //开通总中断前,清所有中断标志位TMR1IE=1; //TMR1溢出中断使能PEIE=1;ei( );TMR1L=0xE5;TMR1H=0xBE; //20ms中断1次T1CON=0x01; //设TMR1为1分频,计数器方式工作}else return;}//读第1帧子程序voidread_1( ){ int j0;196for(j0=1;j0<=4;j0++) data1[j0]=~PORTC;flag1=judge(data1);if (flag1==1) {data_1=data0;flag0=1;count1++;}flag=adr_jud(data1[0]);if(flag==1) {for(j0=1;j0<=4;j0++) data1[j0]=~PORTC;flag1=judge(data1);if (flag1==1){data_1=data0;flag0=1;count1++;}}}// 主程序main( ){ int i0,ii,i;flag0=0; //帧标志位flag1=0; //读5次数据判有4次相等标志位flag3=1; //开中断标志位count1=0; //读第1帧计数单元count2=0; //读第2帧计数单元data_1=0;data_2=0;led_d=0;led[0]=0xc0; //0led[1]=0xf9;led[2]=0xa4;led[3]=0xb0;led[4]=0x99;led[5]=0x92;led[6]=0x82;led[7]=0xf8;led[8]=0x80;197led[9]=0x90; //9initport( );OPTION=0xFE; //开看门狗initdis( );while(1) {if(flag3==0) int_open();else{if(sdata==0x80){ //第二帧数据到if(flag0==1){for(i0=0;i0<=4;i0++) data2[i0]=~PORTC;flag1=judge(data2);if (flag1==1) {data_2=data0;flag0=0;count2++;}}}else if(sdata==0) { //第一帧数据到if(flag0==0) {data1[0]=~PORTC;flag=adr_jud(data1[0]);if(flag==1) {for(j0=1;j0<=4;j0++) data1[j0]=~PORTC;flag1=judge(data1);if (flag1==1) {data_1=data0;flag0=1;count1++;}}}}CLRWDT();if(count1==count2) led_d=convert(data_1,data_2 );}display(led_d);}198}199。

PIC单片机自学笔记之LCD与MAX485通信

PIC单片机自学笔记之LCD与MAX485通信

PIC单片机笔记之LCD与MAX485通信实验环境:Proteus编程语言:汇编编程环境:MPLAB IDE单片机:PIC16F877晶振:4MHz实验目的:该实验旨在熟悉用PIC单片机控制LCD液晶显示的编程,并利用PIC单片机自身的USART模块实现MAX485通信的仿真设计,熟悉串口通信的编程和设置。

实验效果如下面图片:图(1)系统总图图(2)液晶接线图部分程序源代码ORG 0X0000GOTO MAINORG 0X0004MOVWF BWSW APF STA TUS,0CLRF STA TUSMOVWF BSTA TUSMOVF FSR,0MOVWF BFSRMOVF PCLA TH,0MOVWF BPCH;***************************以上是中断现场保护CLRF PCLA THBTFSS INTCON,5GOTO NT0INTBTFSC INTCON,2GOTO T0INTNT0INT: MOVLW PIE1MOVWF FSRBTFSS INDF,4GOTO INTOUTBTFSC PIR1,4GOTO TXINT;******************以上是中断源判别INTOUT: CLRF STA TUSMOVF BFSR,0MOVWF FSRMOVF BPCH,0MOVWF PCLA THSW APF BSTA TUS,0MOVWF STA TUSSW APF BW,1SW APF BW,0RETFIE;***********************************以上是中断现场恢复T0INT: BCF INTCON,2MOVLW 0X14MOVWF TMR0DECFSZ TM0DGOTO INTOUTMOVLW .200MOVWF TM0DDECFSZ TM0D1GOTO INTOUTMOVLW .20MOVWF TM0D1BSF PORTC,3BCF RCSTA,4BANKSEL TXSTABSF TXSTA,5BCF STA TUS,RP0GOTO INTOUT;********************************定时器0中断函数TXINT: MOVF LEN1,0SUBWF LEN,0BTFSC STA TUS,CGOTO TEXITADDLW 1BTFSC STA TUS,ZGOTO TINT1ADDLW 1BTFSC STA TUS,ZGOTO TINT2MOVLW STC1ADDWF LEN,0MOVWF FSRMOVF INDF,0MOVWF TXDA TATSEND: INCF LENBANKSEL TXSTABSF TXSTA,0;停止位BCF STA TUS,RP0MOVF TXDA TA,0MOVWF TXREGGOTO INTOUT;**************************8TINT1: MOVF CRCH,0MOVWF TXDA TAGOTO TSENDTINT2: MOVF CRCL,0MOVWF TXDA TAGOTO TSENDTEXIT: CLRF LEN;发送结束处理BCF PORTC,3BANKSEL TXSTABCF TXSTA,5BCF STA TUS,RP0BSF RCSTA,4GOTO INTOUT;***************************usart发送中断处理函数TCRC: ADDWF PCLDT "\r"TXTB: ADDWF PCLDT "COME ON.BOY!";****************************MAIN: CLRF INTCONCLRF PIR1CLRF PIR2BANKSEL TRISAMOVLW 0XC0MOVWF TRISBCLRF TRISDMOVLW 0X80MOVWF TRISCMOVLW 0X0FMOVWF OPTION_REGMOVLW 0X64MOVWF TXSTAMOVLW .25MOVWF SPBRG;波特率9600MOVLW 0X30MOVWF PIE1CLRF PIE2BANKSEL PORTAMOVLW 0X90MOVWF RCSTAMOVLW .1MOVWF TM0DMOVWF TM0D1CLRF LENMOVLW .15MOVWF LEN1MOVLW .12MOVWF COM1CLRF COM0MOVLW STC1ADDWF COM0,0MOVWF FSRMOVF COM0,0CALL TXTBMOVWF INDFINCF COM0DECFSZ COM1GOTO $-8CLRF COM0CLRF COM1MOVF COM0,0CALL TCRCMOVWF CRCLINCF COM0,0CALL TCRCMOVWF CRCHMOVLW 0X14MOVWF TMR0MOVLW 0XE0MOVWF INTCONBSF PORTC,3GOTO MAIN1;*********LCDA TA存要写入数据(指令或数据)LCDWC: CALL LCDBSY;每次写入数据前要进行‘忙检测BCF PORTC,LCDRSGOTO $+3LCDWD: CALL LCDBSYBSF PORTC,LCDRSBCF PORTC,LCDRWBSF PORTC,LCDEMOVF LCDA TA,0MOVWF PORTDCALL DELAYBCF PORTC,LCDECALL DELAYMOVLW H'06'XORWF PORTCRETURN;*******‘忙’检测**********LCDBSY: MOVLW TRISDMOVWF FSRMOVLW H'FF'MOVWF INDFMOVWF H'FF'MOVWF PORTDBCF PORTC,LCDRSBSF PORTC,LCDRWBSF PORTC,LCDEMOVF PORTD,0MOVWF LCDA TA1BCF PORTC,LCDEBTFSC LCDA TA1,7GOTO $-9CLRF INDFRETURNLCDTB: ADDWF PCL;数字ASCII码表DT "0123456789";LCDTB1: ADDWF PCLDT "TaiFengLaiLiao...";待显示字符串DELAY: MOVLW D'20'MOVWF DLAY1NOPNOPNOPNOPDECFSZ DLAY1GOTO $-4RETURN;*******************************MAIN1: MOVLW H'01';LCD初始化设置MOVWF LCDA TACALL DELAYMOVLW H'0C'MOVWF LCDA TACALL LCDWCMOVLW H'06'MOVWF LCDA TACALL LCDWCMOVLW H'38'MOVWF LCDA TACALL LCDWCMOVLW H'90'MOVWF LCDA TACALL LCDWC;******************lcd显示字符串MAIN2: MOVF TEMP,0CALL LCDTB1MOVWF LCDA TACALL LCDWDINCF TEMPMOVLW D'16'XORWF TEMP,0BTFSS STA TUS,ZGOTO MAIN2 LCDIS: GOTO $END。

pic单片机汇编语言程序设计实例

pic单片机汇编语言程序设计实例

PIC单片机汇编语言程序设计实例介绍在计算机科学领域中,汇编语言是一种低级语言,用于编写机器指令的文本形式。

汇编语言程序设计是一门重要的技能,特别是在嵌入式系统开发中。

PIC (Peripheral Interface Controller)单片机是一种常见的微控制器,广泛应用于各种电子设备中。

本文将介绍PIC单片机汇编语言程序设计的实例,旨在帮助读者更好地理解和应用汇编语言编程。

PIC单片机简介PIC单片机是由美国微芯科技公司(Microchip Technology Inc.)设计和生产的一种微控制器。

它具有高性能、低功耗和丰富的外设接口,适用于各种应用领域,如家电、汽车电子、医疗设备等。

PIC单片机的指令集是基于汇编语言的,因此掌握汇编语言编程对于理解和应用PIC单片机至关重要。

PIC单片机汇编语言基础在开始编写PIC单片机汇编语言程序之前,我们首先需要了解一些基本概念和语法。

以下是一些常用的指令和语法:1. 数据寄存器PIC单片机有多个数据寄存器,用于存储数据和中间结果。

例如,W寄存器是一个通用寄存器,用于存储临时数据。

另外,还有一些特定功能的寄存器,如PORTA寄存器用于控制输入输出。

2. 指令集PIC单片机的指令集包含了各种操作指令,如算术运算、逻辑运算、位操作等。

每个指令都有特定的操作码和操作数,用于执行相应的操作。

3. 标志寄存器PIC单片机的标志寄存器用于存储一些状态信息,如进位标志、零标志等。

这些标志位可以用于条件分支和循环控制。

4. 中断PIC单片机支持中断机制,可以在特定条件下中断当前程序的执行,执行中断服务程序。

中断可以提高系统的响应速度和实时性。

PIC单片机汇编语言程序设计实例下面将通过几个实例来演示PIC单片机汇编语言程序的设计和实现。

实例1:LED闪烁步骤:1.初始化端口为输出模式。

2.设置LED引脚为高电平,使LED熄灭。

3.延时一段时间。

4.设置LED引脚为低电平,使LED亮起。

基于PIC单片机的19264点阵型液晶显示屏接口设计

基于PIC单片机的19264点阵型液晶显示屏接口设计

基于PIC单片机的19264点阵型液晶显示屏接口设计文章以19264点阵液晶显示屏为例,介绍了PIC单片机与19264点阵显示屏的硬件接口电路,并给出了使用C30编写的底层驱动接口程序和部分应用层代码,所给出的接口设计方法对相关点阵屏的使用有一定的借鉴意义。

标签:19264;单片机;接口技术前言单片机应用系统中,显示模块有数码管、1602、12864、19264点阵屏,这些都是最常见s的、可用于电子开发的显示屏。

其中19264点阵显示屏功耗低,体积小、显示信息量大,除了能显示字母和数字外,还能显示图片,被广泛的应用于工控领域。

文章以19264点阵屏为例,介绍其与PIC单片机的接口技术。

对于不带字库的液晶显示屏应用有一定的借鉴作用。

1 硬件接口设计19264液晶显示屏生产厂家比较多,但是根据通讯方法有SPI,II2C、并行口这几种方式,我们选取并行口YXD-19264显示模块为例,介绍硬件接口电路设计。

YXD-19264显示模块是一种图形点阵液晶显示模块,它主要由行驱动器、列驱动器及192×64全点阵液晶显示器组成。

可完成线、圆、BMP图片等图形显示,也可以显示12×4个(16×16点阵)汉字,工作温度为-10℃~+55℃,存储温度存储温度为-20℃~+66℃,工作电流约1.3mA(无背光4,无负压)4m(无背光,带负压)底背光电流小于200mA(5.6Ω限流电阻)。

YXD-19264模块接口电路简单,对外只有20个管脚。

管脚定义如表1所示。

单片机选用PIC通用系列16 位MCUPIC24FJ256GB110,它有16位数据宽度,24位指令宽度,片内闪存256KB,有多达85个可编程数字I/O,工作40MIPS,工作电压+3.6V-+5V,外围资源非常丰富,非常适用于工控领域。

按照YXD-19264的管脚定义和PIC24FJ256GB110芯片资源,设计的硬件连接如下:(1)LCD的DB0-DB78位并行数据口接RB0-RB7;(2)LCD的R/W接RB8;(3)LCD的D/I接RB9;(4)LCD的/RST接RB10;(5)LCD的E接RB11;(6)LCD的CS1,CS2分别接RB12,RB13。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;//静态显示驱动
相关文档
最新文档