单片机常用芯片头文件

合集下载

单片机C语言常用头文件

单片机C语言常用头文件

下 列函数注意在你调用任意内存分配程序比如.. calloc malloc 和realloc)之前必须调用 _NewHeap 来初始化堆heap int abs(int i) 返回i 的绝对值 int atoi(char *s) 转换字符串s 为整型数并返回它字符串s 起始必须是整型数形式字符否则返回0 double atof(const char *s) 转换转换字符串s 为双精度浮点数并返回它字符串s 起始必须是浮点数形式字符串 long atol(char *s) 转换字符串s 为长整型数并返回它字符串s 起始必须是长整型数形式字符否则返回0 void *calloc(size_t nelem, size_t size) 分配"nelem"个数据项的内存连续空间每个数据项的大小为size 字节并且初始化为0 如果分 配成功返回分配内存单元的首地址否则返回0 void exit(status) 终止程序运行典型的是无限循环它是担任用户main 函数的返回点 void free(void *ptr) 释放ptr 所指向的内存区 void *malloc(size_t size) 分配size 字节的存贮区如果分配成功则返回内存区地址如内存不够分配则返回0 void _NewHeap(void *start, void *end) 初始化内存分配程序的堆一个典型的调用是将符号_bss_end+1 的地址用作"start"值符号 _bss_end 定义为编译器用来存放全局变量和字符串的数据内存的结束加1 的目的是堆栈检 查函数 使用_bss_end 字节存贮为标志字节这个结束值不能被放入堆栈中 extern char _bss_end; _NewHeap(&_bss_end+1, &_bss_end + 201); // 初始化200 字节大小的堆 int rand(void) 返回一个在0 和RAND_MAX 之间的随机数 void *realloc(void *ptr, size_t size) 重新分配ptr 所指向内存区的大小为size 字节size 可比原来大或小返回指向该内存区的地 址指针

51单片机头文件reg51.h详解

51单片机头文件reg51.h详解

我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面内容不多,像飞思卡尔、ARM 系列的单片机头文件往往内容就非常多,尽管如此,对一些初次接触单片机的朋友来说,51的头文件还是搞不太清楚,今天具体来说明一下。

1)“文件包含”处理概念所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。

因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如reg51.h,然后用#include<reg51.h>包含进来就可以了,这个就相当于工业上的标准零件,拿来直接用就可以了。

2)寄存器地址及位地址声明的原因reg51.h里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如sfr P1=0x80; sfr IE=0xA8;sbit EA=0xAF等。

sfr P1 = 0x90这句话表示:P1口所对应的特殊功能寄存器P1在内存中的地址为0x80,sbit EA=0xAF这句话表示EA这一位的地址为0xAF。

注意这里出现了一个使用很频繁的sfr和sbit。

sfr 表示特殊功能寄存器的意思,它并非标准C 语言的关键字,而是Keil 为能直接访问80C51中的SFR 而提供了一个新的关键词,其用法是:sfr 特殊功能寄存器名=地址值(注意对于头文件里“特殊功能寄存器名”,用户实际上也可以修改的,如P1=0x80,也可改为A1=0x80,但sfr 和地址值则不能更改,否者会编译出错。

)sbit表示位的意思,它也是非标准C 语言的关键字,编写程序时如需操作寄存器的某一位(可位寻址的寄存器才能用)时,需定义一个位变量,此时就要要到sbit,如sbit deng=P1^0,sbit EA = 0xAF;需要注意的是,位定义时有些特殊,用法有三种:第一种方法:sbit 位变量名=寄存器位地址值第二种方法:sbit 位变量名=SFR 名称^寄存器位值(0-7)第三种方法:sbit 位变量名=SFR 地址值^寄存器位值如:sbit IT0=0x88 (1)说明:0x88是IT0 的位地址值sbit deng=P1^2 (2)说明:其中P1 必须先用sfr 定义好sbit EA=0xA8^7 (3)说明:0xA8 就是IE寄存器的地址值以上三种定义方法需注意的是 IT0 deng EA可由用户随便定义,但必须满足C语言对变量名的定义规则。

单片机头文件

单片机头文件

Reg51.h是头文件,是对单片机的特殊寄存器的定义。

另外,#include <reg51.h>与#include"reg51.h"是有区别的,使用< >包含头文件时,编译先进入到软件安装文件夹处开始搜索这个头文件,使用“”包含头文件时,编译先进入当前工程所在文件夹处开始搜索这个头文件。

Reg51.h在文件安装文件夹处存在,所以一般用#include<reg51.h>。

头文件具体对特殊寄存器的定义如下:/*--------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* BIT Register *//* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */ sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */ sbit SM0 = 0x9F; sbit SM1 = 0x9E;sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。

C51常用头文件

C51常用头文件

C51常用头文件在KEIL 中,对于单片机所使用的头文件,除了reg51 reg52以外,还有一些从各芯片制商的官网下载与reg51,reg52功能类似的头文件,需了解透外,还要对各类型单片机均可通用且相当有用的的头文件,做相应的了解。

因为,内部所包含的函数与宏定义,可以及大的方便我们编写应用程序1字符函数 ctype.h1 extern bit isalpha(char);功能:检查参数字符是否为英文字母,是则返回12 extern bit isalnum(char)功能:检查字符是否为英文字母或数字字符,是则返回13 extern bit iscntrl(char)功能:检查参数值是否在0x00~0x1f 之间或等于0x7f,是则返回14 extern bit isdigit(char)功能:检查参数是否为数字字符,是则返回15 extern bit isgraph(char)功能:检查参数值是否为可打印字符,是则返回1,可打印字符为0x21~0x7e 6 extern bit isprint(char)功能:除了与isgraph相同之外,还接受空格符0x207 extern bit ispunct(char)功能:不做介绍。

8 extern bit islower(char)功能:检查参数字符的值是否为小写英文字母,是则返回19 extern bit isupper(char)功能:检查参数字符的值是否为大写英文字母,是则返回110 extern bit isspace(char)功能:检查字符是否为下列之一,空格,制表符,回车,换行,垂直制表符和送纸。

如果为真则返回111 extern bit isxdigit(char)功能:检查参数字符是否为16进制数字字符,是则返回112 extern char toint(char)功能:将ASCII字符0~9 a~f(大小写无关)转换成对应的16进制数字,返回值00H~0FH13 extern char tolower(char)功能:将大写字符转换成小写形式,如字符变量不在A~Z之间,则不作转换而直接返回该字符14 extern char toupper(char)功能:将小写字符转换成大写形式,如字符变量不在a~z之间,则不作转换而直接返回该字符15 define toascii(c) ((c)&0x7f)功能:该宏将任何整形数值缩小到有效的ASCII范围之内,它将变量和0x7f相与从而去掉第7位以上的所有数位16 #define tolower(c) (c-‘A’+’a’)功能:该宏将字符与常数0x20 逐位相或17 #define toupper(c) ((c)-‘a’+’A’)功能:该宏将字符与常数0xdf 逐位相与2数学函数 math.hextern int abs (int val);extern char cabs (char val);extern long labs (long val);extern float fabs (float val);功能:返回绝对值。

MSP430x14x系列单片机头文件注释

MSP430x14x系列单片机头文件注释

