找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1526|回复: 7
收起左侧

关于C语言&运算的问题

[复制链接]
ID:908996 发表于 2021-5-14 14:34 | 显示全部楼层 |阅读模式
我的代码如下:

sbit COW_1641 = P0^0;

unsigned char temp=0x7E;

printf("  temp  = 0x%X \n",  temp);

COW_1641=temp&0x80;

printf(" COW_1641 = 0x%X \n",COW_1641);


temp<<=1;

printf("temp <<1  = 0x%X \n",temp);

现在输出的结果是:
temp  = 0x7E00
COW_1641 = 0x7E00
temp <<1  = 0xFC00

我的问题是COW_1641输出的值为什么是0X7E,经过&运算后不应该是0x00吗?
回复

使用道具 举报

ID:332214 发表于 2021-5-14 17:44 | 显示全部楼层
不知道你那边啥问题 0x80是P0的指针地址,你声明的COW_1641其实地址是0x81,你后面的操作 是想给这个引脚置高 还是 置低?或者你想对P0所有管脚移位操作?
回复

使用道具 举报

ID:908996 发表于 2021-5-14 23:53 | 显示全部楼层
啊哈哈123 发表于 2021-5-14 17:44
不知道你那边啥问题 0x80是P0的指针地址,你声明的COW_1641其实地址是0x81,你后面的操作 是想给这个引脚置 ...

我的电路图如下:


8*8的行共阳点阵,74ls164驱动行,74hc154驱动列。164得到数据后,154导通,该列指定的led亮。目前给的数据是0x7e,就是一行里中间6个led亮,两边的led不亮。
代码如下:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>

#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n)    (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n)    (*((volatile unsigned long *)(0xE0000000+4*n)))

#define DEMCR       (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA       0x01000000

char putchar(char s)
{
    SBUF=s;
   while(TI==0)
   {
      _nop_();
   }
   TI=0;

}

sbit COW_1641 = P0^0;  
//sbit COW_1642 = P0^2;
sbit CLK_1641 = P0^1;  
sbit CLK_1642 = P0^3;
sbit CLE_1641 = P0^2;

unsigned char colcount[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

unsigned char code image[8] = {0x00,0x00,0x7E,0x50,0x50,0x50,0x00,0x00};

unsigned char i = 0;   //动态扫描的索引
unsigned int cnt = 0;  //记录 T0 中断次数
unsigned char flag1s = 0;  //1 秒定时标志


void delay(unsigned int delay){
        unsigned char i;
        for(;delay>0;delay--)
                for(i=0;i<150;i++);
}


void main(){
        unsigned long sec = 0;  //记录经过的秒数


    TMOD = 0x01;  //设置 T0 为模式 1
    TH0  = 0xFC;  //为 T0 赋初值 0xFC67,定时 1ms
    TL0  = 0x67;
    ET0  = 1;     //使能 T0 中断
    TR0  = 1;     //启动 T0
        while ( 1 ) {


        }
}

/* 定时器 0 中断服务函数 */
void InterruptTimer0() interrupt 1 {
        unsigned int col,coldata,speed;
        unsigned char temp;
    TH0 = 0xFC;  //重新加载初值
    TL0 = 0x67;

    //以下代码完成数码管动态扫描刷新
    for (col=0;col<8;col++){
                P2=col;
                //temp=image[col];
                temp=0x7E;
                printf("col = %u  temp 1 = 0x%X \n", col, temp);
                for(coldata=0;coldata<8;coldata++){
                       printf("coldata = %u  temp&0x80 = 0x%X \n",coldata,temp);
                       CLK_1641 = 0;
                       COW_1641=temp&0x80;
                       printf("coldata = %u  COW_1641 = 0x%X \n",coldata,COW_1641);
                       CLK_1641 = 1;
                       temp<<=1;
                       printf("temp <<1  = 0x%X \n",temp);
               }
        }
}


代码都是网上找的现成的例子。然后再proteus里一步一步运行的时候,显示的效果是一行里有两个相邻的led不亮,而且这两个不亮的led在这行里的位置是随机的,还没有找到规律,运行效果我截图了。

于是我就在程序里用printf输出几个值,看看是哪里的问题。现在的没有找到问题的原因。我的问题如下:
1、这样的运行效果代码哪里有问题,该如何修改?
2、还有就是我原来的问题,COW_1641=temp&0x01运算之后,printf函数输出COW_1641应该是什么值?


LED3.jpg
LED3_1.jpg
LED3_2.jpg
LED3_3.jpg
回复

使用道具 举报

ID:230742 发表于 2021-5-15 00:11 | 显示全部楼层
不明白你是想做什么。
sbit COW_1641 = P0^0;    是定义单片机的一个引脚。
就算是用这个引脚去计算,也要先读一下这个引脚的状态啊,是高,还是底啊。
比如 NEW=COW_1641;
在用NEW去计算啊。
不明白你是研究C语言编程,还是研究单片机编程的。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:917199 发表于 2021-5-15 14:58 | 显示全部楼层
如附图 cw.PNG
回复

使用道具 举报

ID:822755 发表于 2021-5-15 15:16 | 显示全部楼层
因为C51有些特殊,格式化要用%b来修饰char类型
printf("col = %u  temp 1 = 0x%bX \n", col, temp);
回复

使用道具 举报

ID:908996 发表于 2021-5-15 16:07 | 显示全部楼层
KongQuan 发表于 2021-5-15 15:16
因为C51有些特殊,格式化要用%b来修饰char类型
printf("col = %u  temp 1 = 0x%bX \n", col, temp);

加了%b参数后,输出的值就是正常的值了,谢谢!

我设计的效果是一行中间6个led亮,两边的两个led不亮,程序运行起来如前面截图所示,那么各位能否帮我看看代码哪里有问题,要怎么改?  谢谢!!
回复

使用道具 举报

ID:919834 发表于 2021-5-15 17:30 | 显示全部楼层
&运算就是这样。11为1 01 为0  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表