找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1905|回复: 14
打印 上一主题 下一主题
收起左侧

中微单片机CMS89F11x想整一个点亮灯的小程序,编译就报错 附用户手册

[复制链接]
跳转到指定楼层
楼主
ID:656213 发表于 2021-12-3 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中微单片机,型号:CMS89F111 SOP-8,想整一个点亮灯的小程序,居然一直整不好,求助各位老师们能指点一下。 我看规格书里面讲,可以进行位操作,写了一句,P0.2 =1; 但是编译就报错。


#include "cms.h"

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

void main()
{        
        P0CL = 00100000;            //配置IO状态, P0.2口设置为推挽输出
        while(1)
        {        
                P0.2 = 1;
        }               
}

SCH.png (66.45 KB, 下载次数: 113)

SCH.png

1.png (63.48 KB, 下载次数: 110)

1.png

CMS89F11x用户手册_V1.5.pdf

3.07 MB, 下载次数: 13

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-12-3 23:36 | 只看该作者
既然,你选择用  CMS IDE, 而不用KEIL  你就要尊重 CMS IDE 的语法。

P0.2 = 1   在CMS IDE 中是非法的。

在CMS IDE 中。你只能写:    P0 |= 0x04;

而且就算你用 KEIL 也只能用 P0_2 = 1
回复

使用道具 举报

板凳
ID:624769 发表于 2021-12-3 23:44 | 只看该作者

既然,你选择用  CMS IDE, 而不用KEIL  你就要尊重 CMS IDE 的语法。

P0.2 = 1   在CMS IDE 中是非法的。

在CMS IDE 中。你只能写:    P0 |= 0x04;

而且就算你用 KEIL 也只能用 P0_2 = 1


对了,另外,你的 P0CL 的写法也是错误的,你要配置 推挽输出,只能写: P0CL = 0x20;
回复

使用道具 举报

地板
ID:656213 发表于 2021-12-4 08:32 | 只看该作者
真是太感谢你了呀,可以了,我写了个灯闪烁的程序,OK了。

#include "cms.h"

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

void delayms(u16 ms)
{
        u8 i;
                while(ms--)
                {
                        for(i=0;i<120;i++);
                }
}

void main()
{       
        P0CL = 0x20;            //配置IO状态, P0.2口设置为推挽输出
        while(1)
        {       
                 P0 |= 0x04;
                 delayms(600);
                 P0 &= 0x00;
                 delayms(600);
        }               
}
回复

使用道具 举报

5#
ID:624769 发表于 2021-12-4 13:48 | 只看该作者
jiahz2019 发表于 2021-12-4 08:32
真是太感谢你了呀,可以了,我写了个灯闪烁的程序,OK了。

#include "cms.h"

更正一点,
你用P0 &= 0x00; 虽然也能关闭LED, 但是他并不是拉低 P02 而是拉低整个P0, 并且不是“位操作”,你要真正拉低P02,并且是执行 位操作的话,(虽然不知道你为何执着为操作,为了速度?),
只能用这个代码:

P0 &= 0xFB;

用CMS IDE 要学会随时编译,多观察右侧List文件, 确认你代码的编译结果, 你要你的代码是进行位操作,就要察看,右侧编译后,是否出现  SETB   CLRB   SNZB  等,这些标志着是在进行位操作的汇编代码,是的话说明你用的方法对,不是的话,就常尝试修改代码,直到达到你的目的,个人觉得,或许直接用汇编会更方便,反正他汇编指令也没几条。
回复

使用道具 举报

6#
ID:656213 发表于 2021-12-4 14:37 | 只看该作者
本帖最后由 jiahz2019 于 2021-12-4 16:38 编辑

见笑了,用这个P0 &= 0x00纯粹是偷懒,这里我是理解的。另外,对汇编也不熟悉呀,新手,前面只是学习了8051的C,还没有独立做过项目。 现在又遇到了一个问题,想启用按键来控制LED灯的闪烁,之前学8051核的时候,可以直接位操作,取反位就可以了。这里不能直接用位操作了,不知如何下手了,下面是我整的一段,仿真不对,灯一直亮。 请再指教一二。 按键接口如上原理图,

#include "cms.h"

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

void delayms(u16 ms)
{
        u8 i;
                while(ms--)
                {
                        for(i=0;i<120;i++);
                }
}

void main()
{        
        P0CL = 0x20;            //配置IO状态, P0.2口设置为推挽输出
        P1CH = 0x00;            //配置IO状态, P1.4口设置为上拉输入
        u8 key,temp ;
        while(1)
        {
                 temp = P1 ;                     //这个变量类型定义的好像有误
                 if(temp & 0x10 == 0)       // 判断按键是否按下
                 {
                         key++;
                         if(key >= 2)
                          {
                                key = 0;
                          }
                         if(key==0)
                                 {
                                         P0 |= 0x04;
                                         delayms(600);
                                 }
                         if(key==1)
                                 {
                                         P0 &= 0xFB;
                                         delayms(600);
                                 }

                 }
        }        
}
回复