MSP430x14x系列单片机头文件注释MSP430F149单片机的头文件详细的注释#ifndef__msp430x14x_h#define__msp430x14x_h/************************************************************ *STANDARD BITS************************************************************/ #define BIT00x0001#define BIT10x0002#define BIT20x0004#define BIT30x0008#define BIT40x0010#define BIT50x0020#define BIT60x0040#define BIT70x0080#define BIT80x0100#define BIT90x0200#define BITA0x0400#define BITB0x0800#define BITC0x1000#define BITD0x2000#define BITE0x4000#define BITF0x8000/************************************************************ *STATUS REGISTER BITS************************************************************/ #define C0x0001#define Z0x0002#define N0x0004#define V0x0100#define GIE0x0008#define CPUOFF0x0010#define OSCOFF0x0020#define SCG00x0040#define SCG10x0080/*Low Power Modes coded with Bits4-7in SR*/#ifndef__IAR_SYSTEMS_ICC/*Begin#defines for assembler*/ #define LPM0CPUOFF#define LPM1SCG0+CPUOFF#define LPM2SCG1+CPUOFF#define LPM3SCG1+SCG0+CPUOFF#define LPM4SCG1+SCG0+OSCOFF+CPUOFF/*End#defines for assembler*/#else/*Begin#defines for C*/#define LPM0_bits CPUOFF#define LPM1_bits SCG0+CPUOFF#define LPM2_bits SCG1+CPUOFF#define LPM3_bits SCG1+SCG0+CPUOFF#define LPM4_bits SCG1+SCG0+OSCOFF+CPUOFF#include#define LPM0_BIS_SR(LPM0_bits)/*Enter Low Power Mode0*/#define LPM0_EXIT_BIC_SR(LPM0_bits)/*Exit Low Power Mode0*/#define LPM1_BIS_SR(LPM1_bits)/*Enter Low Power Mode1*/#define LPM1_EXIT_BIC_SR(LPM1_bits)/*Exit Low Power Mode1*/#define LPM2_BIS_SR(LPM2_bits)/*Enter Low PowerMode2*/#define LPM2_EXIT_BIC_SR(LPM2_bits)/*Exit Low Power Mode2*/#define LPM3_BIS_SR(LPM3_bits)/*Enter Low Power Mode3*/#define LPM3_EXIT_BIC_SR(LPM3_bits)/*Exit Low Power Mode3*/#define LPM4_BIS_SR(LPM4_bits)/*Enter Low Power Mode4*/#define LPM4_EXIT_BIC_SR(LPM4_bits)/*Exit Low Power Mode4*/#endif/*End#defines for C*//************************************************************ *PERIPHERAL FILE MAP************************************************************/ /************************************************************ *特殊功能寄存器地址和控制位************************************************************/ /*中断使能1*/#define IE1_0x0000sfrb IE1=IE1_;#define WDTIE0x01/*看门狗中断使能*/#define OFIE0x02/*外部晶振故障中断使能*/#define NMIIE0x10/*非屏蔽中断使能*/#define ACCVIE0x20/*可屏蔽中断使能/flash写中断错误*/ #define URXIE00x40/*串口0接收中断使能*/#define UTXIE00x80/*串口0发送中断使能*//*中断标志1*/#define IFG1_0x0002sfrb IFG1=IFG1_;#define WDTIFG0x01/*看门狗中断标志*/#define OFIFG0x02/*外部晶振故障中断标志*/#define NMIIFG0x10/*非屏蔽中断标志*/#define URXIFG00x40/*串口0接收中断标志*/#define UTXIFG00x80/*串口0发送中断标志*//*中断模式使能1*/#define ME1_0x0004sfrb ME1=ME1_;#define URXE00x40/*串口0接收中断模式使能*/#define USPIE00x40/*同步中断模式使能*/#define UTXE00x80/*串口0发送中断模式使能*//*中断使能2*/#define IE2_0x0001sfrb IE2=IE2_;#define URXIE10x10/*串口1接收中断使能*/#define UTXIE10x20/*串口1发送中断使能*//*中断标志2*/#define IFG2_0x0003sfrb IFG2=IFG2_;#define URXIFG10x10/*串口1接收中断标志*/#define UTXIFG10x20/*串口1发送中断标志*//*中断模式使能2*/#define ME2_0x0005sfrb ME2=ME2_;#define URXE10x10/*串口1接收中断模式使能*/ #define USPIE10x10/*同步中断模式使能*/#define UTXE10x20/*串口1发送中断模式使能*//************************************************************ *看门狗定时器的寄存器定义************************************************************/#define WDTCTL_0x0120sfrw WDTCTL=WDTCTL_;#define WDTIS00x0001/*选择WDTCNT的四个输出端之一*/ #define WDTIS10x0002/*选择WDTCNT的四个输出端之一*/ #define WDTSSEL0x0004/*选择WDTCNT的时钟源*/#define WDTCNTCL0x0008/*清除WDTCNT端:为1时从0开始计数*/#define WDTTMSEL0x0010/*选择模式0:看门狗模式;1:定时器模式*/#define WDTNMI0x0020/*选择NMI/RST引脚功能0:为RST;1:为NMI*/#define WDTNMIES0x0040/*WDTNMI=1时.选择触发延0:为上升延1:为下降延*/#define WDTHOLD0x0080/*停止看门狗定时器工作0:启动;1:停止*/#define WDTPW0x5A00/*写密码:高八位*//*SMCLK=1MHz定时器模式*/#defineWDT_MDLY_32WDTPW+WDTTMSEL+WDTCNTCL/* TSMCLK*2POWER15=32ms复位状态*/#defineWDT_MDLY_8WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0/* TSMCLK*2POWER13=8.192ms"*/#defineWDT_MDLY_0_5WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms"*/#defineWDT_MDLY_0_064WDTPW+WDTTMSEL+WDTCNTCL+WDTI S1+WDTIS0/* TSMCLK*2POWER6=0.512ms"*//*ACLK=32.768KHz定时器模式*/#defineWDT_ADLY_1000WDTPW+WDTTMSEL+WDTCNTCL+WDTSS EL/* TACLK*2POWER15=1000ms"*/#defineWDT_ADLY_250WDTPW+WDTTMSEL+WDTCNTCL+WDTSSE L+WDTIS0/* TACLK*2POWER13=250ms"*/#defineWDT_ADLY_16WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL +WDTIS1/* TACLK*2POWER9=16ms"*/#defineWDT_ADLY_1_9WDTPW+WDTTMSEL+WDTCNTCL+WDTSSE L+WDTIS1+WDTIS0/* TACLK*2POWER6=1.9ms"*//*SMCLK=1MHz看门狗模式*/#defineWDT_MRST_32WDTPW+WDTCNTCL/*TSMCLK*2POWER15=32ms复位状态*/#defineWDT_MRST_8WDTPW+WDTCNTCL+WDTIS0/*TSMCLK*2POWER13=8.192ms"*/#defineWDT_MRST_0_5WDTPW+WDTCNTCL+WDTIS1/* TSMCLK*2POWER9=0.512ms"*/#defineWDT_MRST_0_064WDTPW+WDTCNTCL+WDTIS1+WDTIS0/ * TSMCLK*2POWER6=0.512ms"*//*ACLK=32KHz看门狗模式*/#defineWDT_ARST_1000WDTPW+WDTCNTCL+WDTSSEL/* TACLK*2POWER15=1000ms"*/#defineWDT_ARST_250WDTPW+WDTCNTCL+WDTSSEL+WDTIS0/* TACLK*2POWER13=250ms"*/#defineWDT_ARST_16WDTPW+WDTCNTCL+WDTSSEL+WDTIS1/* TACLK*2POWER9=16ms"*/#defineWDT_ARST_1_9WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+ WDTIS0/* TACLK*2POWER6=1.9ms"*//************************************************************ 硬件乘法器的寄存器定义************************************************************/ #define MPY_0x0130/*无符号乘法*/sfrw MPY=MPY_;#define MPYS_0x0132/*有符号乘法*/sfrw MPYS=MPYS_;#define MAC_0x0134/*无符号乘加*/sfrw MAC=MAC_;#define MACS_0x0136/*有符号乘加*/sfrw MACS=MACS_;#define OP2_0x0138/*第二乘数*/sfrw OP2=OP2_;#define RESLO_0x013A/*低6位结果寄存器*/sfrw RESLO=RESLO_;#define RESHI_0x013C/*高6位结果寄存器*/sfrw RESHI=RESHI_;#define SUMEXT_0x013E/*结果扩展寄存器*/const sfrw SUMEXT=SUMEXT_;/************************************************************ *DIGITAL I/O Port1/2寄存器定义有中断功能************************************************************/#define P1IN_0x0020/*P1输入寄存器*/const sfrb P1IN=P1IN_;#define P1OUT_0x0021/*P1输出寄存器*/sfrb P1OUT=P1OUT_;#define P1DIR_0x0022/*P1方向选择寄存器*/sfrb P1DIR=P1DIR_;#define P1IFG_0x0023/*P1中断标志寄存器*/sfrb P1IFG=P1IFG_;#define P1IES_0x0024/*P1中断边沿选择寄存器*/ sfrb P1IES=P1IES_;#define P1IE_0x0025/*P1中断使能寄存器*/sfrb P1IE=P1IE_;#define P1SEL_0x0026/*P1功能选择寄存器*/sfrb P1SEL=P1SEL_;#define P2IN_0x0028/*P2输入寄存器*/const sfrb P2IN=P2IN_;#define P2OUT_0x0029/*P2输出寄存器*/sfrb P2OUT=P2OUT_;#define P2DIR_0x002A/*P2方向选择寄存器*/sfrb P2DIR=P2DIR_;#define P2IFG_0x002B/*P2中断标志寄存器*/sfrb P2IFG=P2IFG_;#define P2IES_0x002C/*P2中断边沿选择寄存器*/ sfrb P2IES=P2IES_;#define P2IE_0x002D/*P2中断使能寄存器*/sfrb P2IE=P2IE_;#define P2SEL_0x002E/*P2功能选择寄存器*/sfrb P2SEL=P2SEL_;/************************************************************ *DIGITAL I/O Port3/4寄存器定义无中断功能************************************************************/ #define P3IN_0x0018/*P3输入寄存器*/const sfrb P3IN=P3IN_;#define P3OUT_0x0019/*P3输出寄存器*/sfrb P3OUT=P3OUT_;#define P3DIR_0x001A/*P3方向选择寄存器*/sfrb P3DIR=P3DIR_;#define P3SEL_0x001B/*P3功能选择寄存器*/sfrb P3SEL=P3SEL_;#define P4IN_0x001C/*P4输入寄存器*/const sfrb P4IN=P4IN_;#define P4OUT_0x001D/*P4输出寄存器*/sfrb P4OUT=P4OUT_;#define P4DIR_0x001E/*P4方向选择寄存器*/sfrb P4DIR=P4DIR_;#define P4SEL_0x001F/*P4功能选择寄存器*/sfrb P4SEL=P4SEL_;/************************************************************ *DIGITAL I/O Port5/6I/O口寄存器定义PORT5和6无中断功能************************************************************/ #define P5IN_0x0030/*P5输入寄存器*/const sfrb P5IN=P5IN_;#define P5OUT_0x0031/*P5输出寄存器*/sfrb P5OUT=P5OUT_;#define P5DIR_0x0032/*P5方向选择寄存器*/sfrb P5DIR=P5DIR_;#define P5SEL_0x0033/*P5功能选择寄存器*/sfrb P5SEL=P5SEL_;#define P6IN_0x0034/*P6输入寄存器*/const sfrb P6IN=P6IN_;#define P6OUT_0x0035/*P6输出寄存器*/sfrb P6OUT=P6OUT_;#define P6DIR_0x0036/*P6方向选择寄存器*/sfrb P6DIR=P6DIR_;#define P6SEL_0x0037/*P6功能选择寄存器*/sfrb P6SEL=P6SEL_;/************************************************************ *USART串口寄存器"UCTL","UTCTL","URCTL"定义的各个位可串口1串口2公用************************************************************/ /*UCTL串口控制寄存器*/#define PENA0x80/*校验允许位*/#define PEV0x40/*偶校验为0时为奇校验*/#define SPB0x20/*停止位为2为0时停止位为1*/#define CHAR0x10/*数据位为8位为0时数据位为7位*/#define LISTEN0x08/*自环模式(发数据同时在把发的数据接收回来)*/#define SYNC0x04/*同步模式为0异步模式*/#define MM0x02/*为1时地址位多机协议(异步)主机模式(同步);为0时线路空闲多机协议(异步)从机模式(同步)*/#define SWRST0x01/*控制位*//*UTCTL串口发送控制寄存器*/#define CKPH0x80/*时钟相位控制位(只同步方式用)为1时时钟UCLK延时半个周期*/#define CKPL0x40/*时钟极性控制位为1时异步与UCLK 相反;同步下降延有效*/#define SSEL10x20/*时钟源选择位:与SSEL0组合为0,1,2,3四种方式*/#define SSEL00x10/*"0"选择外部时钟,"1"选择辅助时钟,"2","3"选择系统子时钟*/#define URXSE0x08/*接收触发延控制位(只在异步方式下用)*/ #define TXWAKE0x04/*多处理器通信传送控制位(只在异步方式下用)*/#define STC0x02/*外部引脚STE选择位为0时为4线模式为1时为3线模式*/#define TXEPT0x01/*发送器空标志*//*URCTL串口接收控制寄存器同步模式下只用两位:FE和OE*/ #define FE0x80/*帧错标志*/#define PE0x40/*校验错标志位*/#define OE0x20/*溢出标志位*/#define BRK0x10/*打断检测位*/#define URXEIE0x08/*接收出错中断允许位*/#define URXWIE0x04/*接收唤醒中断允许位*/#define RXWAKE0x02/*接收唤醒检测位*/#define RXERR0x01/*接收错误标志位*//************************************************************ *USART0串口0寄存器定义************************************************************/ #define U0CTL_0x0070/*串口0基本控制寄存器*/sfrb U0CTL=U0CTL_;#define U0TCTL_0x0071/*串口0发送控制寄存器*/sfrb U0TCTL=U0TCTL_;#define U0RCTL_0x0072/*串口0接收控制寄存器*/sfrb U0RCTL=U0RCTL_;#define U0MCTL_0x0073/*波特率调整寄存器*/sfrb U0MCTL=U0MCTL_;#define U0BR0_0x0074/*波特率选择寄存器0*/sfrb U0BR0=U0BR0_;#define U0BR1_0x0075/*波特率选择寄存器1*/sfrb U0BR1=U0BR1_;#define U0RXBUF_0x0076/*接收缓存寄存器*/const sfrb U0RXBUF=U0RXBUF_;#define U0TXBUF_0x0077/*发送缓存寄存器*/sfrb U0TXBUF=U0TXBUF_;/*改变的寄存器名定义*/#define UCTL0_0x0070/*UART0Control*/sfrb UCTL0=UCTL0_;#define UTCTL0_0x0071/*UART0Transmit Control*/ sfrb UTCTL0=UTCTL0_;#define URCTL0_0x0072/*UART0Receive Control*/ sfrb URCTL0=URCTL0_;#define UMCTL0_0x0073/*UART0Modulation Control*/ sfrb UMCTL0=UMCTL0_;#define UBR00_0x0074/*UART0Baud Rate0*/sfrb UBR00=UBR00_;#define UBR10_0x0075/*UART0Baud Rate1*/sfrb UBR10=UBR10_;#define RXBUF0_0x0076/*UART0Receive Buffer*/ const sfrb RXBUF0=RXBUF0_;#define TXBUF0_0x0077/*UART0Transmit Buffer*/ sfrb TXBUF0=TXBUF0_;#define UCTL_0_0x0070/*UART0Control*/sfrb UCTL_0=UCTL_0_;#define UTCTL_0_0x0071/*UART0Transmit Control*/ sfrb UTCTL_0=UTCTL_0_;#define URCTL_0_0x0072/*UART0Receive Control*/ sfrb URCTL_0=URCTL_0_;#define UMCTL_0_0x0073/*UART0Modulation Control*/ sfrb UMCTL_0=UMCTL_0_;#define UBR0_0_0x0074/*UART0Baud Rate0*/sfrb UBR0_0=UBR0_0_;#define UBR1_0_0x0075/*UART0Baud Rate1*/sfrb UBR1_0=UBR1_0_;#define RXBUF_0_0x0076/*UART0Receive Buffer*/ const sfrb RXBUF_0=RXBUF_0_;#define TXBUF_0_0x0077/*UART0Transmit Buffer*/sfrb TXBUF_0=TXBUF_0_;/************************************************************ *USART1串口1寄存器定义************************************************************/ #define U1CTL_0x0078/*串口1基本控制寄存器*/sfrb U1CTL=U1CTL_;#define U1TCTL_0x0079/*串口1发送控制寄存器*/sfrb U1TCTL=U1TCTL_;#define U1RCTL_0x007A/*串口1接收控制寄存器*/sfrb U1RCTL=U1RCTL_;#define U1MCTL_0x007B/*波特率调整控制寄存器*/sfrb U1MCTL=U1MCTL_;#define U1BR0_0x007C/*波特率选择寄存器0*/sfrb U1BR0=U1BR0_;#define U1BR1_0x007D/*波特率选择寄存器1*/sfrb U1BR1=U1BR1_;#define U1RXBUF_0x007E/*接收缓存*/const sfrb U1RXBUF=U1RXBUF_;#define U1TXBUF_0x007F/*发送缓存*/sfrb U1TXBUF=U1TXBUF_;/*改变的寄存器名定义*/#define UCTL1_0x0078/*UART1Control*/sfrb UCTL1=UCTL1_;#define UTCTL1_0x0079/*UART1Transmit Control*/ sfrbUTCTL1=UTCTL1_;#define URCTL1_0x007A/*UART1Receive Control*/ sfrb URCTL1=URCTL1_;#define UMCTL1_0x007B/*UART1Modulation Control*/ sfrb UMCTL1=UMCTL1_;#define UBR01_0x007C/*UART1Baud Rate0*/sfrb UBR01=UBR01_;#define UBR11_0x007D/*UART1Baud Rate1*/sfrb UBR11=UBR11_;#define RXBUF1_0x007E/*UART1Receive Buffer*/ const sfrb RXBUF1=RXBUF1_;#define TXBUF1_0x007F/*UART1Transmit Buffer*/ sfrb TXBUF1=TXBUF1_;#define UCTL_1_0x0078/*UART1Control*/sfrb UCTL_1=UCTL_1_;#define UTCTL_1_0x0079/*UART1Transmit Control*/sfrb UTCTL_1=UTCTL_1_;#define URCTL_1_0x007A/*UART1Receive Control*/sfrb URCTL_1=URCTL_1_;#define UMCTL_1_0x007B/*UART1Modulation Control*/sfrb UMCTL_1=UMCTL_1_;#define UBR0_1_0x007C/*UART1Baud Rate0*/sfrb UBR0_1=UBR0_1_;#define UBR1_1_0x007D/*UART1Baud Rate1*/sfrb UBR1_1=UBR1_1_;#define RXBUF_1_0x007E/*UART1Receive Buffer*/const sfrb RXBUF_1=RXBUF_1_;#define TXBUF_1_0x007F/*UART1Transmit Buffer*/sfrb TXBUF_1=TXBUF_1_;/*************************************************************Timer A定时器A寄存器定义************************************************************/ #define TAIV_0x012E/*Timer A中断向量寄存器*/sfrw TAIV=TAIV_;#define TACTL_0x0160/*Timer A控制寄存器*/sfrw TACTL=TACTL_;#define TACCTL0_0x0162/*Timer A捕获/比较控制寄存器0*/ sfrw TACCTL0=TACCTL0_;#define TACCTL1_0x0164/*Timer A捕获/比较控制寄存器1*/ sfrw TACCTL1=TACCTL1_;#define TACCTL2_0x0166/*Timer A捕获/比较控制寄存器2*/ sfrw TACCTL2=TACCTL2_;#define TAR_0x0170/*Timer A16位计数器内容*/sfrw TAR=TAR_;#define TACCR0_0x0172/*Timer A捕获/比较寄存器0*/sfrw TACCR0=TACCR0_;#define TACCR1_0x0174/*Timer A捕获/比较寄存器1*/sfrw TACCR1=TACCR1_;#define TACCR2_0x0176/*Timer A捕获/比较寄存器2*/sfrw TACCR2=TACCR2_;/*改变的寄存器名定义*/#define CCTL0_0x0162/*Timer A Capture/Compare Control0*/sfrw CCTL0=CCTL0_;#define CCTL1_0x0164/*Timer A Capture/Compare Control1*/sfrw CCTL1=CCTL1_;#define CCTL2_0x0166/*Timer A Capture/Compare Control2*/sfrw CCTL2=CCTL2_;#define CCR0_0x0172/*Timer A Capture/Compare0*/ sfrw CCR0=CCR0_;#define CCR1_0x0174/*Timer A Capture/Compare1*/ sfrw CCR1=CCR1_;#define CCR2_0x0176/*Timer A Capture/Compare2*/ sfrw CCR2=CCR2_;/*TACTL控制寄存器16个位寄存器定义*/#define TASSEL20x0400/*未用*/#define TASSEL10x0200/*时钟输入源控制位1*/#define TASSEL00x0100/*时钟输入源控制位0*/#define ID10x0080/*分频系数选择位1*/#define ID00x0040/*分频系数选择位0*/#define MC10x0020/*计数模式控制位1*/#define MC00x0010/*计数模式控制位0*/#define TACLR0x0004/*置1位清除定时器*/#define TAIE0x0002/*定时器中断允许*/#define TAIFG0x0001/*定时器中断标志*/#define MC_000*0x10/*停止模式*/#define MC_101*0x10/*增计数模式*/#define MC_202*0x10/*连续计数模式*/#define MC_303*0x10/*增/减计数模式*/#define ID_000*0x40/*直通*/#define ID_101*0x40/*2分频*/#define ID_202*0x40/*4分频*/#define ID_303*0x40/*8分频*/#define TASSEL_000*0x100/*时钟源为TACLK*/#define TASSEL_101*0x100/*时钟源为ACLK*/#define TASSEL_202*0x100/*时钟源为SMCLK*/#define TASSEL_303*0x100/*时钟源为INCLK*//*Timer A,Timer B可公用捕获/比较控制寄存器X*/#define CM10x8000/*捕获模式选择位1*/#define CM00x4000/*捕获模式选择位0*/#define CCIS10x2000/*捕获输入信号源选择位1*/#define CCIS00x1000/*捕获输入信号源选择位0*/#define SCS0x0800/*信号同步位0:异步捕获;1:同步捕获*/#define SCCI0x0400/*锁存输入信号*/#define CAP0x0100/*模式选择:0:比较模式;1:捕获模式*/#define OUTMOD20x0080/*输出模式选择位2*/#define OUTMOD10x0040/*输出模式选择位1*/#define OUTMOD00x0020/*输出模式选择位0*/#define CCIE0x0010/*中断允许位*/#define CCI0x0008/*读出输入信号源位ccis0\1*/#define OUT0x0004/*输出信号(选择输出模式0)*/#define COV0x0002/*捕获溢出标志*/#define CCIFG0x0001/*中断标志*/#define OUTMOD_00*0x20/*输出模式*/#define OUTMOD_11*0x20/*置位模式*/#define OUTMOD_22*0x20/*翻转/复位模式*/#define OUTMOD_33*0x20/*置位/复位模式*/#define OUTMOD_44*0x20/*翻转模式*/#define OUTMOD_55*0x20/*复位模式*/#define OUTMOD_66*0x20/*翻转/置位模式*/#define OUTMOD_77*0x20/*复位/置位模式*/#define CCIS_00*0x1000/*选择CCIXA为捕获事件的输入信号源*/#define CCIS_11*0x1000/*选择CCIXB为捕获事件的输入信号源*/#define CCIS_22*0x1000/*选择GND为捕获事件的输入信号源*/#define CCIS_33*0x1000/*选择VCC为捕获事件的输入信号源*/#define CM_00*0x4000/*禁止捕获模式*/#define CM_11*0x4000/*上升延捕获模式*/#define CM_22*0x4000/*下降沿捕获模式*/#define CM_33*0x4000/*上升沿和下降沿都捕获模式*//************************************************************ *Timer B定时器B寄存器定义************************************************************/ #define TBIV_0x011E/*中断向量寄存器:BIT1-BIT3有效*/ sfrw TBIV=TBIV_;#define TBCTL_0x0180/*定时器B控制寄存器:全部控制都集中在这*/sfrw TBCTL=TBCTL_;#define TBCCTL0_0x0182/*定时器B捕获/比较控制寄存器0*/ sfrw TBCCTL0=TBCCTL0_;#define TBCCTL1_0x0184/*定时器B捕获/比较控制寄存器1*/ sfrw TBCCTL1=TBCCTL1_;#define TBCCTL2_0x0186/*定时器B捕获/比较控制寄存器2*/ sfrw TBCCTL2=TBCCTL2_;#define TBCCTL3_0x0188/*定时器B捕获/比较控制寄存器3*/ sfrw TBCCTL3=TBCCTL3_;#define TBCCTL4_0x018A/*定时器B捕获/比较控制寄存器4*/ sfrw TBCCTL4=TBCCTL4_;#define TBCCTL5_0x018C/*定时器B捕获/比较控制寄存器5*/ sfrw TBCCTL5=TBCCTL5_;#define TBCCTL6_0x018E/*定时器B捕获/比较控制寄存器6*/ sfrw TBCCTL6=TBCCTL6_;#define TBR_0x0190/*计数器*/sfrw TBR=TBR_;#define TBCCR0_0x0192/*定时器B捕获/比较寄存器0*/sfrw TBCCR0=TBCCR0_;#define TBCCR1_0x0194/*定时器B捕获/比较寄存器1*/sfrw TBCCR1=TBCCR1_;#define TBCCR2_0x0196/*定时器B捕获/比较寄存器2*/sfrw TBCCR2=TBCCR2_;#define TBCCR3_0x0198/*定时器B捕获/比较寄存器3*/sfrw TBCCR3=TBCCR3_;#define TBCCR4_0x019A/*定时器B捕获/比较寄存器4*/sfrw TBCCR4=TBCCR4_;#define TBCCR5_0x019C/*定时器B捕获/比较寄存器5*/sfrw TBCCR5=TBCCR5_;#define TBCCR6_0x019E/*定时器B捕获/比较寄存器6*/sfrw TBCCR6=TBCCR6_;/*定时器B控制寄存器:全部控制都集中在这*/#define SHR10x4000/*装载比较锁存器控制位1:受TBCCTLx 中的CCLDx位控制*/#define SHR00x2000/*装载比较锁存器控制位0:受TBCCTLx 中的CCLDx位控制*/#define TBCLGRP10x4000/*装载比较锁存器控制位1:受TBCCTLx 中的CCLDx位控制*/#define TBCLGRP00x2000/*装载比较锁存器控制位0:受TBCCTLx 中的CCLDx位控制*/#define CNTL10x1000/*定时器位数长度控制位1*/#define CNTL00x0800/*定时器位数长度控制位0*/#define TBSSEL20x0400/*未用*/#define TBSSEL10x0200/*时钟输入源控制位1*/#define TBSSEL00x0100/*时钟输入源控制位0*/#define TBCLR0x0004/*置1清除定时器*/#define TBIE0x0002/*中断允许*/#define TBIFG0x0001/*中断标志*/#define TBSSEL_00*0x0100/*时钟源为:TBCLK*/#define TBSSEL_11*0x0100/*时钟源为:ACLK*/#define TBSSEL_22*0x0100/*时钟源为:SMCLK*/#define TBSSEL_33*0x0100/*时钟源为:INCLK*/#define CNTL_00*0x0800/*16位计数模式*/#define CNTL_11*0x0800/*12位计数模式*/#define CNTL_22*0x0800/*10位计数模式*/#define CNTL_33*0x0800/*8位计数模式*/#define SHR_00*0x2000/*单独装载(初始值)*/#define SHR_11*0x2000/*分三组装载:1-3groups(1-2,3-4, 5-6)*/#define SHR_22*0x2000/*分二组装载:2-2groups(1-3, 4-6)*/#define SHR_33*0x2000/*不分组装载:3-1group(all)*/#define TBCLGRP_00*0x2000/*单独装载(初始值)*/#define TBCLGRP_11*0x2000/*分三组装载:1-3groups(1-2,3-4, 5-6)*/#define TBCLGRP_22*0x2000/*分二组装载:2-2groups(1-3, 4-6)*/#define TBCLGRP_33*0x2000/*不分组装载:3-1group(all)*/ /*Additional Timer B Control Register bits are defined in Timer A*/#define SLSHR10x0400/*Compare latch load source1*/#define SLSHR00x0200/*Compare latch load source0*/#define CLLD10x0400/*定义比较锁存器TBCLx的装载方式控制位1*/#define CLLD00x0200/*定义比较锁存器TBCLx的装载方式控制位0*/#define SLSHR_00*0x0200/*立即装载*/#define SLSHR_11*0x0200/*TBR计数到0时装载*/#define SLSHR_22*0x0200/*在增减模式下,计数到TBCLx或0时装载;在连续计数模式下,计数到0时装载*/#define SLSHR_33*0x0200/*当计数到TBCL0时装载*/#define CLLD_00*0x0200/*立即装载*/#define CLLD_11*0x0200/*TBR计数到0时装载*/#define CLLD_22*0x0200/*在增减模式下,计数到TBCLx或0时装载;在连续计数模式下,计数到0时装载*/#define CLLD_33*0x0200/*当计数到TBCL0时装载*//************************************************************ *Basic Clock Module************************************************************/ #define DCOCTL_0x0056/*DCO时钟频率控制寄存器:复位后的值位060h*/sfrb DCOCTL=DCOCTL_;#define BCSCTL1_0x0057/*系统时钟控制寄存器1:复位后的值位084h*/sfrb BCSCTL1=BCSCTL1_;#define BCSCTL2_0x0058/*系统时钟控制寄存器2:复位后的值位000h*/sfrb BCSCTL2=BCSCTL2_;/*DCO时钟频率控制寄存器*/#define MOD00x01/*DCO插入周期控制位0*/#define MOD10x02/*DCO插入周期控制位1*/#define MOD20x04/*DCO插入周期控制位2*/#define MOD30x08/*DCO插入周期控制位3*/#define MOD40x10/*DCO插入周期控制位4*/#define DCO00x20/*8种频率控制位0*/#define DCO10x40/*8种频率控制位1*/#define DCO20x80/*8种频率控制位2*//*系统时钟控制寄存器1:复位后的值位084h*/#define RSEL00x01/*选择内部电阻控制位0*/#define RSEL10x02/*选择内部电阻控制位1*/#define RSEL20x04/*选择内部电阻控制位2*/#define XT5V0x08/*必须为0*/#define DIVA00x10/*ACLK分频系数控制位0*/#define DIVA10x20/*ACLK分频系数控制位1*/#define XTS0x40/*LFXT1工作模式控制位0:低频模式./ 1:高频模式.*/#define XT2OFF0x80/*XT2CLK使能控制位0:开启;1:关闭*/#define DIVA_00x00/*ACLK分频系数为:1*/#define DIVA_10x10/*ACLK分频系数为:2*/#define DIVA_20x20/*ACLK分频系数为:4*/#define DIVA_30x30/*ACLK分频系数为:8*//*系统时钟控制寄存器2:复位后的值位000h*/#define DCOR0x01/*内外电阻选择控制位*/#define DIVS00x02/*SMCLK分频控制位0*/#define DIVS10x04/*SMCLK分频控制位1*/#define SELS0x08/*SMCLK时钟源选择位t0COCLK/1:XT2CLK/LFXTCLK*/#define DIVM00x10/*MCLK分频控制位0*/#define DIVM10x20/*MCLK分频控制位1*/#define SELM00x40/*MCLK时钟输入源选择位0*/#define SELM10x80/*MCLK时钟输入源选择位1*/#define DIVS_00x00/*SMCLK分频系数为:1*/#define DIVS_10x02/*SMCLK分频系数为:2*/#define DIVS_20x04/*SMCLK分频系数为:4*/#define DIVS_30x06/*SMCLK分频系数为:8*/#define DIVM_00x00/*MCLK分频系数为:1*/#define DIVM_10x10/*MCLK分频系数为:2*/#define DIVM_20x20/*MCLK分频系数为:4*/#define DIVM_30x30/*MCLK分频系数为:8*/#define SELM_00x00/*MCLK时钟输入源:DCOCLK*/#define SELM_10x40/*MCLK时钟输入源:DCOCLK*/#define SELM_20x80/*MCLK时钟输入源:XT2CLK/LFXTCLK*/ #define SELM_30xC0/*MCLK时钟输入源:LFXTCLK*//************************************************************* *Flash Memory FLASH操作寄存器定义*************************************************************/ #define FCTL1_0x0128/*FLASH控制寄存器1:控制编程、擦除*/ sfrw FCTL1=FCTL1_;#define FCTL2_0x012A/*FLASH控制寄存器2:控制时钟分频*/ sfrw FCTL2=FCTL2_;#define FCTL3_0x012C/*FLASH控制寄存器3:状态标志*/ sfrw FCTL3=FCTL3_;#define FRKEY0x9600/*读FLASH密码*/#define FWKEY0xA500/*写FLASH密码*/#define FXKEY0x3300/*for use with XOR instruction*/ /*FLASH控制寄存器1:控制编程、擦除*/#define ERASE0x0002/*擦除段使能*/#define MERAS0x0004/*主存擦除使能*/#define WRT0x0040/*编程使能*/#define BLKWRT0x0080/*段编程使能*//*FLASH控制寄存器2:控制时钟分频*/#define FN_00x0000/*直通*/#define FN_20x0002/*3分频*/ #define FN_30x0003/*4分频*/ #define FN_40x0004/*5分频*/ #define FN_50x0005/*6分频*/ #define FN_60x0006/*7分频*/ #define FN_70x0007/*8分频*/ #define FN_80x0008/*9分频*/ #define FN_90x0009/*10分频*/ #define FN_100x000A/*11分频*/ #define FN_110x000B/*12分频*/ #define FN_120x000C/*13分频*/ #define FN_130x000D/*14分频*/ #define FN_140x000E/*15分频*/ #define FN_150x000F/*16分频*/ #define FN_160x0010/*17分频*/ #defineFN_170x0011/*18分频*/ #define FN_180x0012/*19分频*/ #define FN_190x0013/*20分频*/ #define FN_200x0014/*21分频*/ #define FN_210x0015/*22分频*/ #define FN_220x0016/*23分频*/ #define FN_230x0017/*24分频*/ #define FN_240x0018/*25分频*/ #define FN_250x0019/*26分频*/ #define FN_260x001A/*27分频*/ #define FN_270x001B/*28分频*/ #define FN_280x001C/*29分频*/ #define FN_290x001D/*30分频*/ #define FN_300x001E/*31分频*/ #define FN_310x001F/*32分频*/ #define FN_320x0020/*33分频*/ #define FN_330x0021/*34分频*/ #define FN_340x0022/*35分频*/ #define FN_350x0023/*36分频*/ #define FN_360x0024/*37分频*/ #define FN_370x0025/*38分频*/ #define FN_380x0026/*39分频*/ #define FN_390x0027/*40分频*/ #define FN_400x0028/*41分频*/ #define FN_410x0029/*42分频*/ #define FN_420x002A/*43分频*/ #define FN_430x002B/*44分频*/ #define FN_440x002C/*45分频*/#define FN_460x002E/*47分频*/#define FN_470x002F/*48分频*/#define FN_480x0030/*49分频*/#define FN_490x0031/*50分频*/#define FN_500x0032/*51分频*/#define FN_510x0033/*52分频*/#define FN_520x0034/*53分频*/#define FN_530x0035/*54分频*/#define FN_540x0036/*55分频*/#define FN_550x0037/*56分频*/#define FN_560x0038/*57分频*/#define FN_570x0039/*58分频*/#define FN_580x003A/*59分频*/#define FN_590x003B/*60分频*/#define FN_600x003C/*61分频*/#define FN_610x003D/*62分频*/#define FN_620x003E/*63分频*/#define FN_630x003F/*64分频*/#define FSSEL_00x0000/*Flash时钟选择:ACLK*/#define FSSEL_10x0040/*Flash时钟选择:MCLK*/#define FSSEL_20x0080/*Flash时钟选择:SMCLK*/ #define FSSEL_30x00C0/*Flash时钟选择:SMCLK*/ /*FLASH控制寄存器3:状态标志*/#define BUSY0x0001/*Flash忙标志*/#define KEYV0x0002/*Flash安全键值出错标志*/ #define ACCVIFG0x0004/*Flash非法访问中断标志*/ #define WAIT0x0008/*等待指示信号位*/#define LOCK0x0010/*锁定位*/#define EMEX0x0020/*紧急退出位*//************************************************************ *Comparator A比较器A寄存器定义************************************************************/ #define CACTL1_0x0059/*比较器A控制寄存器1*/ sfrb CACTL1=CACTL1_;#define CACTL2_0x005A/*比较器A控制寄存器2*/ sfrb CACTL2=CACTL2_;#define CAPD_0x005B/*比较器A端口禁止寄存器*/ sfrb CAPD=CAPD_;/*比较器A控制寄存器1*/#define CAIFG0x01/*比较器A中断标志*/#define CAIE0x02/*比较器A中断使能*/。

