单片机数码管显示自行车里程c语言,单片机按下键盘在数码管显示相应数字 源程序 原理图与Proteus仿真 代码注释详细...

//#include

# include

# define uchar unsigned char

# define uint32 unsigned long int

# define sint32 signed long int

# define vtime        3000   //定时3ms,一帧8*3=24ms,频率=40Hz

//数码管位选循环变量

uchar        wi=0;

//共阴数码管段码表

uchar code distable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00,0x40,0x31};

//位选码表

uchar  code numi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//显示缓存

uchar V_ram[]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};

void dispsum();

void delay(uchar);

uchar scan_key();

main()                                                 //m1:m0  00=标准;   01=推挽;   10=输入;   11=开漏输出

{

uchar        j=0,i=0,key_V=0;

//m1:m0  00=标准;   01=推挽;   10=输入;   11=开漏输出

P1M1 = 0X0f;

P1M0 = 0XF0;        //设定低4位为输入,高4位为输出

P0M1 = 0X00;

P0M0 = 0Xff;

P2M1 = 0X00;

P2M0 = 0Xff; //设定P0,P2推挽输出

TMOD = 0X01; //设定定时器0为16位计数方式

TH0 = (65536-vtime )/256;

TL0 = (65536-vtime )%256; //赋定时器0初值

ET0 = 1;  //开定时器0中断

EA = 1;          //开总中断

TR0 = 1;  //启动定时器0计数

//sum=123456;

while(1)

{

key_V=scan_key();

//dispsum();

if(key_V)

{

//有键按下

key_V--;

if(i==8)  //如果显示缓冲满了

{

i=7;

for(j=0;j<7;j++)

V_ram[j]=V_ram[j+1];//显示缓存串行移位

}

V_ram[i]=key_V;          //键值放入显示缓存

i++;

delay(200);//延时去抖

}

}

}

void t0_isp() interrupt 1

{

uchar dm,wx;

TH0 = (65536-vtime )/256;

TL0 = (65536-vtime )%256; //赋定时器0初值

dm=distable[V_ram[wi]];        //取显示段码

wx=numi[wi];                           //取位选码

P2=0x00;                           //关显示

P0=dm;                                   //段码赋给P0口

P2=wx;

wi++;

if(wi==8)wi=0;

}

/

uchar         scan_key()

{

uchar        i,j,vlume=0,temp[4]={0xef,0xdf,0xbf,0x7f};

for(j=0;j<4;j++)

{

P1=temp[j];

i=P1|0xf0;

if(i != 0xff) //判断按键

{        //有键按下

i=~i;

if(i==4)i=3;

if(i==8)i=4;

i--;  // 计算按键所在行号(0--3)

vlume=i*4+j+1;        //计算键值

//delay(200);//延时去抖

}

…………限于本文篇幅 余下代码请从51黑下载附件…………

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值