BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #10037同步于 2009/5/11
Circuit机器人发帖

这个问题不大明白

yy2651592
2009/5/11镜像同步0 回复
前几天写了个程序,再KeilC里看得挺正常的,但下载到单片机里就不行了。今天又重新写了一个,发现好像是IO的使能端控制写在主函数里,在其他函数里调用IO好像实际上没成功,把所有函数都写在主函数里就正常了。 贴两个程序,请大家指点下,后个没写注释,跟前个原理基本上一样 这个是前两天写得错误的程序: //就是要实现在数码管上显示一排会动的数字 #include <stdio.h> #include <stdlib.h> #include <Fx2.h> #include <Fx2regs.h> //用的是cy7c68013单片机,8051内核,输出与51有点不同,大概是IOA就是P0、IOC就是P2,通过OEA和OEC使能 //输出的是8位共阴的7段数码管,带锁存器和上拉电阻的 #define TIME0 50000 unsigned char i,j,k,m,n; unsigned char word[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //字型控制数组 unsigned char wordbuf[] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}; //字位(位选)控制数组 unsigned char word_temp; //用于位移的临时变量 void display(void); //声明输出函数 void main(void) { OEA = 0xff; //控制端A使能 OEC = 0xff; //控制端B使能 TMOD=0x01; //时钟设置 TH0=((65536-TIME0)/256); //时钟设置 TL0=((65536-TIME0)%256); //时钟设置 TR0=1; //时钟使能 EA=1; //时钟使能 ET0=1; //时钟使能 i=0; j=0; n=0; IOA=0xff; while(1); } void time0_int(void) interrupt 1 using 1 //中断函数,在函数里执行显示功能 { TH0=((65536-TIME0)/256); TL0=((65536-TIME0)%256); //时钟复位 i++; //控制位移的标志 if(i==100) //当标志达到100时,把字型数组里的数和要显示的小数点进行位移 { word_temp=word[0]; //实现位移 for(k=0;k<9;k++) { word[k]=word[k+1]; } word[9]=word_temp; if(n<7) n++; //实现小数点位移 else n=0; i=0; //标志的置零 } display(); //执行显示函数 } void display(void) //显示函数 { if(j==n) m=1; //在第n位上显示小数点的实现 else m=0; IOA=word[j]+m*0x80; //输出字型,已经包括了小数点 IOC=wordbuf[j]; //控制字位的输出 if(j<7) j++; //8个数码管上循环扫描 else j=0; } ==================================================== 这个是今天写得正确的: #include<stdio.h> #include<stdlib.h> #include <Fx2.h> #include <Fx2regs.h> #define time 1250 unsigned int i=0,m=0; void main() { unsigned int k=0; unsigned char j,n; unsigned char word[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; OEA = 0xff; OEC = 0xff; TMOD=0x01; TH0=((65536-time)/256); TL0=((65526-time)%256); TR0=1; EA=1; ET0=1; while(1) { if(m==1) { m=0; IOA=word[(i+j)%10]+0x80*(i==n); IOC=~wei[7-i]; k++; if(k==800) { j=(j+1)%8; n=(n+1)%8; k=0; } } } } void to(void) interrupt 1 using 1 { TH0=((65536-time)/256); TL0=((65526-time)%256); m=1; i=(i+1)%8; }
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。