51单片机常用头文件(LCD1602)

51单片机常用头文件(LCD1602)

自制51单片机常用头文件(LCD1602)C51 2008-09-24 20:11:05 阅读946 评论0 字号:大中小订阅/*--------------------------------------------------------------------------LCD1602.HThe user function is C51.Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun All rights reserved.--------------------------------------------------------------------------*/#ifndef __LCD1602_H__#define __LCD1602_H__/*连接线图:---------------------------------------------------| LCM-----51 | LCM-----51 | LCM------51 || ----------------------------------------------- || DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 || DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 || DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 || DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |---------------------------------------------------*//****************** LCD1602指令 ***********************************///输入方式设置#define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一#define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一#define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动#define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位//设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON 0x0C // 显示开#define LCD_DISPLAY_OFF 0x08 // 显示关#define LCD_CURSOR_ON 0x0A // 光标显示#define LCD_CURSOR_OFF 0x08 // 光标不显示#define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁#define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁//光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE 0x18 // LCD显示左移一位#define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位#define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位//工作方式设置#define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示#define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示#define LCD_CLEAR_SCREEN 0x01 // 清屏/***********************LCD1602地址相关******************************/#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址#define LINE1 0 // 第一行#define LINE2 1 // 第二行#define LINE_LENGTH 8 // 每行的最大字符长度/***********************LCD1602接线引脚定义**************************/#define LCM_RS P2_0 // 数据/命令选择信号#define LCM_RW P2_1 // 读/写选择信号#define LCM_E P2_2 // 使能信号#define LCM_Data P0 // 显示数据端口#define Busy 0x80 // 用于检测LCM状态字中的Busy标识#define uchar unsigned char#define uint unsigned int//================================ LCM1602控制部分========================================================= /*****************************************************函数名:void Delay_LCD(void)功能:5ms延时说明:LCD显示延时入口参数:无返回值:无*****************************************************/ void Delay_LCD(void){uint TempCyc = 5552; // 放入延时数据while(TempCyc--){;}/*****************************************************函数名:uchar ReadStatusLCM()功能:读忙状态说明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替入口参数:无返回值:LCM_Data*****************************************************///读状态uchar ReadStatusLCM(void){LCM_Data = 0xFF; // LCM数据口先置1LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy) // 检测忙信号.如果忙,则不执行{}return (LCM_Data); // 不忙返回读取数据}/***************************************************** 函数名:void WriteDataLCM()功能:向LCM1602中写入数据说明:将形参WDLCM中的数据写入LCM中入口参数:WDLCM返回值:无*****************************************************/ //写数据void WriteDataLCM(uchar WDLCM){ReadStatusLCM(); // 检测忙LCM_Data = WDLCM; // 写入数据到LCMLCM_RS = 1;LCM_RW = 0;LCM_E = 0; // 若晶振速度太高可以在这后加小的延时 LCM_E = 0; // 延时}/*****************************************************函数名:void WriteCommandLCM()功能:向LCM1602中写入指令说明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测入口参数:WCLCM,BuysC返回值:无*****************************************************///写指令void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测{if (BuysC){ReadStatusLCM(); // 根据需要检测忙}LCM_Data = WCLCM; // 写入指令LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 1;}/*****************************************************函数名:void LCMInit()功能:初始化LCM1602说明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作入口参数:无返回值:无*****************************************************///LCM初始化void LCMInit(void){LCM_Data = 0;WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 三次显示模式设置,不检测忙信号Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 0x38指令表示:8位数据显示模式,俩行多显示Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);Delay_LCD();WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1); // 显示模式设置,开始要求每次检测忙信号WriteCommandLCM(LCD_DISPLAY_OFF,1); // 关闭显示WriteCommandLCM(LCD_CLEAR_SCREEN,1); // 显示清屏WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1); // 显示光标移动设置WriteCommandLCM(LCD_DISPLAY_ON,1); // 显示开及光标设置}/*****************************************************函数名:void DisplayOneChar()功能:按指定坐标中写入数据说明:X-横坐标,Y-纵坐标,DData为ASCII值入口参数:X,Y,DData返回值:无*****************************************************///按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x01;X &= 0x0F; // 限制X不能大于15,Y不能大于1 if (Y){X |= LINE2_HEAD; // 当要显示第二行时地址码:0xc0}X |= LINE1_HEAD; // 第一行的地址码:0x80WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码WriteDataLCM(DData);}/*在LCD1602中使用此函数,在DIPS082中使用下面的函数/*****************************************************函数名:void DisplayListChar(uchar x,uchar y,uchar *DData) 功能:向指定坐标中写入字符串(在LCD1602中使用此函数) 说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:无*****************************************************//按指定位置显示字符串void DisplayListChar(uchar x,uchar y,uchar *DData){if (y == LINE1) // 判断是否写入第1行{if (x < LINE_LENGTH) // 写入位数{WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址for (; x<LINE_LENGTH&&*DData!='\0'; x++){WriteDataLCM(*(DData++)); // 写入数据}if(*DData != '\0') // 判断数据是否写完{x = 0; // 没写完写入第2行y = LINE2;}}}if (y == LINE2) // 判断是否写入第2行{WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址for (; x<LINE_LENGTH&&*DData!='\0'; x++) // 判断数据是否写完{WriteDataLCM(*(DData++)); // 写入数据}}}*//*****************************************************函数名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)功能:向指定坐标中写入字符串(在DIPS082中使用此的函数) 说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:无*****************************************************///按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***void DisplayListChar(uchar X, uchar Y, uchar code *DData) {uchar ListLength,j;ListLength = strlen(DData); // strlen:读取字符串的长度Y &= 0x1;X &= 0xF; // 限制X不能大于15,Y不能大于1if (X <= 0x0F) // X坐标应小于0xF{for(j=0; j<ListLength; j++){DisplayOneChar(X, Y, DData[j]); // 显示单个字符X++; // 横坐标加1,纵坐标不变}}}/***************************************************** 函数名:void Mychar()功能:自定义字符--CGRAM说明:LCM1602字符库中没有温度符号,自定义温度符号入口参数:无返回值:无/*****************************************************/ void Mychar(void){//---------自定义字符代码--00H------闹铃符号------------- WriteCommandLCM(0x40,1); //第1行WriteDataLCM(0x01);//WriteCommandLCM(0x41,1); //第2行WriteDataLCM(0x1b);//WriteCommandLCM(0x42,1); //第3行WriteDataLCM(0x1d);//WriteCommandLCM(0x43,1); //第4行WriteDataLCM(0x19);//WriteCommandLCM(0x44,1); //第5行WriteDataLCM(0x1d);//WriteCommandLCM(0x45,1); //第6行WriteDataLCM(0x1b);//WriteCommandLCM(0x46,1); //第7行WriteDataLCM(0x01);//WriteCommandLCM(0x47,1); //第8行WriteDataLCM(0x00);////---------自定义字符代码--01H-------温度符号------------ WriteCommandLCM(0x48,1); //第1行WriteDataLCM(0x02);//WriteCommandLCM(0x49,1); //第2行WriteDataLCM(0x05);//WriteCommandLCM(0x4a,1); //第3行 1------**--WriteDataLCM(0x05);// 2----**--**WriteCommandLCM(0x4b,1); //第4行 3----**--**WriteDataLCM(0x02);// 4------**--WriteCommandLCM(0x4c,1); //第5行 5----------WriteDataLCM(0x00);// 6----------WriteCommandLCM(0x4d,1); //第6行 7----------WriteDataLCM(0x00);// 8----------WriteCommandLCM(0x4e,1); //第7行WriteDataLCM(0x00);//WriteCommandLCM(0x4f,1); //第8行WriteDataLCM(0x00);////---------自定义字符代码--02H-------当前时间------------WriteCommandLCM(0x50,1); //第1行WriteDataLCM(0x1f);//WriteCommandLCM(0x51,1); //第2行WriteDataLCM(0x11);//WriteCommandLCM(0x52,1); //第3行WriteDataLCM(0x15);//WriteCommandLCM(0x53,1); //第4行WriteDataLCM(0x11);//WriteCommandLCM(0x54,1); //第5行WriteDataLCM(0x1b);//WriteCommandLCM(0x55,1); //第6行WriteDataLCM(0x0a);//WriteCommandLCM(0x56,1); //第7行WriteDataLCM(0x1f);//WriteCommandLCM(0x57,1); //第8行WriteDataLCM(0x00);////----------------------------------------------- }#endif。

