蓝桥杯单片机12届第二场
这是第三次写了,都挺顺畅的,就是长按键那里卡了一下,就是发现还可以把按键写在定时器里,这样就方便多了,我之前写的长按键确实麻烦了些。
main.c
#include "sys.h"
#include "iic.h"uint volt1,volt3;
//void Led();
void main()
{InitSystem();InitTimer0();Timer1Init();while(1){KeyScans();if(t200ms){t200ms = 0;Operate_key_val();}ReadAIN1();ReadAIN3();volt1 = rd1*1.96;volt3 = rb2*1.96;DisplaySMG();if((puse == 0))Led();}
}void Led()
{if(volt3_p != 0){if(volt3 > volt3_p)OperateLed(1,0);elseOperateLed(1,1);}if(freq_p != 0){if(freq > freq_p)OperateLed(2,0);elseOperateLed(2,1);}if(interface == 0)OperateLed(3,0);elseOperateLed(3,1);if(interface == 1)OperateLed(4,0);elseOperateLed(4,1);if(interface == 2)OperateLed(5,0);elseOperateLed(5,1);
}
sys.c
#include "sys.h"void Select_74HC138(uchar channel)
{switch(channel){case 0: P2 = P2 & 0X1F; break;case 4: P2 = (P2 & 0X1F) | 0X80; break;case 5: P2 = (P2 & 0X1F) | 0XA0; break;case 6: P2 = (P2 & 0X1F) | 0XC0; break;case 7: P2 = (P2 & 0X1F) | 0XE0; break;}
}void InitSystem()
{Select_74HC138(4);P0 = 0XFF;Select_74HC138(5);P0 = 0X00;Select_74HC138(0);
}void Delay(uint ms)
{uint i;for(ms; ms > 0; ms--)for(i = 921; i > 0; i--);
}void OperateLed(uchar who,status)
{static uchar temp;uchar zt;switch(status){case 0: temp = temp | _crol_(0x01,who-1);P0 = ~temp;break;case 1:if(who == 0xff){P0 = 0XFF;temp = 0;}else{zt = (~temp) | _crol_(0x01,who-1);if(temp != (~zt))temp = ~zt;P0 = ~temp;}break;case 2: P0 = ~who;temp = who;break;default: break;}Select_74HC138(4);Select_74HC138(0);
}uint freq_count;void InitTimer0()
{AUXR |= 0X80;TMOD &= 0XF0;TMOD |= 0X04;TH0 = 0XFF;TL0 = 0XFF;TF0 = 0;TR0 = 1;ET0 = 1;EA = 1;
}void ServiceTimer0() interrupt 1
{freq_count++;
}uchar t1 = 0;
uchar count = 0;
uchar puse = 0;
uchar t200ms = 0;void Timer1Init() //50毫秒@12.000MHz
{AUXR &= 0xBF; //定时器时钟12T模式TMOD &= 0x0F; //设置定时器模式TL1 = 0xB0; //设置定时初值TH1 = 0x3C; //设置定时初值TF1 = 0; //清除TF1标志TR1 = 1; //定时器1开始计时ET1 = 1;EA = 1;
}void ServiceTimer1() interrupt 3
{t1++;if(t1 % 4 == 0){t200ms = 1;}if(t1 == 20){t1 = 0;freq = freq_count;freq_count = 0;}if(puse == 0){if(s7 == 0){count++;if(count == 40){count = 0;Select_74HC138(4);P0 = 0XFF;Select_74HC138(0);puse = 1;}}}if(puse == 1){if(s7 == 0){count++;if(count == 40){count = 0;puse = 0;if(puse == 0)Led();}}}
}
nixie.c
#include "sys.h"uchar code nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xc8,0xc1,0xbf,0xff};uint freq;
uint cycle;
uchar channel = 1;
uchar interface;void DisplayBit(uchar pos,value,bit k)
{P0 = 0X00;Select_74HC138(6);Select_74HC138(0);if(k)P0 = nixie[value] & 0x7f;elseP0 = nixie[value];Select_74HC138(7);Select_74HC138(0);P0 = _crol_(0x01,pos);Select_74HC138(6);Select_74HC138(0);Delay(1);
}void DisplayFreq()
{DisplayBit(0,10,0);if(freq > 999999)DisplayBit(1,freq / 1000000,0);if(freq > 99999)DisplayBit(2,freq / 100000 % 10,0);if(freq > 9999)DisplayBit(3,freq / 10000 % 10,0);if(freq > 999)DisplayBit(4,freq / 1000 % 10,0);if(freq > 99)DisplayBit(5,freq / 100 % 10,0);if(freq > 9)DisplayBit(6,freq / 10 % 10,0);DisplayBit(7,freq % 10,0);
}void DisplayCycle()
{cycle = 1000000 / freq;DisplayBit(0,11,0);if(cycle > 999999)DisplayBit(1,cycle / 1000000,0);if(cycle > 99999)DisplayBit(2,cycle / 100000 % 10,0);if(cycle > 9999)DisplayBit(3,cycle / 10000 % 10,0);if(cycle > 999)DisplayBit(4,cycle / 1000 % 10,0);if(cycle > 99)DisplayBit(5,cycle / 100 % 10,0);if(cycle > 9)DisplayBit(6,cycle / 10 % 10,0);DisplayBit(7,cycle % 10,0);
}void DisplayVolt()
{DisplayBit(0,12,0);DisplayBit(1,13,0);DisplayBit(2,channel,0);if(channel == 1){DisplayBit(5,volt1 / 100,1);DisplayBit(6,volt1 / 10 % 10,0);DisplayBit(7,volt1 % 10,0);}else if(channel == 3){DisplayBit(5,volt3 / 100,1);DisplayBit(6,volt3 / 10 % 10,0);DisplayBit(7,volt3 % 10,0);}
}void DisplaySMG()
{switch(interface){case 0: DisplayFreq(); break;case 1: DisplayCycle(); break;case 2: DisplayVolt(); break;}
}
key.c
#include "sys.h"uchar key_val = 20;
uint freq_p;
uint volt3_p;void KeyScans()
{if(key_val == 20){if(s4 == 0){Delay(10);key_val = 4;while(s4 == 0){DisplaySMG();}}if(s5 == 0){Delay(10);key_val = 5;while(s5 == 0){DisplaySMG();}}if(s6 == 0){Delay(10);key_val = 6;while(s6 == 0){DisplaySMG();}}if(s7 == 0){Delay(10);key_val = 7;while(s7 == 0){DisplaySMG();}}}
}void Operate_key_val()
{if(key_val != 20){switch(key_val){case 4:interface = (interface + 1) % 3;if(interface == 0)channel = 1;break;case 5:if(interface == 2){if(channel == 1)channel = 3;else if(channel == 3)channel = 1;}break;case 6: volt3_p = volt3;break;case 7:freq_p = freq;break;}}key_val = 20;
}
蓝桥杯单片机12届第二场相关推荐
- 蓝桥杯单片机第十一届第一场省赛-多功能电压测量装置
九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第十一届第一场省赛-多功能电压测量装置 Notes1:矩阵按键的灵活使用 Notes2:AT24 ...
- 蓝桥杯单片机14届省赛
蓝桥杯单片机14届省赛代码(省一) 欢迎使用Markdown编辑器 main.c #include "HC138.h" #include "PCF8591.h" ...
- 蓝桥杯 省赛 python_第十一届蓝桥杯软件省级大赛第二场python3,类省赛,Python3
试题 A: 门牌制作 本题总分:5 分 [问题描述] 小蓝要为一条街的住户制作门牌号. 这条街一共有 2020 位住户,门牌号从 1 到 2020 编号. 小蓝制作门牌的方法是先制作 0 到 9 这几 ...
- 蓝桥杯第12届第三次模拟
1.问题描述 请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1. 这题我是直接暴力算的. 代码如下: public class Main { p ...
- 第十一届蓝桥杯java B组第二场-试题A: 门牌制作
文章目录 一.题目 二.解释说明 三.代码实例 四.题目结果 一.题目 试题 A: 门牌制作(5分) [问题描述] 小蓝要为一条街的住户制作门牌号. 这条街一共有 2020 位住户,门牌号从 1 到 ...
- 蓝桥杯第12届java A组,《直线》
为了去除重复的直线,一般用斜截式来表示直线,本题采用分数的形式表示斜率和截距 import java.util.*;class Point{int x;int y;public Point(int x ...
- 蓝桥杯单片机第十三届第二场
第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...
- 蓝桥杯单片机第十三届第二场考后归纳总结
提示:一个第十三届蓝桥杯单片机 考生的考后总结 文章目录 前言 一.第十三届考的是什么? 二.数据代码 总结 一.第十三届考的是什么? 1.电位器RB2的电压测量,用DAC输出 2.超声波测距 3. ...
- 被十三届第二场蓝桥杯背刺了
考的是AD/DA.超声波哭了!十三年省赛我都写个遍都没有考过超声波,为什么第一场比赛和第二次差距这么大? 国赛才会有的模块,现在在省赛这里考了,相信大家第一眼都是蒙的状态,如果机器阅卷的话想办法解决就 ...
最新文章
- 仅需10分钟:开启你的机器学习之路
- openCV 图像相加,位运算,协方差,绝对值,比较
- jdom 插入 修改 删除
- Eclipse 部分快捷键
- model模型php,thinkphp的model模型的设计经验总结
- Guava RateLimiter限流原理解析
- html5怎么圆圈怎么打开,HTML5动感圆圈
- mysql内存机制_MySQL内存管理机制
- js原生实现贪吃蛇(解决连续键盘事件)
- ubuntu16.04安装NIVIDIA显卡驱动,cuda8.0,cuDNN6.0以及基于Anaconda安装Tensorflow-GPU
- iOS通过切片仿断点机制上传文件
- Nginx服务器、Nginx虚拟主机、Nginx反向代理
- 集合框架-Collection与List集合
- r720换固态硬盘后如何重装系统_联想R720重装Winddows10无法识别固态硬盘咋办
- Memory ordering in some architectures
- case when then else end 及cheak约束
- 迟来的2015年终总结
- web端自动化测试1--selenium基础
- java 中介者模式
- swap分区、硬盘和磁盘