大学C语言 单片机程序设计 计数器设计大学C语言效果要求:用四个LED表示二进制计数值,开关A每开关一次,计数器加1,并通过LED灯表示出当前值;开关B每开关一次,计数器减1;开关C可实现复位
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/08 20:37:19
大学C语言 单片机程序设计 计数器设计大学C语言效果要求:用四个LED表示二进制计数值,开关A每开关一次,计数器加1,并通过LED灯表示出当前值;开关B每开关一次,计数器减1;开关C可实现复位
大学C语言 单片机程序设计 计数器设计大学C语言效果要求:用四个LED表示二进制计数值,开关A每开关一次,计数器加1,并通过LED灯表示出当前值;开关B每开关一次,计数器减1;开关C可实现复位效果.
大学C语言 单片机程序设计 计数器设计大学C语言效果要求:用四个LED表示二进制计数值,开关A每开关一次,计数器加1,并通过LED灯表示出当前值;开关B每开关一次,计数器减1;开关C可实现复位
//假设三个开关分别接到P1.0、P1.1、P1.2,当按下时IO口为0
#include
unsigned char Led1,Led2,Led3,Led4;
sbit KeyA=P1^0;
sbit KeyB=P1^1;
sbit KeyC=P1^2;
unsigned char LedSegmentTab[]=\x05\x05//定义共阴极数码管
\x05\x05 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
\x05\x05 //0,1 ,2,3,4,5,\x05 6,7 ,8 ,9
void Delay100us(int Times);
\x05\x05
main()
{
\x05int number,temp;\x05\x05\x05//待显数字
\x05number = 0;
\x05Led1 = 0x00;\x05\x05//全显0
\x05Led2 = 0x00;
\x05Led3 = 0x00;
\x05Led4 = 0x00;
\x05//定时器1初始化
\x05TMOD = 0x10;\x05\x05//T1:Gate = 0,不受外部中断信号影响
\x05\x05\x05\x05//\x05 C/T = 0,选择为定时方式
\x05\x05\x05\x05//\x05 M1,M0 = 0,1 构成16位定时器
\x05\x05\x05\x05//T0:在程序中不使用.
\x05TH1 = 0x3c;\x05\x05//指定定时时间为50ms,即每50ms扫描一次数码管.
\x05TL1 = 0xb0;\x05\x05//65536-50*1000/(12/12) = 15536 = 3cb0h
\x05 ET1 = 1;\x05\x05 //开定时器1中断
\x05while(1)
\x05{
\x05\x05while(KeyA&KeyB&KeyC); //等待按键
\x05\x05if(KeyA) //按键A
\x05\x05{
\x05\x05\x05number++;
\x05\x05\x05if(number == 9999)
\x05\x05\x05\x05number = 0;
\x05\x05}
\x05\x05if(KeyB)
\x05\x05{
\x05\x05\x05if(number>0)
\x05\x05\x05\x05number--;
\x05\x05}
\x05\x05if(KeyC)
\x05\x05\x05number = 0;
\x05\x05
\x05\x05Led4 = number/1000;
\x05\x05temp = number%1000;
\x05\x05Led3 = temp/100;
\x05\x05temp = number%100;
\x05\x05Led2 = number/10;
\x05\x05Led1 = number%10;\x05
\x05\x05
\x05}
}
\x05
//功能描述:定时器1用于数码管扫描
void timer1() interrupt 3 using 2
{
\x05TH1 = 0x3c;\x05\x05\x05\x05\x05//重新赋值
\x05TH0 = 0xb0;
\x05P0 = LedSegmentTab[Led1];
\x05P2 = P2 & 0xfe;\x05\x05\x05\x05//点亮第一个数码管
\x05Delay100us(10);\x05\x05\x05\x05//延时1ms
\x05P0 = LedSegmentTab[Led2];
\x05P2 = P2 & 0xfd;\x05\x05\x05\x05//点亮第二个数码管
\x05Delay100us(10);\x05\x05\x05\x05//延时1ms
\x05P0 = LedSegmentTab[Led3];\x05
\x05P2 = P2 & 0xfb;\x05\x05\x05\x05//点亮第三个数码管
\x05Delay100us(10);\x05\x05\x05\x05//延时1ms
\x05P0 = LedSegmentTab[Led4];
\x05P2 = P2 & 0xf7;\x05\x05\x05\x05//点亮第四个数码管
\x05Delay100us(10);
}
void Delay100us(int Times)
{
\x05Times = Times * 100;
\x05while(Times--);
}
以上程序用Keil编译通过,至于能不能用,需要自己做一下仿真