当前位置: 首页 > news >正文

湖北网站建设路网站建设 找客户

湖北网站建设路,网站建设 找客户,上海企业招聘中心官网,无锡市新吴区建设环保局网站一、数码管 1.数码管概况 2.设计 #xff08;1#xff09;硬件设计 我们可以通过阴极控制显示的位置#xff0c;通过阳极控制显示的内容。两个数码管共有8个阴极引脚和16个阳极引脚#xff0c;如果所有引脚都直接接入MCU#xff0c;会造成MCU引脚的极大浪费。 为了节省…一、数码管 1.数码管概况 2.设计 1硬件设计 我们可以通过阴极控制显示的位置通过阳极控制显示的内容。两个数码管共有8个阴极引脚和16个阳极引脚如果所有引脚都直接接入MCU会造成MCU引脚的极大浪费。 为了节省MCU的引脚我们可以将两个数码管的阳极接在一起。 如此我们就有了8个阴极8个阳极16个引脚。我们只需通过8个GPIO引脚就能控制这8位数码管的显示内容了。 既然是八位我们很快想到了38译码器通过三位二进制数字的输入控制八种结果。 由于51单片高电平的驱动能力很微弱不足以点亮数码管因此可以使用74HC245N作为驱动芯片该芯片的用法如下。 有了74HC245之后51单片引脚的输出就只用作信号而驱动数码管的电流则由74HC245的电源提供。 2软件设计 为了实现当前需求需要考虑两点分别是显示位置和显示内容。确定显示位置称为数码管的位选确定显示内容称为数码管的段选。 1》位选 P13  P14 P15控制显示位置连接数码管阴极如果为0低电平就能导通显示。故控制位选。 P13接到了A0P14接到了A1P15接到了A2。 例如果p15-p13输入为000那么与y0相连的1号数码显示。 如果001第二位显示 010第三位显示 011第四位显示 100第五位显示 ······ P17 P16 P15 P14 P13 P12 P11 P10 0      0       1     1      1     0     0       0 P1编码的中三位控制着位选。 2》段选 根据原理图可知数码的段选通过单片机的P00~P07这7个引脚控制具体的对应关系如下。 阳极连接。如果不点亮给0即可。想显示给1即可。 以上显示代表着数字0即给ABCDEF一个高电平1G给0不亮DP给0代表小数点不亮。 所以段选P07高位--P010 0 1 1 1 1 1 1 那么可以给寄存器P0一个值0x3F. 通过p00-p07显示数码管的内容。通过让ABCDEFG、DP的亮灭显示数字。 如此可以得到映射关系表 3》代码实现 要求静态显示在任意位置显示任意数字。 位选决定位置。根据位选的数位决定P13~P15的取值。 段选0~9的数字显示通过P00-P07控制。数字0要让ABCDEF亮起如此编码就为00111111 十六进制0x3F。数字2即为0x5B. 如果让数字在第一个位置亮起P15~P130 0 0 段选好说将数字编码2赋值于P02对应十六进制0X5B即可通过控制数码管显示对应的数字。 位选需要动动脑筋switch能够做到但没有效率。我们用position形参传递的是第几位。假设P1是定义的八位变量P110 101 010,我们要在第4位显示数字那么P15-P13011   position0000 0011现在要做的就是将position的末三位赋值到P1的中三位并不影响P1其他数位上的数字。 所以考虑怎样给到P1的中三位。 P110 101 010 position0000 0 011 为了更好的观察规律先将position左移三位。 P110 101 010 position00 011 000 将P1的中三位置0在与position做或运算。那么先让P1中三位置零就与上11000111其他几位都是11与任何数相与都是原来的数。 那么调整下方法让position左移三位让P111000111在P1与position作或运算。 position3; P111000111;//P10xC7 p1|position; 代码表示为 #include STC89C5xRC.H #define SMG_EN P36 // 数码管总开关 #define LED_EN P34 // LED灯总开关 typedef unsigned char u8; // 给无符号字符类型取别名代表无符号8位 static u8 s_digit_codes[10] {0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F // 9 };//编码数组 //定义函数 void DigitalTube_DisplaySingle(u8 position, u8 num_code)//一个参数位选P13/P14/P15一个参数段选 {P1 0xC7;//按位与运算position 3;P1 | position;P0 num_code;//数字编码赋予P0 } void main() {// 打开数码管总开关SMG_EN 0;// 关闭LED灯总开关LED_EN 0;DigitalTube_DisplaySingle(0, s_digit_codes[2]);//让数字显示在位选0第一个位置显示内容为2while (1) {}; } 烧录以上代码到51核心板内数码管第一个位置显示2就完成了。 4》变量声明 在C89标准中所有声明的变量必须在作用域的最前边声明。C99就没有这个约束了。注意一下即可 二、数码管动态显示 1.要求 我们先搞整数的显示。 2.设计 8位数码管同一时刻只能显示一个位置通过高速的循环显示可以做到以上效果。 1思路 2代码实现 我们首先要定义一个显存数组。 #include STC89C5xRC.H #define SMG_EN P36 // 数码管总开关 #define LED_EN P34 // LED灯总开关 typedef unsigned char u8; // 给无符号字符类型取别名代表无符号8位 typedef unsigned long u32; static u8 s_digit_codes[10] {0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F // 9 };//编码数组 //定义显存数组 u8 buffer[8]; //定义函数 void DigitalTube_DisplaySingle(u8 position, u8 num_code)//一个参数位选P13/P14/P15一个参数段选 {P00x00;P1 0xC7;//按位与运算position 3;P1 | position;P0 num_code;//数字编码赋予P0 } //设置显存数组待展示数字 void DigitalTube_DisplayNum(u32 num) {u8 i;for(i0;i8;i){ buffer[i]0x00;}//将数组内元素都初始化if (num0){buffer[7]s_digit_codes[0];return;}i7;while (num0){buffer[i]s_digit_codes[num%10];num/10;i--;}} //动态扫描 void DigitalTube_Refresh() { u8 i; for ( i 0; i 8; i) {DigitalTube_DisplaySingle(i,buffer[i]); }} void main() {// 打开数码管总开关SMG_EN 0;// 关闭LED灯总开关LED_EN 0;DigitalTube_DisplayNum(12345);while (1) {DigitalTube_Refresh();}; } 上图的效果就实现了。 3实现负数 负数的表示编码为0x40,将之作为段选数组的最后一位codes【10】。 Int_Digital.c #include STC89C5xRC.H #include Int_DigitalTube.h #include Com_Util.h //定义段选内容编码 static u8 codes[11]{0x3F,//00x06,//10x5B,//20x4F,//30x66,//40x6D,//50x7D,//60x07,//70x7F,//80x6F,//90x40//负号 }; //定义显存数组 static buffer[8]; //开关启动 void Int_DigitalTube_Init() {SMG_EN0;LED_EN0; }void Int_DigitalTube_DisplaySingle(u8 dig, u8 num) {P00x00;P10xC7;dig3;P1|dig;P0num; }void Int_DigitalTube_Displaynum(long num) { u8 i; for(i0;i8;i) {buffer[i]0x00; } if(num0) {buffer[7]codes[0];return; } if(num0) {num-num;i7;while(num0){buffer[i]codes[num%10];num/10;i--;}buffer[i]codes[10];Com_Util_Delay1ms(1); }else {i7;while(num0){buffer[i]codes[num%10];num/10;i--;Com_Util_Delay1ms(1);} }}void Int_DigitalTube_Refresh() {u8 i;for(i0;i8;i){Int_DigitalTube_DisplaySingle(i,buffer[i]);} }main.c #include STC89C5xRC.H #include Com_Util.h #include Int_DigitalTube.h void main() {Int_DigitalTube_Init();Int_DigitalTube_Displaynum(-1235);while(1){Int_DigitalTube_Refresh();} } 三、模块化编程 随着我们的代码越来越复杂我们的main.c越来越长阅读性也越来越差。如果将来开始做项目我们可能要同时操作好几个模块这种情况下我们无法再把代码写到同一个文件而是要分模块管理代码。具体实现方法就是将源码按照不同功能和模块拆成若干部分源码再用头文件相互引用。 1.命名规范 变量命名 函数命名 文件命名 2.代码分层规范 1目录 2驱动层 所有与芯片直接交互的自身硬件代码例如GPIO开关、硬件UART/ADC的驱动、计时器等。 目录Dri/ 前缀Dri_ 3接口层 位于驱动层之上通过标准接口驱动的外部硬件代码没有外部硬件设备可以不用这一层。 目录Int/ 前缀Int_ 4中间层 提供更高级的服务如操作系统、文件系统、通信协议栈等。 简单项目用不到这一层。 目录Mid/ 前缀Mid_ 5应用层 包含应用程序的主要逻辑。实现与上层交互不直接访问这一层。 目录App/ 前缀App_ 3.创建项目模板 为方便后续项目的创建可以创建一个基础模板后边项目全部基于模板创建。 1创建一个新的项目取名为模板。 2配置项目 3项目规范结构 4编写通用代码 Com_Util.c #include Com_Util.h #include INTRINS.Hvoid Com_Util_Delay1ms(u16 count) {u8 i, j;while (count 0) {count--;_nop_();i 2;j 199;do {while (--j);} while (--i);} } Com_Util.h #ifndef __COM_UTIL_H__ #define __COM_UTIL_H__typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32;void Com_Util_Delay1ms(u16 count);#endif // !1 5导出模板 下次使用本地模板点开ept文件即可。
http://www.hkea.cn/news/14384486/

