原创 Pic单片机C语言程序一实例

2010-3-23 19:40 2936 2 2 分类: MCU/ 嵌入式

1.赋值语句和赋值表达


1)赋值语句赋值语句是C语言中最常用的一种语句,如公式中的计算,一般都是通过赋值语句完成的,赋值语句的格式为:


标识符二表达式;


等式左边的标识符,代表变量的标识符,该变量是除函数以外的一种变量。等式右边的表达式,可以是任何一种C表达式。赋值语句的执行过程算法规则是,首先计算等式右边的表达式,再将计算的结果(值)作为变量的值,赋给等式左边的标识符(变量)。


赋值表达式的使用频率很高,在PIC单片机C语言实例1-5中,赋值语句曾多次出现,如TRISB =Ox00;INTCON=0x00;TRISA=Ox 1 F;RBO=! RBO:


注意:这里的‘,=”号,在C语言中不是等号,而是代表将等式右边的计算值,赋给等式左边的变量,如RBO=! RBO,即先对RBO取反(值),再送给等式左边的RBO。这点初学C语言者很容易弄错!C语言中的等号应该是“二二”。


2)赋值表达式赋值表达式是C语言中一种特殊形式的赋值,它不能独立构成语句,只能在赋值语句的表达式中应用。赋值表达式的格式为:


变量二表达式


其执行过程与赋值语句相同。例如,赋值语句:m=a+(b=c+d)中的赋值表达式b=c+d属于赋值语句的中间结果(b),中间结果(b)会在该程序中该语句之后使用,从而省去相同的计算,还可以节省程序空间和运行时间。


2.循环语句


循环语句是C语句重复结构的组成部分。C语言循环语句有三种形式:while语句、do-while语句和for语句。循环语句按循环条件控制循环次数,但可在循环体中用break(间断语句)或return(返回语句)来终止循环,还可用continue继续语句)终止当前循环周期中的操作,使控制进人下一循环,继续执行。


1)while语句while语句的格式为:


while(条件表达式)语句1


可以看出,while循环结构简单,仅有条件部分,其他成分(如增量等)应另外安排。正因为如此.while语句执行过程是首先判断while中的“条件表达式’,中的条件是否满足,满足,就执行while语句中的语句;不满足,就退出循环。当while中的条件一开始就为0时,则语句一次也不执行;当while中的条件为1 }}' , while语句无限循环。可见while语句的使用极其灵活多样。


2008319115711163.jpg


2) do -while语句do -while语句的格式为:do


语句


while(条件表达式犷1


语句;


其执行过程是不管while语句中的条件表达式,首先执行一次d。中的语句,而后再进行while中的条件判断,若满足条件,则返回重新执行do中的语句,直到while中表达式不满足条件或0时,才退出循环。


注意:即使while中的表达式一开始就为‘,0”,其do中的语句也要执行一次。


3)for语句for循环语句包括计数器初始化、条件及增量等,其格式为:


for(初始化表达式,条件表达式,士曾量表达式)


语句;


其执行过程是,先求解初始化表达式,再判断条件表达式,若满足条件要求,则执行for中的语句,然后求解增量表达式,之后又判断条件表达式,若不能满足条件,则执行for语句下面的语句。


3IF语句


iF晤句又称条件语句。在程序设计时,若需根据某些条件,来决定程序的流向,常用iflA句完成。所以,if语句又称转移语句。i石吾句有三种格式,限于版面,这里仅介绍程序实例6中要用到的一种格式:


If(条件表达式)


语句


例如:if(a>b)


c=d//如条件中a>b,则d赋值给


iflA句中的表达式,可以是关系


表达式,算术表达式等多种,其执行过程是先判断if中的条件,若满足该条件,就执行if中的语句,若条件不满足,则转移到if语句的下一条语句。


十二、实例6


这里用PIC16F84A单片机(其他一型号同样等效)编辑一种C程序,其硬件电路如图7所示。电路功能:在单片机的B口外接两位LED数码管、在RA4位外接微动开关K,作电路启动信号。按动一下K,LED数码管开始从00-99自动计数,且反复循环,从而实现LED数码管计数的动态扫描功能。这里仅取两位计数显尔。读者很容易将程序扩展到多位数。为此命名该C程序为PIC06.c,其清单如下,#include <pic.h>//包含文件


#define PORTAIT (add,bit) ((unsigned)(&add)*8+(bit))


static bit PORT-2 @PORTAIT(PORTA,2);


static bit PORT_3 @PORTAIT(PORTA,3);


static bit PORT_4 @PORTAIT(PORTA,4);


//RA2、RA3、RA4的定义unsigned int ttr-0;


//ttr为无符号整型变量,并赋值。void delay(unsigned long int k)//定义带形参数K的延时子函数//延时函数开始


unsigned long int i;//i为无符号长整型变量


for(i=O;i<=k;i++)// for语句标准格式continue;


void display(unsigned int x)


产定义带形参数x的display子函数


//显示display子函数开始


unsigned int d="l",unit bit,ten_bit;


//自定义数码显示个位、十位及整型变量d并赋值I


unsigned char SEG7 [10]二(OxcO,Oxf9,Oxa4,


//数组定义和初始化


Oxb0,Ox99,Ox92,Ox82,Oxf8,Ox80,Ox90);unit bit="x"%10;


//数组个位表达并赋值自定义符ten_bit=x/10%10;


//数组10位表达并赋值自定义符while(d>0);//给定d=1的循环次数


PORTA=0x1凡


PORTB=SEG7[unit bit];


//给LED字段码的个位赋值给B C7RA3=0;//位选门个位RA3打开


delay (1000);//个位数显示延时约24ms


RA3=1;//位选门个位RA3关闭delay(10);//个位显示关闭约250ws


PORTB=SEG7[tenesbit];


//给LED字段码的十位赋值给B口


RA2=0;//位选门十位RA2打开(参看图6)


delay (1000);//第10位显示延时约24..a


=1;//位选门第l0ftRA2关


delay(10);//关闭约250wsvoid main;//定义main为函数长//主函数开始


TRISB=0x00;//给专用寄存器赋值TRISA=Ox 10;//初始化A,B


PORTB=0x40;


INTCON=0x00;//关中断PORTA=0x10;


tt-氏//整型变量ttrllR "0"值while(RA4);//判RA4位为1


//无限循环乍、//RA4位为0,执行以下语句


while(1);// while引导无限循环


display(ttr);//调用LED数码显示ttr++;// ttr自增加1


if(tts=99)//如果ttr等于99,ttre.0ttr-0;


1//如果ttr<99,LED继续增量显示//主函数结束


说明:1)上述C程序,只需在MPLAB IDE(高版本)和PICC C编译器中按已介绍的方法进行编译,并生成目标码hex,即可用PIC编程器将该目标码烧写到PIC16F84A中,利用图6观察LED数码管从b-99的反复显示。读者还可更改字段显示中的延时delay(k)量K值,以确认动态扫描的最佳延时(无频闪)。


2)若读者有兴趣将数码管扩到多位计数,可按程序中的思维方式增添百位、千位的自定义标识符,如hund-bit(百位)、thou-bit(千位)和对自定义百位、千位赋标准字符,女口:


hund-bit=x/100%10;


thoud-bit= x/1000%10;


再将十位、百位添到上述C程序中,即可完成多位数LED数码管的计数(动态扫描)显示。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条