自制51单片机常用头文件

自制51单片机常用头文件

自制51单片机常用头文件
#ifndef __COM_H__
#define __COM_H__
#define uchar unsigned char
#define uint unsigned int
#define XTAL 11059200 // CUP 晶振频率
#define baudrate 9600 // 通信波特率
void sendmsg(uint ps)
{
SBUF = ps; // 要发送的字符放入缓冲区
while(TI == 0); // 一直等等,直到发送完数据为止
TI = 0;
}
uint rcvmsg(void) //调用此函数前,要先调用RI,查看是否收到数据,确定已收到的话,再调用此函数
{
RI=0; //要先将RI=0再返回,否则,返回后,RI=0这句就不执行了。

return SBUF;
}
void initcom(void)
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器1赋初值
SM0 = 0; //串口工作方式控制
SM1 = 1; //串口工作方式控制 //这两个共同控制了串口工作方式为 0;
REN = 1; //串口接收允许
PCON = 0x00;
TR1 = 1; //允许串口接收
ES = 0; //关闭串口中断
}
#endif。

单片机头文件

单片机头文件

Reg51.h是头文件,是对单片机的特殊寄存器的定义。

另外,#include <reg51.h>与#include"reg51.h"是有区别的,使用< >包含头文件时,编译先进入到软件安装文件夹处开始搜索这个头文件,使用“”包含头文件时,编译先进入当前工程所在文件夹处开始搜索这个头文件。

