数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 6362|回复: 31

[C51] 单片机I/O口无序直驱LED数码管程序分享

[复制链接]
发表于 2021-9-14 23:19:52 | 显示全部楼层
广东梁百万 发表于 2021-9-11 22:34
下面这个是我年初针对STC8G1K17   SOP-20 +  LCD1602写的程序(部分),就是用不是同一组的I/O口拼成一组8 ...

这是基本常识了,keilC51的变前面可以加data idata xdata bdata,各修饰有各自的用处,keilC51的帮助有说明的。
但是不建议这样写,这样只能用在keilC51上面,换了IDE或芯片内核就用不了,建议使用共用体union,标准C编译器都支持。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-15 12:29:42 | 显示全部楼层
iritwq 发表于 2021-9-15 09:20
初学者真是举步维艰呀,复制的代码一个没动,编译时到处出问题

你写的不对,不是这样的。
回复 支持 反对

使用道具 举报

发表于 2021-9-15 12:40:58 | 显示全部楼层

  1. #include "reg52.h"

  2. typedef union
  3. {
  4.     unsigned char val;
  5.     struct
  6.     {
  7.         unsigned char bit_0 : 1;
  8.         unsigned char bit_1 : 1;
  9.         unsigned char bit_2 : 1;
  10.         unsigned char bit_3 : 1;
  11.         unsigned char bit_4 : 1;
  12.         unsigned char bit_5 : 1;
  13.         unsigned char bit_6 : 1;
  14.         unsigned char bit_7 : 1;
  15.     } bit_n;
  16. } un_8;

  17. un_8 un8;

  18. void main(void)
  19. {
  20.     un8.val = 0xFF;
  21.     un8.bit_n.bit_0 = 0;
  22.     un8.bit_n.bit_1 = 1;
  23.     un8.bit_n.bit_2 = 0;
  24.     un8.bit_n.bit_3 = 1;
  25.     un8.bit_n.bit_4 = 0;
  26.     un8.bit_n.bit_5 = 1;
  27.     un8.bit_n.bit_6 = 0;
  28.     un8.bit_n.bit_7 = 1;
  29.     while (1)
  30.     {
  31.         un8.val++;
  32.     }
  33. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2021-9-15 12:41:43 | 显示全部楼层
iritwq 发表于 2021-9-15 09:20
初学者真是举步维艰呀,复制的代码一个没动,编译时到处出问题

你看一下11楼,我没有写注释,应该能看懂吧。
回复 支持 反对

使用道具 举报

发表于 2021-9-15 12:52:56 | 显示全部楼层
本帖最后由 595953427@qq 于 2021-9-15 13:13 编辑

仔细看一下有没有使用bdata的区别。
bdata是好用,但是也有限制的,bdata只有16个字节。
16个字节,每个字节8位,一共128位,你在程序里面定义的bit型变量也包含在这128位里面。
bdata虽好,数量有限,且用且珍惜。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2021-9-15 12:58:12 | 显示全部楼层
还是vs code看着舒服。
墙裂建议使用vs code,使用结构体,共用体的时候代码提示会非常方便。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2021-9-15 13:02:04 | 显示全部楼层
慕名而来 发表于 2021-9-12 10:01
多谢你的经验分享,以前有了解过bdata数据类型,多是在ILI9431彩屏驱动等例程中用到,但我没有用过,如果 ...

你这个代码排版也太不友好了,建议使用vs code,按下快捷键alt + shift + F,会给你整理好排版。
回复 支持 反对

使用道具 举报

发表于 2021-9-15 13:17:33 | 显示全部楼层
同样的代码使用Keil4编译结果和Keil5编译结果相差这么大?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2021-9-15 15:10:26 | 显示全部楼层
iritwq 发表于 2021-9-15 09:09
http://c.biancheng.net/cpp/html/2932.html我在这里看到一个介绍,看的云里雾里的,感觉不到这种方法有 ...

共用体还有个作用很方便,就是要把float类型的数据保存到eeprom,或者UART通讯的时候传输float类型的数据,用共用体会很方便。
回复 支持 反对

使用道具 举报

发表于 2021-9-15 15:11:43 | 显示全部楼层
iritwq 发表于 2021-9-15 09:20
初学者真是举步维艰呀,复制的代码一个没动,编译时到处出问题

你这样肯定是编译不通过的,变量名不可以使用关键字。data在keilC51里面是关键字,不能用作变量名。
回复 支持 反对

使用道具 举报

发表于 2021-9-15 23:56:36 | 显示全部楼层
iritwq 发表于 2021-9-15 17:08
改成这样编译倒是通过了,但是不知道怎样才能出来运行的结果

你在单片机上用过printf吗?需要配合串口使用的,通过串口打印。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-20 23:45 , Processed in 0.109200 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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