这是关于蓝桥杯备赛路上练习的小程序,蓝桥杯的竞赛路上希望大家互相勉励。
祝大家有个好成绩。
以下代码是我利用手头上小红板(JW-51)训练的小程序。
希望大家一同进步。
#include<reg52.h> //按键1 使数码管数字+1 长按连续+1
按键2 使数码管数字-1 长按连续-1
typedef unsigned int u16;
typedef unsigned char u8;
unsigned char code smgduan[]={0x3f,
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code smgwei[]={0xfe,
0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit rclk=P2^5;
sbit srclk=P2^6;
sbit ser=P2^7;
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
u8 num;
void smg_dis();
void send_595(u8 n);
void delay(u16 n)
{
u8 i ;
while (n--)
for(i=0;i<125;i++);
}
void main()
{
while(1)
{
if(key0==0){
delay(100);
if(key0==0){
num=num+1;
if(num==256)
num=0;
}
}
if(key1==0){
delay(100);
if(key1==0){
num=num-1;
if(num==0)
num=256;
}
}
smg_dis();
}
}
void smg_dis()
{
send_595(smgwei[0]);
send_595(smgduan[num/100]);
rclk=0;
rclk=1;
delay(1);
send_595(smgwei[1]);
send_595(smgduan[num%100/10]);
rclk=0;
rclk=1;
delay(1);
send_595(smgwei[2]);
send_595(smgduan[num%10]);
rclk=0;
rclk=1;
delay(1);
}
void send_595(u8 n)
{
u8 i;
for(i=0;i<8;i++)
{
if(n&0x80 )
ser=1;
else
ser=0;
srclk=0;
srclk=1;
n=n<<1;
}
}
/*课程设计自动计数器 数码管显示 一个按键每次按下使数字+1*/
/*同时LED灯闪一次,另一个按键按下后清零同时蜂鸣器响一声*/
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit ser=P2^7; //定义数码管端口
sbit srclk=P2^6;
sbit rclk=P2^5;
sbit key1=P3^0; //定义独立键盘端口
sbit key2=P3^1;
sbit key3=P2^3; //定义蜂鸣器端口
unsigned char code smgduan[]={0x3f,
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; //段选数组
unsigned char code smgwei[]={0xfe,
0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选数组
void DelayMs(u16 n); //延时函数
u8 DispSmg(u8 n); //数码管显示函数
void send_595(u8 dat); //输送段选位选数据函数
void main() //主函数
{
u16 n;
while(1)
{
DispSmg(n);
if(key2==0) //若key2按下
{
DelayMs(100);
if(key2==0) //消抖 确认key2被按下
{
n=0; //n被赋值为0
key3=0;
DelayMs(20);
key3=1; //蜂鸣器响0.02秒后灭
}
}
if(key1==0)
{
DelayMs(100);
if(key1==0) //消抖 确认key1被按下
{
n++; //n每次在原来的基础上+1
P1=0xfe;
DelayMs(100);
P1=0xff; //发光二极管亮0.1秒后灭
}
}
}}
void DelayMs(u16 n)
{
u8 i;
while(n--)
for(i=0;i<113;i++);
}
u8 DispSmg(u8 n)
{
send_595(smgwei[5]); //输送位码数据 提供显示位置
send_595(smgduan[n/100]); //输送段码数据 提供显示内容
rclk=0;
rclk=1; //上升沿有效 说明输送数据到数码管
send_595(smgwei[6]);
send_595(smgduan[n/10%10]);
rclk=0;
rclk=1;
send_595(smgwei[7]);
send_595(smgduan[n%10]);
rclk=0;
rclk=1;
}
void send_595(u8 dat)
{
u8 i;
for(i=0;i<8;i++) //比较8次 每次提交一位数据 一共八位数据
{
if(dat&0x80)
ser=1;
else
ser=0;
srclk=0;
srclk=1; //上升沿有效 说明输送数据到数码管
dat=dat<<1; 被输送的数据左移一位
}
}
我要赚赏金
