天天看點

avr單片機led數位管六位動态顯示時分秒c語言程式,AVR單片機8位數位管顯示的程式實作(兩種方法介紹)...

描述

本文為大家介紹兩個AVR單片機8位數位管顯示的程式實作。

AVR單片機595驅動8位數位管的顯示的電路實作

主程式代碼

#include >

#include //GCC中的延時函數頭檔案

#include “hc595.h”

//unsigned char Led_Disbuf[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰極

unsigned char Led_Disbuf[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共陽極

unsigned char ComBuf[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//函數聲明

extern void Delayus(unsigned int lus); //us延時函數

extern void Delayms(unsigned int lms); //ms延時函數

int main(void) //GCC中main檔案必須為傳回整形值的函數,沒有參數

{

unsigned char i;

PORTB = 0xff; //PORTB輸出低電平,使LED熄滅

DDRB = 0xFF; //配置端口PB全部為輸出口

HC595_port_init();

while(1)

{

for(i = 0; i < 8;i++)

{

PORTB = Led_Disbuf; //送段碼

HC595_Send_Data(ComBuf); //選通位選端口

Delayus(70); //延時

HC595_Send_Data(0x00); //位選通關閉

}

}

}

//us級别的延時函數

void Delayus(unsigned int lus)

{

while(lus--)

{

_delay_loop_2(4); //_delay_loop_2(1)是延時4個時鐘周期,參數為4則延時16

//個時鐘周期,本實驗用16M晶體,則16個時鐘周期為16/16=1us

}

}

//ms級别的延時函數

void Delayms(unsigned int lms)

{

while(lms--)

{

Delayus(1000); //延時1ms

}

}

avr單片機led數位管六位動态顯示時分秒c語言程式,AVR單片機8位數位管顯示的程式實作(兩種方法介紹)...

子產品化程式設計的.h檔案

下面是本執行個體中子產品化程式設計的.h檔案

#ifndef __HC595_H__

#define __HC595_H__

#include //io端口寄存器配置檔案,必須包含

#include //GCC中的延時函數頭檔案

#define HC595_latch (1 << PG1) //上升沿資料打入8位鎖存器,下降沿鎖存器資料不變

#define HC595_sclk (1 << PG0) //上升沿資料移位,下降沿資料不變

#define HC595_oe (1 << PG4) //低電平,8位資料鎖存器輸出,高電平輸出高組态

#define HC595_data (1 << PG2) //串行資料輸入端

#define SET_HC595_latch (PORTG |= (1 << PG1))

#define CLR_HC595_latch (PORTG &= ~(1 << PG1))

#define SET_HC595_sclk (PORTG |= (1 << PG0))

#define CLR_HC595_sclk (PORTG &= ~(1 << PG0))

#define SET_HC595_data (PORTG |= (1 << PG2))

#define CLR_HC595_data (PORTG &= ~(1 << PG2))

#define SET_HC595_oe (PORTG |= (1 << PG4))

#define CLR_HC595_oe (PORTG &= ~(1 << PG4))

void HC595_port_init(void); //595端口初始化

void HC595_Send_Data(unsigned char byte); //發送一個位元組

void HC595_Output_Data(unsigned char data); //發送字元串

#endif

同時我們将與74HC595相關的函數定義部分放在74HC595.c檔案中,如下

#include “hc595.h”

//595端口初始化

void HC595_port_init(void)

{

PORTG = 0x00;

DDRG |= (1 << PG0) | (1 << PG1) | (1 << PG2) | (1 << PG4);

}

//發送一個位元組

void HC595_Send_Data(unsigned char byte)

{

unsigned char i;

//CLR_HC595_latch;

for(i = 0;i < 8;i++)

{

if(byte & 0x80)

{

SET_HC595_data;

}

else

{

CLR_HC595_data;

}

byte <<=1;

SET_HC595_sclk; //上升沿資料移位

CLR_HC595_sclk;

}

SET_HC595_latch;

CLR_HC595_latch;

}

//發送字元串

void HC595_Output_Data(unsigned char data)

{

CLR_HC595_latch; //下降沿鎖存器資料不變

HC595_Send_Data(data);

SET_HC595_latch; //上升沿資料打入8位鎖存器

}

AVR單片機控制8段LED數位管同時顯示

這是一個簡單的供單片機入門學習者練習用的8段LED數位管控制彙程式設計式,控制一個兩位的數位管同時顯示字元(動态重新整理)。用AVR- Studio-4 開發,在AVR單片機Atmega48上調試通過。學習者可以舉一反三應用到其他類型的單片機晶片。

arget : M48 ;

Crystal: 8.0000Mhz

.include “m48def.inc”

.org $0000 rjmp _main

.org $0020

_port_init:; 端口初始化

clr R2

out 0x5,R2 PortB清零

ldi R24,255

out 0x4,R24 定義PortB為輸出

out 0x8,R2 PortC清零

ldi R24,3

out 0x7,R24 定義PortC.0,Portc.1為輸出

ret

_tabs:;字形定義

.dw 192 0xC0,“0”

.dw 249 0xF9,“1”

.dw 164 0xA4,“2”

.dw 176 0xB0,“3”

.dw 153 0x99,“4”

.dw 146 0x92,“5”

.dw 130 0x82,“6”

.dw 248 0xF8,“7”

.dw 128 0x80,“8”

.dw 152 0x98,“9”

.dw 136 0x88,“A”

.dw 131 0x83,“B”

.dw 198 0xC6,“C”

.dw 161 0xA1,“D”

.dw 134 0x86,“E”

.dw 142 0x8E,“F”

.dw 255 0xFF,“8.”

_delay_1ms: 延時子程

ldi R16,1

ldi R17,0

L3:

subi R16,255 加1操作

sbci R17,255

cpi R16,232 0xE8

ldi R30,3 0x3E8 = 1000

cpc R17,R30

brlo L3 未達1000繼續

ret

_delay:

push r21

push r20

push r17 入口:r16,r17裝的是延時參數

push r16

movw R10,R16 将r16,r17的内容裝入r10,r11

clr R20

clr R21

L8:

rcall _delay_1ms

subi R20,255 加1操作

sbci R21,255

cp R20,R10 與指定延時參數比較

cpc R21,R11

brlo L8 未達指定延時參數繼續

pop r16

pop r17

pop r20

pop r21

ret

_led_display:

push R20 寄存器r20入棧,r20中帶入字元表的索引

ldi R24,2

mul R24,R20 将r20中的值乘2,結果在r0中

movw R30,R0 将r0的值賦給r30,作為偏移量

ldi R24,low(_tabs<<1) 擷取字元表基位址

ldi R25,high(_tabs<<1)

add R30,R24 偏移量+基位址構成z指針

adc R31,R25

lpm R20,Z+0 取字型送入r20 out 0x5,R20 字型送PortB,輸出 ldi R22,0 循環100次計數寄存器r22清零

L10:

ldi R20,1 r20用于8LED數位管輸出位控制,初始為1

L12:

out 0x8,R20 将8LED數位管位控制輸出到端口PortC ldi R16,10 延時參數低位

ldi R17,0 延時參數高位

rcall _delay 調延時子程

inc R20 移位r20,準備顯示另一位

cpi R20,3 判兩位是否顯示完

brlo L12 未顯示完兩位,繼續

inc R22 r22加1

cpi R22,100 判是否已計滿100 brlo L10 未計滿則繼續

pop R20 r20出棧 ret _main:

clr R20 初始化計數寄存器r20 rcall _port_init 初始化端口

L17:

cpi R20,16 比較循環計數

brne L21 未顯示完16個字元繼續

clr R20 從新開始

L21:

rcall _led_display 顯示字元

inc R20 計數值加1

rjmp L17 傳回

ret

打開APP閱讀更多精彩内容

點選閱讀全文