完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
单片机IO端口不够时,可以使用扩展寄存器,具体随意。本次举例使用74HC164,代码如下:
#include #include #define uchar unsigned char #define uint unsigned int #define CLK_H() PORTB|=BIT(1) #define CLK_L() PORTB&=~BIT(1) #define Dat_H() PORTB|=BIT(0) #define Dat_L() PORTB&=~BIT(0) uchar disp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//段码 uchar buf[3]; //位选 void delay_ms(uint i) { uint a; uchar b; for (a = 0; a < i; a++) { for (b = 1; b; b++) { ; } } } void dataOUT(uchar Dat)//移位寄存器驱动数码管程序 { uchar i; for(i=0;i<8;i++) { CLK_L() //时钟低 if(Dat&0x80) Dat_H(); else Dat_L(); CLK_H(); //时钟高,写入,前面的依次后退一位 Dat<<=1; //8次循环后显示一个数码管值 } } void display(uint num)//动态显示程序 { buf[0]=num/100; PORTB|=1< delay_ms(5); PORTB&=0x00; //关闭位选 buf[1]=num%100/10; PORTB|=1< delay_ms(5); PORTB&=0x00; buf[2]=num%10; PORTB|=1< delay_ms(5); PORTB&=0x00; } void main(void) {uint num; DDRB = 0xFF; while(1) { for(num=0;num<1000;num++){ delay_ms(40); display(num); } } } |
|
相关推荐
2 个讨论
|
|
当然可以用中断刷新数码管,举例如下:
#include #include unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; unsigned int j = 0; unsigned char led3_buf[3]; /*显示信息 /********************************************************************************************* 延时函数 函数说明:软件延时函数,此函数延时单位约为1mS。 晶振频率:CPU内部1M晶振。 带入参数:i无符号整型,变量范围:0-65535。 返回参数:无 *********************************************************************************************/ void delay_ms(unsigned int i) { unsigned int a; unsigned char b; for (a = 1; a < i; a++) { for (b = 1; b; b++) { ; } } } /********************************************************************************************* IO口初始化函数 函数说明:IO口初始化函数,不用的IO口建议设置为输入带上拉。 晶振频率:无关 带入参数:无 返回参数:无 *********************************************************************************************/ void io_init(void) { PORTA = 0xFF; DDRA = 0xFF; /*打开上拉 */ DDRB = 0x00; PORTB = 0xFF; DDRC = 0xCC; PORTC = 0xFF; DDRD = 0x00; PORTD = 0xFF; DDRE = 0x00; PORTE = 0xFF; DDRF = 0x00; PORTF = 0xFF; DDRG = 0x00; PORTG = 0xFF; } void led3_init(void) { TCCR0 = 0x00; TCNT0 = 0xB2; /*计数周期为5mS */ /*比较中断允许 */ TCCR0 = 0x04; TIMSK = 0x01; /*64分频 */ } display() { unsigned char temp; static unsigned char i; PORTC |= (1 << PC2); /*关闭显示 */ PORTC |= (1 << PC3); PORTC |= (1 << PC6); if (i==0) { PORTA =(disp[led3_buf[i]])&0x7F; } /*小数点处理 */ else {PORTA =disp[led3_buf[i]];} /*加载显示值 */ if (i == 0) { /*打开对应位 */ PORTC &= ~(1 << PC6); } if (i == 1) { PORTC &= ~(1 << PC3); } if (i == 2) { PORTC &= ~(1 << PC2); } if (++i >=3) { /*显示位置处理 */ i = 0; } } #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF void timer0_ovf_isr(void) { TCNT0 = 0xB2; //reload counter value display(); } void main(void) { io_init(); led3_init(); SEI(); /*中断使能 */ while (1) { j ++; delay_ms(40); led3_buf[0] = j % 1000/100 ; /*取百位值 */ led3_buf[1] = j % 100/10 ; /*取十位值 */ led3_buf[2] = j % 10; /*取个位值 */ } } |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5182 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7796 浏览 0 评论
3075 浏览 2 评论
3128 浏览 1 评论
10110 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 15:12 , Processed in 0.555337 second(s), Total 47, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号