微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机C语言程序设计(15)

PIC单片机C语言程序设计(15)

时间:01-26 来源:互联网 点击:

A ~ PORTE, 端口的位不都是8位, 其PORTA 口只有6 位(RAO ~ RA5),PORTAB、BORTC 和PORTD 是8 位, 分别为RB0 ~ RB7、RC0 ~ RC7、RD0 ~ RD7。在编辑C 程序时,要访问上述端口的某个位,必须先把这一位的地址确定下来, 这可通过@add(address) 结构和bit 关键字来实现,其中@是地址标识符、add(address) 是绝对地址。利用上述地址符,可对PIC 单片机端口的位进行定义,尔后便可随意对端口的位进行访问。下面是对PIC16F84A 的PORTB 口进行位定义的语句:

  # dafine PORTBIT ( add , bit ) ( ( unsigned )

  (add)*8+(bit))

  Satic bit PORTB_0@PORTBIT(PORTB,0);//定义PORTB 的0 位

  Satic bit PORTB_1@PORTBIT(PORTB,1)//定义PORTB 的1 位

  ……

  Static bit PORTB_7@PORTBIT(PORTB,7);//定义PORTB 的7 位

  其中“”和”*”符号,在C 语言中是作为按位运算符用的,而8 是指8 位。在编辑PIC 单片机C 程序时,一旦某个端口,如PORTB,定义后, 其对应位(bit) 还可写成RBO、RB1、RB2、RB3…RB7, 以使程序代码简化。

  有关端口位定义后的应用,还可参看《单片机C 语言程序设计(6)》一文中的程序pic06.c。

  4. LED 数码显示函数的应用

  下面以倒计数、倒计时C 程序实例, 说明LED 数码显示函数display(x) 的应用。

  (1)硬件电路利用PIC16F84A 的4 位LED 数码显示电路( 参见《单片机C 语言程序设计(4)》一文中的图3、图4) 制作2 位数码管(另两位不用)的99 ~ 0 倒计数、倒计时显示。倒计数以秒为单位,倒计时以分为单位,只要有显示函数display(),其计数、计时程序的格式相同。

  (2) 99 ~ 0(以分钟计)的C 源程序清单如下,程序名为pic13.c。

  #includepic.h> // 头文件

  # define PORTAIT ( add , bit ) ( ( unsigned )

  (add)*8+(bit))

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

  //PORTA 口位定义

  static bit PORT_3 @PORTAIT(PORTA,3);

  static bit PORT_4 @PORTAIT(PORTA,4);

  unsigned int x=0; // 无符号的整形变量

  void delay(unsigned long int k )

  // 延时函数开始

  {

  unsigned long int i; // 说明语句

  for(i=0;i=k;i++) //for 执行语句

  continue; // 继续循环

  }

  void display(unsigned int x)

  // 数码管LED 显示函数

  {

  unsigned int d=5700,unit_bit,ten_bit;

  // 无符号整型变量D,个位、十位

  unsigned char SEG7[10]={0xc0,0xf9,0xa4,

  //0 ~ 9 的7 段码数组

  0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  unit_bit=x%10; //picc 可识别个位数

  ten_bit=x/10%10; //picc 可识别十位数

  while(d>0) //while 语句开始

  {

  PORTA=0x1F;

  //PORTA 口的低位输出高电平

  PORTB=SEG7[unit_bit];

  // 个位字段码数组送B 口

  RA3=0; //RA3 赋值0,LED 个位显示

  delay(200); // 延时以便观察

  RA3=1; //RA3 赋值1,LED 个位数灭

  delay(2); // 短延时

  PORTB=SEG7[ten_bit];

  // 十位字段码数组送B 口

  RA2=0; //RA2 赋值0,LED 十位数显示

  delay(200); // 延时以使观察

  RA2=1; //RA2 赋值1,LED 十位数灭

  delay(2); // 短延时

  d--; //d 自减量

  }

  }

  void main( ) // 主函数开始

  {

  TRISB=0x00; //B 口全为输出

  TRISA=0x10; //A 口低4 位为输出

  PORTB=0x40; // 给B 口低位输出0

  INTCON=0x00; // 关闭所有中断

  PORTA=0x10; //A 口低位输出0

  x=99; // 给整形变量x 赋值99

  while(RA4) // 显示起动信号

  {; //RA4 为0,计时开始

  }

  while(1) // while 循环语句开始

  {

  display(x); // 调用显示函数

  x--; //x 自减

  if(x==-1) // 若x 自减到-1

  x=99; // 给x 赋值99

  }

  }

  说明:a. 对上述的C 源程序,只需将显示函数display(x) 中的无符号整型变量d(unsignedint d) 从5700 改为95,即可变成以秒为单位的99 ~ 0 倒计数程序,因为d 值决定了数码管显示的个位时间 ( 具有唯一性)。

  b. 若要使用上述程序, 且对计时( 分或秒)的精度有严格要求时,可对整型变量d 值(57000)以标准时钟为准进行微调,以实现高精度的分或秒定时。

  c. 上述所有PIC 单片机的C 源程序,都是可执行的, 初学者可放心使用。

  5. 关于PIC 单片机c 语言程序SIM 软件仿真的问题

  在《单片机C 语言程序设计(11)》、《单片机C 语言程序设计(12)》中,详细介绍了C 程序的SIM 软件仿真过程。软件仿真对初学者编辑PIC 单片机C 语言程序十分有用, 利用它不仅可以观察到程序运行过程,而且可以发现程序中的问题,即使是已掌握了PIC 编程技术的专业人员,也常通过SIM 软件仿真来找出程序中的问题。

  结束语

上面介绍的延时函数的三

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top