前言:4T官网的第二套模拟题,缺了很多必要的东西,连省赛都不如,不是题目难度的问题,感觉是官方态度的问题。
题目
个人感受与分析
按键就两个,还是同列的,明明只要独立按键就能完成的,就硬塞个矩阵按键。甚至都没有所谓的参数,和与参数交互的判断。我只能说,这题几乎就只能来练习底层。
底层驱动代码
IIC
就这题目还考IIC
unsigned char guangmin(){
unsigned char ret;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x41);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
ret = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return ret;
}
void DAC(unsigned char dat){
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x43);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
onewire
void cewen(){
unsigned char MSB,LSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
if(ce){
Delay(550);
ce = 0;
}
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
init_ds18b20();
temp = ((MSB << 8) | LSB) * 0.625;
}
主程序核心代码
#include <STC15F2K60S2.H>
#include "inithc138.h"
#include "delay.h"
#include "onewire.h"
#include "iic.h"
#define de 5
code unsigned char Seg_Table[17] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e, //F
0xbf
};
unsigned char show = 0;//显示切换
bit mode = 0;//模式界面
unsigned int temp = 0;//温度
bit ce = 1;
unsigned char light = 0;
unsigned int dacshuju = 0;//DAC数据
unsigned int dacxianshi = 0;
//***************************************测温
void cewen(){
unsigned char MSB,LSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
if(ce){
Delay(550);
ce = 0;
}
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
init_ds18b20();
temp = ((MSB << 8) | LSB) * 0.625;
}
//***************************************
//***************************************显示功能
void moshijiemian(){//显示界面
if(mode == 0){
showsmg(1,Seg_Table[1]);
showsmg(8,Seg_Table[temp % 10]);
showsmg(7,Seg_Table[temp / 10 % 10] & 0x7f);
showsmg(6,Seg_Table[temp / 100 % 10]);
}else{
showsmg(1,Seg_Table[2]);
showsmg(8,Seg_Table[light % 10]);
if(light > 9){
showsmg(7,Seg_Table[light / 10 % 10]);
}
if(light > 99){
showsmg(6,Seg_Table[light / 100 % 10]);
}
}
}
void shuchujiemian(){//输出界面
if(mode == 0){
if(temp <= 100){
dacshuju = 51;
}else if(temp >= 400){
dacshuju = 255;
}else{
dacshuju = 0.680 * temp - 17.00;
}
}else{
if(light <= 10){
dacshuju = 51;
}else if(light >= 240){
dacshuju = 255;
}else{
dacshuju = 0.887 * light + 42.13;
}
}
dacxianshi = dacshuju * 100 / 51;
showsmg(1,0xc1);
showsmg(8,Seg_Table[dacxianshi / 10 % 10]);
showsmg(7,Seg_Table[dacxianshi / 100 % 10] & 0x7f);
}
//***************************************
//***************************************
void showselect(){
switch(show){
case 0:moshijiemian();break;
case 1:shuchujiemian();break;
}
}
//***************************************
//***************************************LED
void led(){
if(mode == 0){
outputp0(4,~0x01);
}else{
outputp0(4,~0x02);
}
}
//***************************************
//***************************************按键扫描
void scankey(){
P33 = 0;P32 = 1;P44 = 1;
if(show == 0){
if(P44 == 0){
Delay(de);
while(P44 == 0){
showselect();
}
mode = ~mode;
}
}
P33 = 1;P32 = 0;P44 = 1;
if(P44 == 0){
Delay(de);
while(P44 == 0){
showselect();
}
show++;
show %= 2;
}
}
//***************************************
void main(){
initsys();
light = guangmin();
while(1){
cewen();
DAC(dacshuju);
showselect();
scankey();
light = guangmin();
showselect();
DAC(dacshuju);
led();
}
}
注:这次代码简单,就不提供演示视频了。