我写了一个关于AVRmega8键盘检测的C程序,但总是调试不出来,单片机上的数码管无任何显示,请教各位大侠。
c程如下:#include<iom8v.h>#include<macros.h>#defineuintunsignedint#defineucharunsignedcha...
c程如下:
#include<iom8v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
const table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0};
void delay_us(uint time)
{
while(time--)
{
NOP();NOP();NOP();NOP();
}
}
void delay_ms(uint time)
{
while(time--)
{
delay_us(100);
}
}
uchar key_press()
{
uchar j;
DDRC|=0X0F;
PORTC|=0X0F;
DDRC&=0XF0;
j=PINC;
j&=0X0F;
if(j==0X0F)
return 0;
else
return 1;
}
uchar key_scan()
{
uchar key;
delay_ms(10);
if(key_press())
{
key=PINC;
key&=0X0F;
switch(key)
{
case 0X0E:key=1;break;
case 0X0D:key=2;break;
case 0X0B:key=3;break;
case 0X07:key=4;break;
default:key=10;break;
}
while(key_press());
}
else
{
key=10;
}
return key;
}
void show(uint l)
{
PORTB=0XFF;
PORTD=table[l];
PORTB=0XFE;
delay_ms(1000);
PORTD=0X00;
}
void main ()
{
uchar i,k;
DDRD=0XFF;
DDRB=0XFF;
while(1)
{
i=key_press();
if(i)
{
k=key_scan();
show(k);
}
}
}
先谢过了! 展开
#include<iom8v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
const table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0};
void delay_us(uint time)
{
while(time--)
{
NOP();NOP();NOP();NOP();
}
}
void delay_ms(uint time)
{
while(time--)
{
delay_us(100);
}
}
uchar key_press()
{
uchar j;
DDRC|=0X0F;
PORTC|=0X0F;
DDRC&=0XF0;
j=PINC;
j&=0X0F;
if(j==0X0F)
return 0;
else
return 1;
}
uchar key_scan()
{
uchar key;
delay_ms(10);
if(key_press())
{
key=PINC;
key&=0X0F;
switch(key)
{
case 0X0E:key=1;break;
case 0X0D:key=2;break;
case 0X0B:key=3;break;
case 0X07:key=4;break;
default:key=10;break;
}
while(key_press());
}
else
{
key=10;
}
return key;
}
void show(uint l)
{
PORTB=0XFF;
PORTD=table[l];
PORTB=0XFE;
delay_ms(1000);
PORTD=0X00;
}
void main ()
{
uchar i,k;
DDRD=0XFF;
DDRB=0XFF;
while(1)
{
i=key_press();
if(i)
{
k=key_scan();
show(k);
}
}
}
先谢过了! 展开
1个回答
2011-08-22
展开全部
//秒表的设定
#include<iom16v.h>
#define uint unsigned int
#define uchar unsigned char
#define display_data PORTC //数码管数据口
#define display_contrl PORTD //数码管控制口
uchar x[10]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管段码值
0x92,0x82,0xf8,0x80,0x90};
uint m=0,n=0,k=0;
//延时子程序
void delay(uint m)
{
for(;m>0;m--);
}
//中断服务子程序
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0=0xf1; //重新加载计数初值
k++;
}
//主程序
void main()
{
PORTA=0xff; //端口初始化
PORTB=0xff;
PORTC=0xff;
PORTD=0xff;
DDRA=0xff;
DDRB=0xff;
DDRC=0xff;
DDRD=0xff;
TCNT0=0xf1; //计数初值(计数溢出时为1ms并产生中断)
TCCR0=0x03; //选择64分频
TIMSK=0x01; //开timer0中断允许
SREG=0x80; //开总中断允许
while(1)
{
display_contrl=0x01;
display_data=x[m];
delay(50);
display_contrl=0x02;
display_data=x[n];
delay(50);
if(k==1000) //循环中断1000次,1s=1ms*1000
{
n++;
k=0;
if(n>9)
{
m++;
n=0;
if(m>5)
m=0;
}
}
}
}
这完全出自本人手笔,介绍的还算详尽吧,可能是60秒的计时,你看懂了自己改成99的吧,这样你才能学到东西!加油哥们!这点小东西还要上网... 对了这个用的是内部晶振1MHz
#include<iom16v.h>
#define uint unsigned int
#define uchar unsigned char
#define display_data PORTC //数码管数据口
#define display_contrl PORTD //数码管控制口
uchar x[10]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管段码值
0x92,0x82,0xf8,0x80,0x90};
uint m=0,n=0,k=0;
//延时子程序
void delay(uint m)
{
for(;m>0;m--);
}
//中断服务子程序
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0=0xf1; //重新加载计数初值
k++;
}
//主程序
void main()
{
PORTA=0xff; //端口初始化
PORTB=0xff;
PORTC=0xff;
PORTD=0xff;
DDRA=0xff;
DDRB=0xff;
DDRC=0xff;
DDRD=0xff;
TCNT0=0xf1; //计数初值(计数溢出时为1ms并产生中断)
TCCR0=0x03; //选择64分频
TIMSK=0x01; //开timer0中断允许
SREG=0x80; //开总中断允许
while(1)
{
display_contrl=0x01;
display_data=x[m];
delay(50);
display_contrl=0x02;
display_data=x[n];
delay(50);
if(k==1000) //循环中断1000次,1s=1ms*1000
{
n++;
k=0;
if(n>9)
{
m++;
n=0;
if(m>5)
m=0;
}
}
}
}
这完全出自本人手笔,介绍的还算详尽吧,可能是60秒的计时,你看懂了自己改成99的吧,这样你才能学到东西!加油哥们!这点小东西还要上网... 对了这个用的是内部晶振1MHz
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询