Reg51.h在文件安装文件夹处存在,所以一般用#include<reg51.h>。

头文件具体对特殊寄存器的定义如下:/*--------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* BIT Register *//* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */ sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */ sbit SM0 = 0x9F; sbit SM1 = 0x9E;sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//STC 单片机内部ADC转换程序//可选择查询和中断方式//H文件#ifndef __ADC_H__#define __ADC_H__#define ADC_POWER 0x80 //ADC 电源控制位#define ADC_FLAG 0x10 //ADC 完成标志#define ADC_START 0x08 //ADC 启动控制位//ADC转换速度选择#define ADC_SPEEDLL 0x00 //420 clocks#define ADC_SPEEDL 0x20 //280 clocks#define ADC_SPEEDH 0x40 //140 clocks#define ADC_SPEEDHH 0x60 //70 clocksunsigned int AD_Result_Temp;unsigned int GetADCResult (unsigned char chan); //ADC 转换处理,查询方式#endif//C文件#ifndef __ADC_C__#define __ADC_C__#include <adc.h>//#include <cbit.h>/*----------------------------初始化ADC 寄存器中断方式----------------------------void InitADC(){unsigned unsigned char chan=0;P1ASF = 0xff; //设置P1口全部为ADC通道ADC_RES = 0; //清除高8位缓冲数据ADC_RESL = 0; //清除低2位缓冲数据ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | chan;_nop_();_nop_(); //打开ADC}*///----------------------------//ADC 中断处理//----------------------------/*void adc_isr() interrupt 5 using 1{unsigned unsigned int AD_Result_TempADC_CONTR &= !ADC_FLAG; //清除ADC 中断标志位return (((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL); //返回10位ADC转换结果if (++ch > 7) ch = 0; //却换到下一个通道ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | chan;}*/unsigned int GetADCResult(unsigned char chan){AD_Result_Temp=0;ADC_RES=0;ADC_RESL=0;ADC_CONTR = ADC_POWER | ADC_SPEEDHH | chan | ADC_START;_nop_(); //Must wait before inquiry_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待完成ADC_CONTR &= ~ADC_FLAG; //关闭ADC转换AD_Result_Temp=(((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL);return AD_Result_Temp;}#endif//74HC595//发送完一个8位数据,就锁存一次// 8个数码管,可以这样做// for(i=0;i<8;i++)// {// Send_HC595(....//要发送的8为数据);// Show_595();// }/********************************************************//* *//*将显示数据送入74HC595内部移位寄存器*//* *//********************************************************/void Send_HC595(INT16U LED_DATA){INT8U i;for(i=0;i<8;i++){HC595_DS=LED_DATA&0x80;HC595_SHCP=1; //上升沿发生移位_nop_();_nop_();HC595_SHCP=0;LED_DATA=LED_DATA<<1;}}/********************************************************//* *//*将移位寄存器内的数据锁存到输出寄存器并显示*//* *//********************************************************/void Show_595(void){HC595_STCP=0;_nop_();_nop_();HC595_STCP=1; //上升沿将数据送到输出锁存器_nop_();_nop_();HC595_STCP=0;}//74HC164#ifndef __74LS164_H__#define __74LS164_H__extern void Write_Bit8(unsigned char bit_8){unsigned char i;for(i=8;i>0;i--) //数码管段8位数据{Data=bit_8&0x80; //传送一位数据CLK=0;CLK=1;bit_8=bit_8<<1;}}#endif20位串口A/D转换器CS5513 20位串口A/D转换器CS5513 接口程序2010-03-22 14:56//cs5513接口的C51官方程序//cs5513返回长整型数据//CS=0时表示片选有效,当然可以直接接地,这样可以节省一个I/O口sbit ADCS=P2^0;sbit ADCLK=P2^1;sbit ADDO=P2^2;unsigned long int ADConv(void){uchar i;unsigned long int Result=0;ADCLK=0;ADCS=0;_nop_();_nop_();_nop_();ADCLK=0;while(ADDO);ADCLK=1;_nop_();for(i=0;i<3;i++){ADCLK=0;_nop_();ADCLK=1;}for (i=0;i<20;i++){ADCLK=0;Result=Result<<1;if (ADDO)Result=Result+1;ADCLK=1;}ADCS=1;return Result;}//LCD SMC12864-05#ifndef _CRYFUCNS_H_#define _CRYFUCNS_H_void Send(unsigned char type,unsigned char transdata);void Init_LCD(void);void Clear_GDRAM(void);void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num); void Draw_PM(const unsigned char *ptr);void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ; void Disp_SZ(unsigned char addr,unsigned char shuzi);#endif#include <cryfucns.h>#include <STC12C5A.H>#include<intrins.h>#include <types.h>extern const INT8U shuzi_table[];void Send(INT8U type,INT8U transdata);/**********液晶控制IO的宏定义*************/sbit RS_CS = P0^0;sbit RW_SDI = P0^1;sbit E_CLK = P0^2;/*******************************************函数名称:delay_Nus功能:延时N个us的时间参数:n--延时长度返回值:无********************************************/void delay_Nus(INT16U n){INT8U i;for(i = n;i > 0;i--)_nop_();}/*******************************************函数名称:delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/void delay_1ms(void){INT8U i;for(i = 150;i > 0;i--) _nop_();}/*******************************************函数名称:delay_Nms功能:延时N个ms的时间参数:无返回值:无********************************************/void delay_Nms(INT16U n){INT16U i = 0;for(i = n;i > 0;i--)delay_1ms();}/*******************************************函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/void Init_LCD(void){delay_Nms(100); //延时等待液晶完成复位Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/delay_Nus(72);Send(0,0x02); /*DDRAM地址归位*/delay_Nus(72);Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/delay_Nus(72);Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/delay_Nus(72);Send(0,0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ delay_Nus(72);}/*******************************************函数名称:Send功能:MCU向液晶模块发送1一个字节的数据参数:type--数据类型,0--控制命令,1--显示数据transdata--发送的数据返回值:无********************************************/void Send(INT8U type,INT8U transdata){INT8U firstbyte = 0xf8;INT8U temp;INT8U i,j = 3;if(type) firstbyte |= 0x02;RS_CS=1;E_CLK=0;while(j > 0){if(j == 3) temp = firstbyte;else if(j == 2) temp = transdata&0xf0;else temp = (transdata << 4) & 0xf0;for(i = 8;i > 0;i--){if(temp & 0x80) RW_SDI=1;else RW_SDI=0;E_CLK=1;temp <<= 1;E_CLK=0;}//三个字节之间一定要有足够的延时,否则易出现时序问题if(j == 3) delay_Nus(600);else delay_Nus(200);j--;}RW_SDI=0;RS_CS=0;}/*******************************************函数名称:Clear_GDRAM功能:清除液晶GDRAM内部的随机数据参数:无返回值:无********************************************/void Clear_GDRAM(void){INT8U i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,0x00);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,0x00);}}Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Disp_HZ功能:显示汉字程序参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示数据的个数返回值:无********************************************/ void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num) {INT8U i;Send(0,addr);for(i = 0;i < (num*2);i++)Send(1,*(pt++));}/*******************************************函数名称:Draw_PM功能:在整个屏幕上画一个图片参数:ptr--指向保存图片位置的指针返回值:无********************************************/ void Draw_PM(const INT8U *ptr){INT8U i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,*ptr++);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,*ptr++);}}Send(0,0x36); //打开绘图显示Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Draw_TX功能:在液晶上描绘一个16*16的图形参数:Yaddr--Y地址,Xaddr--X地址dp--指向保存图形数据的指针返回值:无********************************************/void Draw_TX(INT8U Yaddr,INT8U Xaddr,const INT8U * dp){INT8U j;INT8U k = 0;Send(0,0x34); //使用扩展指令集,关闭绘图显示for(j = 0;j < 16;j++){Send(0,Yaddr++); //Y地址Send(0,Xaddr); //X地址Send(1,dp[k++]); //送两个字节的显示数据Send(1,dp[k++]);}Send(0,0x36); //打开绘图显示Send(0,0x30); //回到基本指令集模式}/*******************************************函数名称:Disp_SZ功能:显示一个两位数字参数:addr--显示地址数字--显示的数字返回值:无********************************************/void Disp_SZ(INT8U addr,INT8U shuzi){INT8U tmp0,tmp1;tmp0 = shuzi / 10;tmp1 = shuzi % 10;Send(0,addr);Send(1,shuzi_table[tmp0]);Send(1,shuzi_table[tmp1]);}//STC 内部EEPROM 操作程序#ifndef _EEPROM_H_#define _EEPROM_H_//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值#define FIRST 0x0000#define SECOND 0x200#define THIRD 0x400#define START_FLAG 0xE1union eeprom_addr{unsigned int temp16;unsigned char temp8[2];}addr16;void IAP_Disable (void); //关闭IAP 功能void Sector_Erase (unsigned int add); //擦除扇区void Byte_Program (unsigned int add, unsigned char ch); //字节编程,调用前需打开IAP 功能extern unsigned char Byte_Read (unsigned int add); //读一字节,调用前需打开IAP 功能#endif#include <eeprom.h>/*********************************************************************************************** 读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节************************************************************************************************ /unsigned char Byte_Read(unsigned int add){EA = 0;IAP_DATA = 0x00;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关EA = 1;return (IAP_DATA);}/*********************************************************************************************** *****字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据************************************************************************************************ *****/void Byte_Program(unsigned int add, unsigned char ch){EA = 0;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash操作等待时间IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/*********************************************************************************************** *******擦除扇区, 入口:DPTR = 扇区地址************************************************************************************************ *******/void Sector_Erase(unsigned int add){EA = 0;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令addr16.temp16 = add;IAP_ADDRH = addr16.temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = addr16.temp8[1]; //设置目标单元地址的低8 位地址IAP_TRIG = 0x5A; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}/*********************************************************************************************** *****关闭IAP 功能************************************************************************************************ *****/void IAP_Disable(){//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关IAP_CONTR = 0; //关闭IAP 功能IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0;IAP_ADDRL = 0;}//MAX186 程序#ifndef _MAX186_H_#define _MAX186_H_#include <stc12c5a.h>sbit MAX186_SCLK_1 = P1^0;sbit MAX186_CS_1 = P1^1;sbit MAX186_DIN_1 = P1^2;sbit MAX186_DOUT_1 = P1^3;sbit MAX186_SCLK_2 = P1^4;sbit MAX186_CS_2 = P1^5;sbit MAX186_DIN_2 = P1^6;sbit MAX186_DOUT_2 = P1^7;unsigned int Max186_AD(unsigned char chan);#endif#include <max186.h>unsigned int Max186_AD(unsigned char chan){unsigned char i,kki,ch;unsigned int i_data,i_datatransfer,addata;switch(chan){case 0: ch=0x8E;break;case 1: ch=0xCE;break;case 2: ch=0x9E;break;case 3: ch=0xDE;break;case 4: ch=0xAE;break;case 5: ch=0xEE;break;case 6: ch=0xBE;break;case 7: ch=0xFE;break;default: ch=0xAE;break;}MAX186_CS_2=1;MAX186_SCLK_2=0;MAX186_CS_2=0;MAX186_SCLK_2=0;for(i=0;i<8;i++){unsigned char adaddresstransfer;adaddresstransfer=ch;adaddresstransfer=(adaddresstransfer>>(7-i))&0x01;MAX186_DIN_2=adaddresstransfer;MAX186_SCLK_2=1;for(kki=0;kki<2;kki++);MAX186_SCLK_2=0;}MAX186_CS_2=1;for(i=0;i<6;i++);MAX186_CS_2=0;MAX186_SCLK_2=1;for(i=0;i<12;i++){MAX186_SCLK_2=1;MAX186_SCLK_2=0;i_datatransfer=MAX186_DOUT_2;i_datatransfer=i_datatransfer<<(11-i);i_data=i_data|i_datatransfer;}addata=i_data;for(i=0;i<4;i++){MAX186_SCLK_2=1;MAX186_SCLK_2=0;}MAX186_CS_2=1;i_data=i_datatransfer=0;delay(5);return(addata);}//SMC12864-05.H #ifndef _SMC12864_05_H_#define _SMC12864_05_H_#include<types.h>void Init_LCD();void SetOnOFF(bit Switch);void Clean_LCD();void Check_LCD_Status();void Write_Cmd(INT8U Cmd);void Set_Adrr(INT8U x,INT8U y);void Write_Data(INT8U Data);void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num); #endif#include<SMC12864_05.H>#include<STC12C5A.H>#include<intrins.h>#include<delay.h>sbit RS_CS = P2^7;sbit RW_SDI = P2^6;sbit E_CLK = P2^5;sbit Busy_Bit = P0^7;void Init_LCD(){Write_Cmd(0x30); //基本指令集delay(1);Write_Cmd(0x02); // 地址归位delay(1);Write_Cmd(0x0c); //整体显示打开,游标关闭delay(1);Write_Cmd(0x01); //清除显示delay(1);Write_Cmd(0x06); //游标右移delay(1);Write_Cmd(0x80); //设定显示的起始地址Clean_LCD();SetOnOFF(1);}void Clean_LCD(){RS_CS=0;RW_SDI=0;P0=0x01;E_CLK=1;delay(1);E_CLK=0;}void SetOnOFF(bit Switch){RS_CS=0;RW_SDI=0;if(Switch==1)P0=0x0F;else P0=0x08;E_CLK=1;delay(1);E_CLK=0;}void Write_Cmd(INT8U Cmd){Check_LCD_Status();RS_CS=0;RW_SDI=0;P0=Cmd;E_CLK=1;delay(1);E_CLK=0;}void Write_Data(INT8U Data){Check_LCD_Status();RS_CS=1;RW_SDI=0;P0=Data;E_CLK=1;delay(1);E_CLK=0;}void Check_LCD_Status(){RS_CS=0;RW_SDI=1;P0=0xFF;E_CLK=1;delay(1);E_CLK=0;while(!Busy_Bit);}/*******************************************函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/ void Disp_HZ(INT8U addr,const INT8U * pt,INT8U num) {INT8U i;Write_Cmd(addr);for(i = 0;i < (num*2);i++)Write_Data(*(pt++));}。

相关文档
最新文档