使用道具 举报

7#
ID:624769 发表于 2021-12-4 19:24 来自手机 | 只看该作者
在外面,手机上的51黑,不方便帮你改代码,你现在的代码是,一直按着按键的话,灯会闪,放手灯就会亮着或者灭着一直维持这个状态,这是你设计的初衷么?
回复

使用道具 举报

8#
ID:624769 发表于 2021-12-4 20:39 | 只看该作者
jiahz2019 发表于 2021-12-4 14:37
见笑了,用这个P0 &= 0x00纯粹是偷懒,这里我是理解的。另外,对汇编也不熟悉呀,新手,前面只是学习了8051 ...

好了,上电脑了, 可以打代码,
你这个CMS89F11X系列,不是8051核,是RISC核,所以,有些操作是不支持的,有好处,也有坏处,这也是我建议你要么干脆尝试汇编的原因,因为也就50多条指令,比起8051是少多了,你真心想学的话,看着指令表尝试写写,1天也就入门了。
好了,上面纯属建议,下面:

CMS89F11X  不支持位取反操作,但是,支持字节的与或操作,所以,如果你不是执着需要 “位操作”的话,想要LED闪烁的话,可以用 与或。
P0 ^= 0x04;     就可以翻转 P02 的电平了。
比如你之前的闪灯代码,完全可以这样写:

void main()
{        
        P0CL = 0x20;            //配置IO状态, P0.2口设置为推挽输出
        while(1)
        {        
                 P0 ^= 0x04;
                 delayms(600);
        }               
}

然后,你要检验 P14是否是低电平,不需要复杂的 赋值给 temp, 可以直接检验 P14, 如:
if((P1 & 0x10) == 0)            // 注意看,这里面的括号很重要,你就算用Temp 也需要这个括号,你之前的代码,没有括号,编译完了是肯定不能正常工作的,恩,其他的,应该你自己能搞定了。
回复

使用道具 举报

9#
ID:478073 发表于 2021-12-4 20:54 | 只看该作者
建议多同那些代理的FAE多沟同,他们解决问题干脆直接!
回复

使用道具 举报

10#
ID:656213 发表于 2021-12-4 21:05 | 只看该作者
188610329 发表于 2021-12-4 20:39
好了,上电脑了, 可以打代码,
你这个CMS89F11X系列,不是8051核,是RISC核,所以,有些操作是不支持 ...

呵呵,谢谢你的讲解,我也刚从外面回来,我上面那段程序的本意是想用按键控制灯的亮灭,假如上电状态灯是灭的,那么按一下,灯亮(常亮), 再按一下,灯灭。  你刚才讲的那段程序我现在去试下。
回复

使用道具 举报

11#
ID:656213 发表于 2021-12-4 21:42 | 只看该作者
春风十里吹死你 发表于 2021-12-4 20:54
建议多同那些代理的FAE多沟同,他们解决问题干脆直接!

基础的问题,FAE才懒得搭理人,现在人家还怕没有人买单片机吗,
回复

使用道具 举报

12#
ID:624769 发表于 2021-12-4 21:52 | 只看该作者
jiahz2019 发表于 2021-12-4 21:05
呵呵,谢谢你的讲解,我也刚从外面回来,我上面那段程序的本意是想用按键控制灯的亮灭,假如上电状态灯是 ...

按你的设想,代码如下,不需要 DELAY 函数。

unsigned char stat;

void main()
{
    P0CL  = 0x20;
    P1CH  = 0x00;
        while(1)
        {
                if((P1 & 0x10) == 0)  
                {
                        while((P1 & 0x10) == 0);  //消抖
                        stat++; //更改标志位
                }
        if((stat & 0x01) == 1) P0 |= 0x04;
                else        P0 &= 0xFB;
        }
}
回复

使用道具 举报

13#
ID:624769 发表于 2021-12-4 22:30 | 只看该作者
188610329 发表于 2021-12-4 21:52
按你的设想,代码如下,不需要 DELAY 函数。

unsigned char stat;

感觉不是很简洁,又重新写了一个不需要变量的:


void main()
{
        P0CL = 0x20;
        P1CH = 0x00;
        while(1)
        {
                while(P1 & 0x10);  //等待按键按下
                while(!(P1 & 0x10));  //等待按键弹起               
                P0 ^= 0x04;
        }
}

回复

使用道具 举报

14#
ID:1111466 发表于 2024-2-23 21:05 | 只看该作者
想学习CMS的编程,但是网上找不到相关教程。相对而言51的资料真的好丰富
回复

使用道具 举报

15#
ID:149759 发表于 2024-2-24 11:19 | 只看该作者
P0.2不对
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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