EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 726|回复: 1

[资料共享] 8位共阳数码管74HC595芯片AVR单片机控制 proteus仿真及源码

[复制链接]

47

主题

3

回帖

430

E币

技术员

Rank: 2

积分
97
发表于 2017-5-15 16:43:59 | 显示全部楼层 |阅读模式
捕获.PNG

单片机源程序:
  1. /*
  2. * smg8_avr.h
  3. *
  4. * Created: 2017/3/16 1:54:20
  5. *  Author: lyl
  6. */

  7. #ifndef SMG8_AVR_H_
  8. #define SMG8_AVR_H_

  9. #include "lyl_avr.h"
  10. //数码管端口定义
  11. #define smgPORT PORTA
  12. #define smgPORT_DDR DDRA

  13. #define DS PA5//串行数据输入端口
  14. #define SHCP PA6//为移位寄存器的时钟脉冲输入口
  15. #define STCP PA7//为存储寄存器的时钟脉冲输入口
  16. //OE为输出使能端口,低电平有效,已直接接地

  17. void smgPortInit(void);//数码管端口初始化
  18. void smg74HC595_WriteByte(uchar ucData);        //向74HC595发送一个数据
  19. void smgDisplay(uchar bitCode,uchar segCode,uchar dp);        //在数码管的某一位上显示某一个字符

  20. //共阳数码管的编码,并将数据定义在CODE区
  21. const uchar SMG_SEG_CODE[18]={//共阳数码管的段码编码,并将数据定义在CODE区
  22.                                                         0xc0,/*0*/
  23.                                                         0xF9,/*1*/
  24.                                                         0xA4,/*2*/
  25.                                                         0xB0,/*3*/
  26.                                                         0x99,/*4*/
  27.                                                         0x92,/*5*/
  28.                                                         0x82,/*6*/
  29.                                                         0xF8,/*7*/
  30.                                                         0x80,/*8*/
  31.                                                         0x90,/*9*/
  32.                                                         0x88,/*A=10*/
  33.                                                         0x83,/*b=11*/
  34.                                                         0xC6,/*C=12*/
  35.                                                         0xA1,/*d=13*/
  36.                                                         0x86,/*E=14*/
  37.                                                         0x8E,/*F=15*/
  38.                                                         0xFF,/*不显示=16*/
  39.                                                         0xBF,/*横杆“-”=17*/
  40.                                                         };
  41. //数码管的位选择编码
  42. const uchar SMG_BIT_CODE[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  43. #define SMG8_SetDS()        setbit(smgPORT,DS)
  44. #define SMG8_ClrDS()        clrbit(smgPORT,DS)        //数据引脚

  45. #define smgSTCP_SET()        setbit(smgPORT,STCP)
  46. #define smgSTCP_CLR()        clrbit(smgPORT,STCP)        //上升沿更新数据

  47. #define smgSHCP_SET()        setbit(smgPORT,SHCP)
  48. #define smgSHCP_CLR()        clrbit(smgPORT,SHCP)        //上升沿移入数据

  49. #define smgDS_SET()        setbit(smgPORT,DS)
  50. #define smgDS_CLR()        clrbit(smgPORT,DS)        //数据引脚


  51. /************************************************************************/
  52. /* 函数名称:smgPortInit
  53.    函数功能:初始化8位共阳数码管的数据端口
  54.    入口参数:无
  55.    返回值:无                                                            */
  56. /************************************************************************/
  57. void smgPortInit(void){
  58.     smgPORT|=((1<<DS)|(1<<SHCP)|(1<<STCP));//初值为高电平
  59.     smgPORT_DDR|=((1<<DS)|(1<<SHCP)|(1<<STCP));//数码管端口设置为输出模式
  60. }

  61. /************************************************************************/
  62. /*函数名称:smg74HC595_WriteByte
  63.   函数功能:向74HC595发送一个字节数据
  64.   入口参数:ucData-要发送的数据
  65.   返回值:无                                                             */
  66. /************************************************************************/
  67. void smg74HC595_WriteByte(uchar ucData){
  68.     for(uchar i = 0 ;i < 8;i++){//高位在前低位在后
  69.         if((ucData & (0x80>>i)) != 0) smgDS_SET(); else smgDS_CLR();
  70.         
  71.         smgSHCP_CLR();
  72.         smgSHCP_SET();//SHCP引脚的上升沿移入数据
  73.                 _delay_us(10);
  74.     }
  75. }

  76. /************************************************************************/
  77. /*函数名称:smgDisplay
  78.   函数功能:在8位共阳数码管的指定位置上显示一个字符
  79.   入口参数:bitCode-位选择码,即选择要在哪位数码管上显示数据
  80.                  :segCode-数据段码选择,即要显示什么数据
  81.                  :dp-当dp取值不等于0时,数码管将显示后面的小圆点
  82.   返回值:无                                                             */
  83. /************************************************************************/
  84. void smgDisplay(uchar bitCode,uchar segCode,uchar dp){//在数码管的某一位上显示某一个字符
  85.     uchar a;
  86.         if(dp==0) a=0x00; else a=0x80;
  87.         smg74HC595_WriteByte(SMG_BIT_CODE[bitCode]);  //显示在哪一个数码管上
  88.     smg74HC595_WriteByte(SMG_SEG_CODE[segCode]-a);  //显示的数据
  89.     smgSTCP_CLR();
  90.    
  91. …………限于本文篇幅 余下代码请从论坛下载附件…………
复制代码


下载:
8位共阳数码管74HC595芯片AVR单片机控制.7z (71.49 KB, 下载次数: 0)
积分规则
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-19 17:48 , Processed in 0.046306 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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