我给你来个程序试试
- #include <pic.h> //调用PIC16F87XA单片机的头文件
- //根据选项,配置字应该如下所示:
- //__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);
- //实际使用中,这样太麻烦,对于默认选项,我们将其忽略掉:
- __CONFIG(HS&WDTDIS&LVPDIS);
- //---------------------------------------
- //数码管字形表,供显示时查询
- const unsigned char LED[10]=
- { //定义表格一定要使用const,这样会做到程序存储区中
- 0B00111111, //"0"的字形表,0x3F
- 0B00000110, //"1"的字形表,0x06
- 0B01011011, //"2"的字形表,0x5B
- 0B01001111, //"3"的字形表,0x4F
- 0B01100110, //"4"的字形表,0x66
- 0B01101101, //"5"的字形表,0x6D
- 0B01111101, //"6"的字形表,0x7D
- 0B00000111, //"7"的字形表,0x07
- 0B01111111, //"8"的字形表,0x7F
- 0B01101111, //"9"的字形表,0x6F
- };
- //---------------------------------------
- //4位数码管相关I/O设置
- #define U5A RB0 //4位数码管单元的U5(74HC138)的A脚接在RB0口上
- #define U5B RB1 //4位数码管单元的U5(74HC138)的B脚接在RB1口上
- #define U5C RB2 //4位数码管单元的U5(74HC138)的C脚接在RB2口上
- //---------------------------------------
- void main(void) //主函数,单片机开机后就是从这个函数开始运行
- {
- unsigned char c=0; //定义一个char型变量,做延时用
- unsigned char d=0; //定义一个char型变量,控制显示位置
- unsigned char e=0; //定义一个char型变量,做延时用
- unsigned int f=9999; //定义一个int型变量,显示内容用,显示内容0-9999
- TRISB=0B11111000; //初始化RB7-RB0的输入输出方向
- TRISD=0B00000000; //初始化RD7-RD0的输入输出方向
- PORTB=0B00000000; //初始化RB7-RB0的数值
- PORTD=0B00000000; //初始化RD7-RD0的数值
- while(1) //死循环,单片机初始化后,将一直运行这个死循环
- {
- for(c=0;c<250;c++);//做一个0-250的循环,不执行其他操作,只为延时
- if(++e>200) //做一个延时,时间到将显示内容加1
- {
- e=0; //清零,为下一次延时做准备
- if(--f<=0) f=9999;//显示内容加1,因为只有4位显示,超过9999后归零
- }
- PORTD=0; //关一次显示,以免显示出鬼影
- if(++d>3) d=0; //先将d加1,然后判断是否大于3,大于3归零
- if(d==0) //如果d=0,显示千位
- {
- U5A=0; //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
- U5B=0; //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
- U5C=0; //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
- PORTD=LED[f/1000]; //将要显示的f的千位提取出来查表后送显示
- }
- else if(d==1) //如果d=1,显示百位
- {
- U5A=1; //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
- U5B=0; //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
- U5C=0; //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
- PORTD=LED[(f%1000)/100]; //将要显示的f的百位提取出来查表后送显示
- }
- else if(d==2) //如果d=2,显示十位
- {
- U5A=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
- U5B=1; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
- U5C=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
- PORTD=LED[(f%100)/10]; //将要显示的f的十位提取出来查表后送显示
- }
- else if(d==3) //如果d=3,显示个位
- {
- U5A=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
- U5B=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
- U5C=0; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
- PORTD=LED[f%10]; //将要显示的f的个位提取出来查表后送显示
- }
- }
- }
复制代码 |