/********************************************************
程序名称:数码管手动计数0~9999
编译环境:CVAVR / 基于AVR
硬件对象:XY900_USB型学习开发系统板
实验描述:ATmega8515
PA端口输出显示,PD3/PD4控制段/位选,PD5为按键
月夜听风 mcusy_cn@126.com http://www.mcusy.cn
********************************************************/
#include <mega8515.h>
#include <delay.h>
#define uint unsigned int
#define uchar unsigned char
#define duan PORTD.3 //定义段选
#define wei PORTD.4 //定义位选
uchar table_d[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90,0x00};// 0~9的段码
uchar table_w[]=
{0x02,0x01,0x08,0x04,0x20,0x10,0x80,0x40,0xff};//8个位码表
uint count,q,b,s,g; //计数器,千,百,十,个
//-------------------------------------------------------
void number(void) //计数值分离
{
q = count/1000; //提取千
b = count/100%10; //提取百
s = count/10%10;//提取十
g = count%10; //提取个
}
//-------------------------------------------------------
void display(void) //显示子函数
{
uchar t;
for(t=0;t<=10;t++)//扫描速度
{
number();
duan=1;PORTA=table_d[q];duan=0;//显示千位
wei=1;PORTA=table_w[4];wei=0;//选通第4个显示
delay_ms(2); //1ms
duan=1;PORTA=table_d[b];duan=0;//显示百位
wei=1;PORTA=table_w[5];wei=0;//选通5个显示
delay_ms(2);
duan=1;PORTA=table_d[s];duan=0;//显示十位
wei=1;PORTA=table_w[6];wei=0;//选通第6个显示
delay_ms(2);
duan=1;PORTA=table_d[g];duan=0;//显示个位
wei=1;PORTA=table_w[7];wei=0;//选通7个显示
delay_ms(2);
}
}
//-------------------------------------------------------
void main(void) //主函数
{
DDRA = 0xff; PORTA = 0xff;
DDRD = 0xff; PORTD.5 = 1;
while(1)//循环
{
if(PIND.5 != 1) //按下了PD5键?
delay_ms(5);
if(PIND.5 != 1)
{
display();
count ++; //数加1
if(count == 10000) //是否计满了1万?
count = 0; //清零
}
display();
}
}