标题:
为什么与p2_0有关的都无定义?
[打印本页]
作者:
1lgy
时间:
2018-1-23 17:25
标题:
为什么与p2_0有关的都无定义?
#include<reg52.h> //包含单片机寄存器的头文件
#define uchar unsigned char
sbit p2_0 = p2^0;
sbit p2_1 = p2^1;
sbit p2_2 = p2^2;
sbit p2_3 = p2^3;
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/* 函数申明 -----------------------------------------------*/
void delay(uint z);
/* 变量定义 ----------------------------------------------*/
sbit key1=P3^5;
sbit key2=P3^4;
sbit key3=P3^3;
sbit key4=P3^2;
void display()
{
uchar m;
for(m=9;m>0;m--)
{
p0=table[m];
p2_0 =0;
delay(2000);
p2_0 = 1;
}
for(m=0;m<10;m++)
{
p0=table[m];
p2_1=0;
delay(2000);
p2_1= 1;
}
for(m=9;m>0;m--)
{
p0=table[m];
p2_2 = 0;
delay(2000);
p2_2 = 1;
}
for(m=0;m<10;m++)
{
p0=table[m];
p2_3 = 0;
delay(2000);
p2_3 = 1;
}
}
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main(void)
{
unsigned int a;
P0 = 0;
for(a=100;a>0;a--)
{
display();
}
while(1) //无限扫描
{
if(key1==0)
{
delay(5); //消抖动
if(key1==0) //确认按键被按下
{
while(!key1);//松手检测
P1=0;
delay(200);
P1=0XFF;
}
}
if(key2==0)
{
delay(5); //消抖动
if(key2==0) //确认按键被按下
{
while(!key2);//松手检测
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
}
}
if(key3==0)
{
delay(5); //消抖动
if(key3==0) //确认按键被按下
{
while(!key3);//松手检测
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
}
}
if(key4==0)
{
delay(5); //消抖动
if(key4==0) //确认按键被按下
{
while(!key4);//松手检测
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
}
}
delay(10);
}
}
/*
********************************************************************************
** 函数名称 : delay(uint z)
** 函数功能 : 延时函数
********************************************************************************
*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
作者:
cccc888
时间:
2018-1-23 18:04
捕获.PNG
(38.46 KB, 下载次数: 49)
下载附件
2018-1-23 18:03 上传
大小写问题
作者:
wulin
时间:
2018-1-23 18:08
字母大小写错误
作者:
HC6800-ES-V2.0
时间:
2018-1-24 10:43
看来你是懂那个“REG52.H”头文件的作用。
看看我翻译的REG51.H的内容:
/*--------------------------------------------------------------------------
REG51.H
Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __REG51_H__
#define __REG51_H__
/* BYTE Register 所有8位寄存器申明*/
sfr P0 = 0x80;//PO口寄存器
sfr P1 = 0x90;//P1口寄存器
sfr P2 = 0xA0;//P2口寄存器
sfr P3 = 0xB0;//P3口寄存器
sfr PSW = 0xD0;//程序状态寄存器
sfr ACC = 0xE0;//累加器(ACC)
sfr B = 0xF0;//寄存器B 主要用于乘、除等操作
sfr SP = 0x81;//栈指针(SP)
sfr DPL = 0x82;//数据指针(DPTR)是一个16 位的特殊功能寄存器,此为低8位
sfr DPH = 0x83;//此为高8位
sfr PCON = 0x87;//程序计数器(PC)用于保存下一条要执行的指令的地址
sfr TCON = 0x88;//TCON 寄存嚣的高4位为定时/计数器控制寄存器,低4位为控制外部中断的中断触发方式选择
sfr TMOD = 0x89;//TMOD 用于控制定时/计数器的工作方式及4 种工作模式
sfr TL0 = 0x8A;//8051 单片机内含有两个16 位定时/计数嚣,这是第一个定时/计数器赋初值的低位
sfr TL1 = 0x8B;//这是第二个定时/计数器赋初值的低位
sfr TH0 = 0x8C;//这是第一个定时/计数器赋初值的高位
sfr TH1 = 0x8D;//这是第二个定时/计数器赋初值的高位
sfr IE = 0xA8;//IE 寄存器用于开放或屏蔽单片机的各个中断源
sfr IP = 0xB8;//通过设置IP 寄存器的相应位对各个中断源的中断优先级
sfr SCON = 0x98;//寄存器用于设置串行口的工作方式
sfr SBUF = 0x99;//串行数据缓冲器
/* BIT Register 所有寄存器的位申明*/
/* PSW *///通过PSW 的各状态位,可以实现程序跳转、多字节运算等功能
sbit CY = 0xD7;//进位标志位,表示在字节运算时发生进位或借位
sbit AC = 0xD6;//辅助进位标志位,当ACC 低4 位发生进位时置位该标志位
sbit F0 = 0xD5;//通用标志位,由用户定义
sbit RS1 = 0xD4;//工作寄存器组选择位
sbit RS0 = 0xD3;
sbit OV = 0xD2;//溢出标志位,表示运算时发生溢出
sbit P = 0xD0;//奇偶校验标志位
/* TCON *///
sbit TF1 = 0x8F;//定时器1中断标志,定时到,计数满,为溢出标志,进入中断服务函数
sbit TR1 = 0x8E;//定时器1开关,1打开,0关闭
sbit TF0 = 0x8D;//定时器0中断标志,定时到,计数满,为溢出标志,进入中断服务函数
sbit TR0 = 0x8C;//定时器0开关,1打开,0关闭
sbit IE1 = 0x8B;//外部中断1中断标志
sbit IT1 = 0x8A;//设置外部中断1的触发方式,0低电平触发,1负跳变触发
sbit IE0 = 0x89;//外部中断0中断标志
sbit IT0 = 0x88;//设置外部中断0的触发方式,0低电平触发,1负跳变触发
/* IE */
sbit EA = 0xAF;//总中断允许位
sbit ES = 0xAC;//串行通讯口中断允许位
sbit ET1 = 0xAB;//定时器1中断允许位
sbit EX1 = 0xAA;//外部中断1允许位
sbit ET0 = 0xA9;//定时器0中断允许位
sbit EX0 = 0xA8;//外部中断0允许位
/* IP */
sbit PS = 0xBC;//串行通讯口中断优先级设置
sbit PT1 = 0xBB;//定时器1中断优先级设置
sbit PX1 = 0xBA;//外部中断1优先级设置
sbit PT0 = 0xB9;//定时器0中断优先级设置
sbit PX0 = 0xB8;//外部中断0优先级设置
/* P3 */
sbit RD = 0xB7;//外部数据存贮器读脉冲
sbit WR = 0xB6;//外部数据存贮器写脉冲
sbit T1 = 0xB5;//定时器1外部输入口
sbit T0 = 0xB4;//定时器0外部输入口
sbit INT1 = 0xB3;//外部中断1输入口
sbit INT0 = 0xB2;//外部中断0输入口
sbit TXD = 0xB1;//串行输出口
sbit RXD = 0xB0;//串行输入口
/* SCON *///寄存器用于设置串行口的工作方式和查询接收、发送中断产生标志
sbit SM0 = 0x9F;//串口通讯的工作方式
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;//多机通讯控制位
sbit REN = 0x9C;//串行通讯接收允许位
sbit TB8 = 0x9B;//用于存放发送的第9位数据
sbit RB8 = 0x9A;//用于存放接收到的第9位数据
sbit TI = 0x99;//发送数据中断标志位,发送结束,硬件置1,发中断请求,要软件复位,一般是在中断服务程序中执行复位操作
sbit RI = 0x98;//接收数据中断标志位,接收结束,硬件置1,发中断请求,要软件复位,一般是在中断服务程序中执行复位操作
#endif
这个头文件定义了I/O口为P0、P1、P2、P3,都是大写的P,你搞个小写的,当然找不到了。
作者:
slcands
时间:
2018-1-24 16:20
一般预定义的都是大写的,C语言是大小写敏感的!!!
作者:
2924958047
时间:
2018-1-25 10:09
大小写出了问题
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1