
# include "reg51h" // 包含头文件
#define uchar unsigned char
void delay02s(void) // 延时02s子程序
{
unsigned char i,j,k;
for ( i=2;i>0;i-- )
for (j=200;j>0;j-- )
for (k=250;k>0;k-- );
}
void main (void) // 主函数
{
uchar i,j;
while (1) // 死循环
{
j=0x01; // j初始化为0x01,左移初始值
for(i=0;i<8;i++) // for循环语句,完成8个循环
{
P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出
delay02s( ); // 延时02s
j= j<<1; // 左移1位
}
j=0x80; // 设置右移初始值j为0x80
for (i=0;i<8;i++)
{
P1= ~ j;
delay02s( );
j= j>>1; // 右移1位
}
}
}
#include <reg52h>
#include <intrinsh>
sbit LED7 = P1^7;
sbit LED0 = P1^0;
#define N 1000
//-------------------------------------------------------
//延时Z个ms
//-------------------------------------------------------
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
void main()
{ unsigned int i,j;
while(1)
{
P1 = 0xfc;
for(i=0;i<8;i++) //循环左移
{
P1 =_crol_(P1,2);
delay(N);
}
for(i=0;i<8;i++) //循环右移
{
P1 =_cror_(P1,2);
delay(N);
}
for(i=1;i<=10;i++) //奇、偶交替闪烁10次
{
P1 = 0xaa; //奇数0xaa
delay(N);
P1 = 0x55; //偶数0x55
delay(N);
}
for(j=0;j<8;j++) // 循环左移
{ P1 = 0xfe;
P1 =_crol_(P1,1);
delay(N);
}
for(i=0;i<8;i++) //循环右移
{ P1 = 0x7f;
P1 =_cror_(P1,2);
delay(N);
}
}
}
外部中断,是需要用开关来触发的。
----
你的延时函数,写的有毛病。
编译,根本不过去。
改好后,程序就正常了,可以进入中断。
#include <reg52h>
#include <intrinsh> //启用 循环左移(_crol_),循环右移(_cror_)函数
#define uint unsigned int
#define uchar unsigned char
sbit d1=P1^0; //
char i,m,n,temp,k; //
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xa7,0xa1,0x06,0x8e};
//定义共阳极数码管
void delay(int x) //延时函数
{
uchar i;
while(x--) for(i=0;i<110;i++);
}
void main() //主函数
{
EA=1;
EX0=1;
IT0=0;
while(1) {
for(i=0;i<16;i++) {
P0=table[i]; //数码管显示
delay(500);
}
}
}
void my_int0() interrupt 0 //中断函数
{
temp=0xfe; //定义temp 1111 1110 即 P10 低电平
P1=temp; //让第一个灯点亮
for(k=0;k<3;k++) { //循环3次
for(m=0;m<7;m++) { //左移7次
delay(500);
temp=_crol_(temp,1); //库函数里面的循环左移函数,将temp的值左移一位后重新赋给temp
P1=temp; //将左移一位后的temp值送P1口显示
}
for(n=0;n<7;n++) { //右移7次
delay(500);
temp=_cror_(temp,1); //库函数里面的循环右移函数,将temp的值左移一位后重新赋给temp
P1=temp;
}
}
delay(200);
d1=1; //P10 高电平
}
哥,您看看您的程序,if(P0 == 0x7f)满足也就是说左移循环完成了之后,你就让它右移一位,接下来,延时函数过后戒指break跳出了while循环,而且这个流水灯来回循环也不是这样写的,就算你不用break跳出,等下一次while循环来的时候又是先左移一位,然后又满足if判断,又右移,然后就这么一直左移,,右移
#include <reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
/ 延时函数 /
delay(uint i){while(i--);}
/ 数码管显示子程序开始 /
sbit wr=P2^2;sbit cs1=P2^0;sbit cs2=P2^1;
#define LEDdata P0
uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar buf[8]={7,6,5,4,3,2,1,0}; //显示缓存
display(){
uchar i,j=0x7f;
for(i=0;i<8;i++){
cs1=0;cs2=1; //选中段码锁存IC U3
LEDdata=LEDcode[buf[i]];wr=1;wr=0; //送段码
cs1=1;cs2=0; //选中位选锁存IC U2
LEDdata=j;wr=1;wr=0; //送位选
delay(100); //延时
j=_cror_(j,1); //位选移位
cs1=cs2=0; //选中U2,U3,准备关显示
LEDdata=0xff;wr=1;wr=0; //送0xff,关显示
}
}
/ 数码管显示子程序结束 /
main(){
uchar i,temp,count=0;
while(1){
display(); //显示测试
if(++count==50){
count=0;
temp=buf[0];
for(i=0;i<7;i++)buf[i]=buf[i+1];
buf[7]=temp;
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)