16.DS18b20测温 课后小练 测温计 参考坛友“乐高”的16课课后小练代码
io.c
- #include "io.h"
- #include "18b20.h"
-
- u8 Key_vol = 0;
- u8 MinusFlag;
-
- u8 SEG_NUM[] = //不带小数点
- {
- 0x3F, /*'0', 0*/
- 0x06, /*'1', 1*/
- 0x5B, /*'2', 2*/
- 0x4F, /*'3', 3*/
- 0x66, /*'4', 4*/
- 0x6D, /*'5', 5*/
- 0x7D, /*'6', 6*/
- 0x07, /*'7', 7*/
- 0x7F, /*'8', 8*/
- 0x6F, /*'9', 9*/
- 0x77, /*'A', 10*/
- 0x7C, /*'B', 11*/
- 0x39, /*'C', 12*/
- 0x5E, /*'D', 13*/
- 0x79, /*'E', 14*/
- 0x71, /*'F', 15*/
- 0x54, /*'N', 16*/
- 0x5C, /*'O', 17*/
- 0x73, /*'P', 18*/
- 0x50, /*'R', 19*/
- 0x40, /*'-', 20*/
- 0x00, /*' ', 21*/
- 0x80, /*'.', 22*/
- };
- u8 SEG_NUM1[] = //带小数点
- {
- 0xBF, /*'0', 0*/
- 0x86, /*'1', 1*/
- 0xDB, /*'2', 2*/
- 0xCF, /*'3', 3*/
- 0xE6, /*'4', 4*/
- 0xED, /*'5', 5*/
- 0xFD, /*'6', 6*/
- 0x87, /*'7', 7*/
- 0xFF, /*'8', 8*/
- 0x6F, /*'9', 9*/
- 0x77, /*'A', 10*/
- 0x7C, /*'B', 11*/
- 0x39, /*'9', 12*/
- 0x5E, /*'D', 13*/
- 0x79, /*'E', 14*/
- 0x71, /*'F', 15*/
- 0x40, /*'-', 16*/
- 0x00, /*' ', 17*/
- 0x80, /*'.', 18*/
-
- };
-
- u8 T_NUM[8] =
- {
- 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
- };
-
- void Init_595(void)
- {
- HC595_SER = 0;
- HC595_RCK = 0;
- HC595_SCK = 0;
- }
-
-
- void Send_595( u8 dat )
- {
- u8 i;
-
- for( i=0; i<8; i++ )
- {
- dat <<= 1; //数值左移一位
- HC595_SER = CY; //数据写到引脚
- HC595_SCK = 1; //输出上升沿的时钟信号
- HC595_SCK = 0;
- }
- }
-
-
- void Display_Seg( u8 HC595_1,u8 HC595_2)
- {
- Send_595(HC595_1); //数码管段码输出 高电平点亮
- Send_595(HC595_2); //数码管位码输出 低电平点亮
-
- HC595_RCK = 1; //数据输出
- HC595_RCK = 0;
- }
-
-
- u8 passward[8] = { 21,21,21,21,21,21,21,21};
- u8 Seg_no = 0;
- void SEG_Task0(void) //未开机,熄屏
- {
-
- switch(Seg_no)
- {
- case 0: Display_Seg( SEG_NUM[21], ~T_NUM[0] ); break;
- case 1: Display_Seg( SEG_NUM[21], ~T_NUM[1] ); break;
- case 2: Display_Seg( SEG_NUM[21], ~T_NUM[2] ); break;
- case 3: Display_Seg( SEG_NUM[21], ~T_NUM[3] ); break;
- case 4: Display_Seg( SEG_NUM[21], ~T_NUM[4] ); break;
- case 5: Display_Seg( SEG_NUM[21], ~T_NUM[5] ); break;
- case 6: Display_Seg( SEG_NUM1[17], ~T_NUM[6] ); break;
- case 7: Display_Seg( SEG_NUM[21], ~T_NUM[7] ); break;
- }
-
-
- }
- void SEG_Task1(void) ////开机2秒内显示"---C"
- {
-
- switch(Seg_no)
- {
- case 0: Display_Seg( SEG_NUM[21], ~T_NUM[0] ); break;
- case 1: Display_Seg( SEG_NUM[21], ~T_NUM[1] ); break;
- case 2: Display_Seg( SEG_NUM[21], ~T_NUM[2] ); break;
- case 3: Display_Seg( SEG_NUM[21], ~T_NUM[3] ); break;
- case 4: Display_Seg( SEG_NUM[20], ~T_NUM[4] ); break;
- case 5: Display_Seg( SEG_NUM[20], ~T_NUM[5] ); break;
- case 6: Display_Seg( SEG_NUM[20], ~T_NUM[6] ); break;
- case 7: Display_Seg( SEG_NUM[12], ~T_NUM[7] ); break;
- }
-
- }
- void SEG_Task2(void) ////开机2秒内显示"---F"
- {
-
- switch(Seg_no)
- {
- case 0: Display_Seg( SEG_NUM[21], ~T_NUM[0] ); break;
- case 1: Display_Seg( SEG_NUM[21], ~T_NUM[1] ); break;
- case 2: Display_Seg( SEG_NUM[21], ~T_NUM[2] ); break;
- case 3: Display_Seg( SEG_NUM[21], ~T_NUM[3] ); break;
- case 4: Display_Seg( SEG_NUM[20], ~T_NUM[4] ); break;
- case 5: Display_Seg( SEG_NUM[20], ~T_NUM[5] ); break;
- case 6: Display_Seg( SEG_NUM[20], ~T_NUM[6] ); break;
- case 7: Display_Seg( SEG_NUM[15], ~T_NUM[7] ); break;
- }
-
- }
- void SEG_Task3(void) //开机2秒后正常显示摄氏温度
- {
-
- switch(Seg_no)
- {
- case 0: Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0] ); break;
- case 1: Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1] ); break;
- case 2: Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2] ); break;
- case 3: if(MinusFlag)
- Display_Seg( SEG_NUM[20], ~T_NUM[3] ); break;
- case 4: Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4] ); break;
- case 5: Display_Seg( SEG_NUM1[passward[5]], ~T_NUM[5] ); break;
- case 6: Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6] ); break;
- case 7: Display_Seg( SEG_NUM[12], ~T_NUM[7] ); break;
-
- }
-
- }
- void SEG_Task4(void) //开机2秒后正常显示华氏温度
- {
-
- switch(Seg_no)
- {
- case 0: Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0] ); break;
- case 1: Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1] ); break;
- case 2: Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2] ); break;
- case 3: if(MinusFlag)
- Display_Seg( SEG_NUM[20], ~T_NUM[3] ); break;
- case 4: Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4] ); break;
- case 5: Display_Seg( SEG_NUM1[passward[5]], ~T_NUM[5] ); break;
- case 6: Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6] ); break;
- case 7: Display_Seg( SEG_NUM[15], ~T_NUM[7] ); break;
- }
-
- }
-
- u16 Timing = 0; //计时
- bit Temp_C_F; //温度标志位,1(真)华氏,0(假)摄氏
- bit run = 0; //开关机标志位,0关机,1开机
-
- void SEG_Show(void)
- {
- u8 num =0;
- if(run == 0) //没有按下开机键
- {
- Timing = 0;
- SEG_Task0(); //执行息屏函数
- }
- else
- {
- Timing++;
- if(Timing>2000)
- {
- if(Temp_C_F)
- SEG_Task4();
- else
- SEG_Task3();
- Timing = 2000;
- }
- else
- {
- if(Temp_C_F)
- SEG_Task2();
- else
- SEG_Task1();
- }
- }
- Seg_no ++;
- if( Seg_no>7 )
- Seg_no=0;
- }
-
- void SEG_Show_U32(u32 num)
- {
- u8 i;
- for(i=0; i<3;i++)
- {
- passward[6-i] = num%10;
- num /= 10;
- }
- }
- //u8 Key_Vol3 = 0; //判断按钮是否按下
- u8 Key_no = 0; //数码管位计数
- u16 key_num;
-
- void KEY_Task(void)
- {
- //---------------开关机-------------------------
- if(Temp_C_F == 0)
- SEG_Show_U32(Temp_18b20);
- else
- SEG_Show_U32(Temp_F);
- if(P01 == 0)
- {
-
- if(P01 == 0)
- {
- run = !run;
- key_num = 0;
- }
- while(P01 == 0);
- }
- //---------------华氏摄氏转换-------------------------
- key_num++;
- if(P03 == 0)
- {
- Key_vol++;
- key_num = 0;
- if(Key_vol == 5)
- {
- Temp_C_F = !Temp_C_F;
- }
- }
- else
- Key_vol = 0;
- if(key_num == 3000)
- run = 0;
-
- }
-
-
-
复制代码
demo2.rar
(230.73 KB, 下载次数: 4)
|