相关文章:

  • 邯郸网站建设开发公司网站防止盗图
  • 深圳网站设计公司发展历程软件外包公司有哪些
  • 网站建设的销售术语网站开通
  • 安阳县公共资源交易中心安徽seo网站推广
  • 剧院网站建设做U启的网站
  • 怎样建立网站目录结构如何删除多个wordpress
  • 山东电力建设网站电商网站cms
  • 关键词网站推广优化方案2022版
  • 做视频教学网站服务器配置吉林企业网络推广方法
  • 浙江大经建设集团网站常规做网站要在工信部认证吗
  • 宁国网站开发wordpress架设教程
  • 利用html做博客网站专业做网站建设公司哪家好
  • 南京网站建站公司代理网络设置
  • 二级网站怎么在平台上做推广
  • 企业网站建设的层次开发一个app大概需要多少钱
  • 网站实名认证需要什么wordpress大学主题安装
  • 淘宝特价版金融网站排名优化
  • 建设公司网站需要什么技术下载微信并安装到手机
  • 企业网站的视频页如何做狮山网站设计
  • 做网站用什么字体字号殡葬网站建设
  • 彩票网站开发周期ui网站建设站评价
  • 天水 网站建设网站怎么排版
  • 温州人才网站开发中山环保骏域网站建设专家
  • 网站做301重定向怎么做征二级网站建设意见 通知
  • 网站图片如何做水印安徽省卫生计生网站医共体建设
  • 企业网站建设选题的依据及意义自己电脑做电影网站吗
  • 开发购物网站描述上海 网站 备案
  • h5技术建设网站app费用
  • 2017年做那个网站致富南京app软件开发
  • 推荐10个优秀的国外ui设计网站怎样自己做免费网站