单片机用矢量字库的C语言调用
- 格式:doc
- 大小:300.00 KB
- 文档页数:4
51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)2009-10-19 16:47经过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。
目前还不能修改时间与日期,只是以预定时间以始。
适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟)实现功能:简单,数字时钟+日期(以后会不断完美)。
C语言源程序如下:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*DS1302 端口设置 */sbit SCK=P3^6; //DS1302时钟sbit SDA=P3^4; //DS1302 IOsbit RST = P3^5; // DS1302复位bit ReadRTC_Flag; //读DS1302全局变量/* 12864端口定义*/#define LCD_data P0 //带字库液晶12864数据口sbit LCD_RS = P2^4; //寄存器选择输入sbit LCD_RW = P2^5; //液晶读/写控制sbit LCD_EN = P2^6; //液晶使能控制sbit PSB=P2^1; //并口控制sbit RES=P2^3;uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字uchar code dis2[] = {"有志者,事竟成!"};uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp;#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};void lcd_pos(uchar X,uchar Y); //确定显示位置unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年09-10-19 16:07:00code unsigned charwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位code unsigned charread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);//read RTCvoid Set_RTC(void); //set RTCvoid InitTIMER0(void);//inital timer0/*******************************************************************/ /* */ /* 延时函数 */ /* */ /*******************************************************************/void delay(unsigned int m) //延时程序{unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}/*******************************************************************/ /* */ /*检查LCD忙状态 *//*lcd_busy为1时,忙,等待。
C语言在单片机开发中的应用在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。
对用惯了汇编的人来说,总觉得高级语言’可控性’不好,不如汇编那样随心所欲。
但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学C51者有所帮助。
一、C51热启动代码的编制对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启动。
热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。
因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。
根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:void main(){ char data *HotPoint=(char *)0x7f;if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa)){ /*热启动的处理 */}else{ HotPoint=0x7e; /*冷启动的处进*HotPoint=0xaa;*(++HotPoint)=0xaa;}/*正常工作代码*/}然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。
这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段’起始代码’。
正是这段代码执行了清零的工作。
C编译程序提供了这段起始代码的源程序,名为CSTARTUP.A51,打开这个文件,可以看到如下代码:.IDATALEN EQU 80H ; the length of IDATA memory in bytes..STARTUP1:IF IDATALEN <> 0MOV R0,#IDATALEN - 1CLR AIDATALOOP: MOV @R0,ADJNZ R0,IDATALOOPENDIF.可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。
51单片机带字库12864液晶动态汉字显示C语言源程序2009-10-17 19:36实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。
其实和显示汉字的程序一样,只是稍做一下修改即可。
C语言源程序如下:#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>sbit RS=P2^4;sbit WRD=P2^5;sbit E=P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT[]={"我是一个中国人啊"};void initinal(void){delay(40);PSB=1; //并口工作模式delay(1);RES=0; //复位delay(1);RES=1; //复位置高delay(10);TransferData(0x30,0);delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);}void main(void){while(1){initinal();//调用LCD字库初始化程序delay(100);lcd_mesg003(IC_DAT);}}void lcd_mesg003(unsigned char code *addr1){unsigned char i;//第一行TransferData(0x80,0);delay(100);for(i=0;i<16;i++){TransferData(*addr1,1);addr1++;delayms(50);}}void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}原理就是在显示每个汉字的时候加了一个延时程序,当然可以用定时器来实现,这样的话,不占用CPU处理时间。
单片机液晶汉字显示c语言程序/*液晶屏分为4行*12列汉字,全部使用模拟接口方式。
/* TGLCMLIMIT64A接口程序(模拟方式);**********************单片机液晶汉字显示c语言程序***************************************** ************;连线图:;*LCM---89C52* *LCM---89C52* *LCM-------89C52* *LCM----------89C52* *;*DB0---P0.0* *DB4---P0.4* *D/I-------P2.6* *CS1----------P2.4* *;*DB1---P0.1* *DB5---P0.5* *R/W-------P2.7* *CS2----------P2.5* *;*DB2---P0.2* *DB6---P0.6* *RST--------VCC* *CS3----------P3.2* *;*DB3---P0.3* *DB7---P0.7* *E---------P2.3* *;注:89C52的晶振频率为12MHz *;*****************************单片机液晶汉字显示c语言程序********************************** ************///画线部分请参照avr的c程序。
/*#pragma src /*生成ASM文件开关,必要时打开 */#include#include#include#define Uchar unsigned char/***********液晶显示器接口引脚定义***************/sbit Elcm= P2^3; //sbit CS1LCM= P2^4; //sbit CS2LCM= P2^5; //sbit CS3LCM= P3^2; /*这个连接只是做实验的临时接法。
单片机汇编程序调用c语言的方法Microcontroller assembly programming often requires calling functions written in the C language to take advantage of its higher level abstractions and libraries. 单片机汇编程序经常需要调用C语言编写的函数,以利用其更高级的抽象和库。
This allows for more efficient and readable code while still being able to utilize the low-level control and optimization that assembly language provides. 这样可以更加高效和可读的代码,同时还能够利用汇编语言提供的低级控制和优化。
The process of calling a C function from assembly language involves several key steps. 调用C语言函数的过程涉及几个关键步骤。
First, the parameters for the function need to be prepared and loaded into the appropriate registers or memory locations according to the calling convention used by the system. 首先,需要准备函数的参数并根据系统使用的调用约定将其加载到适当的寄存器或内存位置。
Then, the function is called using a specific instruction or sequence of instructions, which transfers control to the C code. 然后,使用特定的指令或指令序列调用函数,这将控制权转移到C代码中。
一、装入编译器:1、启动MPLAB-IDE,如下图所示选择Project-》Install Language2、在弹出的安装语言工具对话框里“Language Suite”选项现在显示的是Microchip,点击后面的箭头来选择语言。
我使用的工具是HI-TECH PICCME,所以选择为“HI-TECH PICC”。
3、接下来在“Tool Name”里选择编译器组件的调用路径,这里有“PICC Compiler”(C编译器)、“PICC Assemble Linker”(链接器)3项都需要设置。
用“Browse”来选择调用路径,把上述3项组件的调用文件都设为PICC.EXE。
点“OK”后完成设置。
二、选用编译器:1、新建一个项目,编辑项目对话框的“Language Tool Suite”栏目默认是“Microchip”,将它改为“HI-TECHPICC”。
2、在项目文件框里点“flasha[.hex]”,这时“Node Properties”(节点属性)按钮将会亮起来。
点击进入。
3、设置节点属性。
由于FLASHA.C还有其他相关连的源程序需要加进来,所以在“Language Tool”栏里应该选择“PICC Linker”(链接器)。
通常我们可以选择:1)Generate debug info:显示debug信息;2)Create map file:选择该项后我们将看到ROM、RAM的使用情况;3)Error file:显示错误信息;4)Compile for MPLAB ICD:如果不使用ICD,就不必选择这个项目了。
4、设置完成之后点“Add Node”来添加节点。
这个项目有两个节点:fla.c和flasha.c,选择节点后点击“Node Properties”或直接双击节点来进入节点属性设置。
5、节点文件的工具这时应该选择为“PICC Compiler”(C编译器),蓝色圈子里的4项依次是:1)显示debug 信息;2)局部优化;3)全局优化;4)ICD编译配件。
在C语言中,没有内置的矢量(vector)数据类型,如同在C++中的std::vector。
然而,你可以使用动态数组来实现类似的功能。
这通常涉及使用malloc(或calloc)来分配内存,然后使用realloc在需要时调整数组的大小。
以下是一个简单的C语言实现动态数组的示例,这个动态数组可以被视为一个矢量:c#include <stdio.h>#include <stdlib.h>typedef struct {int* data;int size;int capacity;} Vector;void vector_init(Vector* vec) {vec->data = (int*)malloc(sizeof(int) * 2);vec->size = 0;vec->capacity = 2;}void vector_push(Vector* vec, int item) {if (vec->size == vec->capacity) {vec->capacity *= 2;vec->data = (int*)realloc(vec->data, sizeof(int) * vec->capacity);}vec->data[vec->size++] = item;}int vector_at(Vector* vec, int index) {if (index >= vec->size || index < 0) {printf("Vector index out of bounds\n");exit(1);}return vec->data[index];}void vector_free(Vector* vec) {free(vec->data);vec->size = 0;vec->capacity = 0;}int main() {Vector vec;vector_init(&vec);vector_push(&vec, 1);vector_push(&vec, 2);vector_push(&vec, 3);printf("%d\n", vector_at(&vec, 1)); // 输出: 2vector_free(&vec);return 0;}这个示例中,Vector结构体包含一个指向整数数组的指针,一个表示当前矢量大小的size,和一个表示当前矢量容量的capacity。
单片机C语言教程(二)引言:本文将为读者提供一个关于单片机C语言的教程,旨在帮助读者更加深入地理解和掌握此编程语言在单片机开发中的应用。
本教程将首先介绍C语言在单片机编程中的基础知识,然后深入讲解其在输入输出、控制结构、函数和指针等方面的应用。
通过学习本教程,读者将能够掌握单片机C语言的编程技巧,并能够运用于实际开发中。
一、C语言在单片机编程中的基础知识1. 数据类型:介绍单片机C语言中的基本数据类型,如整型、浮点型和字符型等。
2. 变量和常量:探讨单片机C语言中的变量和常量的定义和使用。
3. 运算符:介绍单片机C语言中常用的运算符,并详细解释其使用方法。
4. 数组和字符串:讲解单片机C语言中数组和字符串的定义与应用,以及相关的操作方法。
5. 输入输出:探讨单片机C语言中输入和输出的方法,包括标准输入输出函数的使用和文件的读写操作。
二、C语言在单片机编程中的控制结构1. 顺序结构:介绍单片机C语言中顺序结构的概念和使用方法。
2. 条件结构:讲解单片机C语言中的条件结构,如if语句、switch语句等,并给出实例演示。
3. 循环结构:详细介绍单片机C语言中循环结构的三种常见形式:while循环、do-while循环和for循环,并进行比较和实例化操作。
4. 跳转结构:讲解单片机C语言中的跳转结构,如break语句、continue语句和goto语句等,并给出应用案例。
5. 多重控制结构:探讨单片机C语言中多重控制结构的应用,如嵌套循环、嵌套条件等,并给出实例说明。
三、C语言在单片机编程中的函数1. 函数定义与声明:介绍单片机C语言中函数的定义和声明,以及函数的返回类型、参数等内容。
2. 函数调用和返回:详细讲解单片机C语言中函数的调用和返回的各种情况及参数传递的方式。
3. 内联函数:探讨单片机C语言中的内联函数概念,以及其与普通函数的区别和使用方法。
4. 递归函数:介绍单片机C语言中递归函数的概念和应用场景,并给出实例讲解。