|
刚入门AVR单片机一段时间,感觉资料很少,所以进度很慢,刚才百度到这里来,现上传一个数码管的程序来和大家分享,高手就跳过吧,初学可以下载来做参考
proteus仿真原理图:
单片机源程序:
- /*
- * smg8_avr.h
- *
- * Created: 2017/3/16 1:54:20
- * Author: lyl
- */
- #ifndef SMG8_AVR_H_
- #define SMG8_AVR_H_
- #include "lyl_avr.h"
- //数码管端口定义
- #define smgPORT PORTA
- #define smgPORT_DDR DDRA
- #define DS PA5//串行数据输入端口
- #define SHCP PA6//为移位寄存器的时钟脉冲输入口
- #define STCP PA7//为存储寄存器的时钟脉冲输入口
- //OE为输出使能端口,低电平有效,已直接接地
- void smgPortInit(void);//数码管端口初始化
- void smg74HC595_WriteByte(uchar ucData); //向74HC595发送一个数据
- void smgDisplay(uchar bitCode,uchar segCode,uchar dp); //在数码管的某一位上显示某一个字符
- //共阳数码管的编码,并将数据定义在CODE区
- const uchar SMG_SEG_CODE[18]={//共阳数码管的段码编码,并将数据定义在CODE区
- 0xc0,/*0*/
- 0xF9,/*1*/
- 0xA4,/*2*/
- 0xB0,/*3*/
- 0x99,/*4*/
- 0x92,/*5*/
- 0x82,/*6*/
- 0xF8,/*7*/
- 0x80,/*8*/
- 0x90,/*9*/
- 0x88,/*A=10*/
- 0x83,/*b=11*/
- 0xC6,/*C=12*/
- 0xA1,/*d=13*/
- 0x86,/*E=14*/
- 0x8E,/*F=15*/
- 0xFF,/*不显示=16*/
- 0xBF,/*横杆“-”=17*/
- };
- //数码管的位选择编码
- const uchar SMG_BIT_CODE[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- #define SMG8_SetDS() setbit(smgPORT,DS)
- #define SMG8_ClrDS() clrbit(smgPORT,DS) //数据引脚
- #define smgSTCP_SET() setbit(smgPORT,STCP)
- #define smgSTCP_CLR() clrbit(smgPORT,STCP) //上升沿更新数据
- #define smgSHCP_SET() setbit(smgPORT,SHCP)
- #define smgSHCP_CLR() clrbit(smgPORT,SHCP) //上升沿移入数据
- #define smgDS_SET() setbit(smgPORT,DS)
- #define smgDS_CLR() clrbit(smgPORT,DS) //数据引脚
- /************************************************************************/
- /* 函数名称:smgPortInit
- 函数功能:初始化8位共阳数码管的数据端口
- 入口参数:无
- 返回值:无 */
- /************************************************************************/
- void smgPortInit(void){
- smgPORT|=((1<<DS)|(1<<SHCP)|(1<<STCP));//初值为高电平
- smgPORT_DDR|=((1<<DS)|(1<<SHCP)|(1<<STCP));//数码管端口设置为输出模式
- }
- /************************************************************************/
- /*函数名称:smg74HC595_WriteByte
- 函数功能:向74HC595发送一个字节数据
- 入口参数:ucData-要发送的数据
- 返回值:无 */
- /************************************************************************/
- void smg74HC595_WriteByte(uchar ucData){
- for(uchar i = 0 ;i < 8;i++){//高位在前低位在后
- if((ucData & (0x80>>i)) != 0) smgDS_SET(); else smgDS_CLR();
-
- smgSHCP_CLR();
- smgSHCP_SET();//SHCP引脚的上升沿移入数据
- _delay_us(10);
- }
- }
- /************************************************************************/
- /*函数名称:smgDisplay
- 函数功能:在8位共阳数码管的指定位置上显示一个字符
- 入口参数:bitCode-位选择码,即选择要在哪位数码管上显示数据
- :segCode-数据段码选择,即要显示什么数据
- :dp-当dp取值不等于0时,数码管将显示后面的小圆点
- 返回值:无 */
- /************************************************************************/
- void smgDisplay(uchar bitCode,uchar segCode,uchar dp){//在数码管的某一位上显示某一个字符
- uchar a;
- if(dp==0) a=0x00; else a=0x80;
- smg74HC595_WriteByte(SMG_BIT_CODE[bitCode]); //显示在哪一个数码管上
- smg74HC595_WriteByte(SMG_SEG_CODE[segCode]-a); //显示的数据
- smgSTCP_CLR();
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
8位共阳数码管74HC595芯片AVR单片机控制.7z
(71.49 KB, 下载次数: 43)
|
|