网站优化怎么做,建设银行网站logo,广州 做网站,设计软件培训机构排行榜和之前一样建好工程文件夹#xff0c;里边包含User#xff08;放工程文件#xff0c;mian.c#xff09;、Driver#xff08;存放底层文件如Led.c#xff0c;Led.h等#xff09; 新建的工程先搭建框架#xff0c;可以先书写底层函数#xff08;此次书写了四个函数并包含…和之前一样建好工程文件夹里边包含User放工程文件mian.c、Driver存放底层文件如Led.cLed.h等 新建的工程先搭建框架可以先书写底层函数此次书写了四个函数并包含相应的头文件共八个底层文件 底层函数内容
1.初始化底层驱动专用文件 比如先用3个IO口控制74HC138译码器控制Y4为低电平当Y4为低电平时或非门74HC02控制Y4C为高电平使74HC573的OE端口有效OE端口有效时可使用P0口控制LED的亮灭。 可以去多了解74HC138译码器74HC02或非门74HC573八路输出透明锁存器的相关内容会更好理解 #include Init.h
//关闭外设 void System_Init() { P0 0xff; P2 P2 0x1f | 0x80; P2 0x1f; P0 0x00; P2 P2 0x1f | 0xa0; P2 0x1f; }
#include STC15F2K60S2.H void System_Init();
2.Led底层驱动专用文件 与初始化底层驱动专用文件同理需要了解对应的锁存器控制可以在使用的芯片数据手册查看 #include Led.h
void Led_Disp(unsigned char addr,enable) { static unsigned char temp 0x00; static unsigned char temp_old 0xff; if(enable) temp | 0x01 addr; else temp ~(0x01 addr); if(temp ! temp_old) { P0 ~temp; P2 P2 0x1f |0x80; P2 0x1f; temp_old temp; } }
#include STC15F2K60S2.H void Led_Disp(unsigned char addr,enable); 3.按键底层驱动专用文件 板子上的按键从按键4开始到按键19可根据实际硬件修改 #include Key.h
unsigned char Key_Read() { unsigned char temp 0; if(P33 0) temp 4; if(P32 0) temp 5; if(P31 0) temp 6; if(P30 0) temp 7; return temp; }
#include STC15F2K60S2.H
unsigned char Key_Read();
4.数码管底层驱动专用文件 这个板子使用的为共阳数码管若使用的为共阴数码管要更换对应的段码表和位选表与初始化底层驱动专用文件同理需要了解对应的锁存器控制可以在使用的芯片数据手册查看 #include Seg.h
unsigned char Seg_Dula[] {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//数码管段码储存数组 unsigned char Seg_Wela[] {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位码储存数组
void Seg_Disp(unsigned char wela,dula,point) { P0 0xff; // P2 P2 0x1f |0xe0; P2 0x1f; P0 Seg_Wela[wela]; P2 P2 0x1f |0xc0; P2 0x1f; P0 Seg_Dula[dula]; if(point) P0 0x7f; P2 P2 0x1f |0xe0; P2 0x1f; }
#include STC15F2K60S2.H
void Seg_Disp(unsigned char wela,dula,point);
工程主函数内容
1.头文件声明把需要用到的头文件添加进来
#include STC15F2K60S2.H//单片机寄存器专用头文件
#include Init.h//初始化底层驱动专用头文件 #include Led.h//Led底层驱动专用文件 #include Key.h//按键底层驱动专用文件 #include Seg.h//数码管底层驱动专用文件
2.变量声明把需要用到的所有变量现在这里进行声明
unsigned char Key_Val,Key_Down,Key_Old,Key_Up;//按键扫描专用变量 unsigned char Key_Slow_Down;//按键减速专用变量 10ms unsigned char Seg_Buf[8] {10,10,10,10,10,10,10,10};//数码管显示数据存放数组 unsigned char Seg_Point[8] {0,0,0,0,0,0,0,0};//数码管小数点数据存放数组 unsigned char Seg_Pos;//数码管扫描专用变量 unsigned char Seg_Slow_Down;//数码管减速专用变量 500ms unsigned char ucLed[8] {0,0,0,0,0,0,0,0};//Led显示数据存放数组
void Delay500ms() //12.000MHz,测试使用的500ms延时 { unsigned char i, j, k; i 23; j 205; k 120; do { do { while (--k); } while (--j); } while (--i); }
3.按键处理函数在这里编写按键控制的函数
void Key_Proc() { if(Key_Slow_Down)return; Key_Slow_Down 1;//按键减速程序 Key_Val Key_Read();//读取按下的键码值 Key_Down Key_Val (Key_Val ^ Key_Old);//捕捉下降沿 Key_Up ~Key_Val (Key_Val ^ Key_Old);//捕捉上升沿 Key_Old Key_Val;//辅助扫描
// switch (Key_Down)//测试这个函数使用状况测试结束后可以删掉 // { // case 4: // Led_Disp(2,1); // break; // case 5: // Led_Disp(2,0); // break; // } }
4.信息处理函数需要使用到到的函数进行简单的预处理
void Seg_Proc() { //unsigned char i;//用于for循环 if(Seg_Slow_Down)return; Seg_Slow_Down 1;//数码管减速程序 }
5.其他函数其他编写的函数在这里书写会比较方便理解
void Led_Proc() { }
6.定时器0中断初始化函数 这个可以使用STC的定时器计算那里生成c代码后面要自己添加ET0,EA打开中断 void Timer0Init(void) //1毫秒12.000MHz { TMOD 0xF0; //设置定时器模式 TL0 0x18; //设置定时初值 TH0 0xFC; //设置定时初值 TF0 0; //清除TF0标志 TR0 1; //定时器0开始计时 ET0 1; EA 1; }
7.定时器0中断服务函数 为了定时执行特定的任务如此处设置了定时的时间触发了数码管和LED产生特定反应//中断在测试时可以先注释掉但是这里按键状态有延时测试按键时可以解除注释 void Timer0Server() interrupt 1 { if(Key_Slow_Down 10)Key_Slow_Down 0; if(Seg_Slow_Down 500)Seg_Slow_Down 0; if(Seg_Pos 6)Seg_Pos 0; Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]); Led_Disp(Seg_Pos,ucLed[Seg_Pos]); }
8.主函数Main调用书写的函数实现所需的相应功能 void main() { //int i 0;,key_value; System_Init(); //Timer0Init();//中断在测试时可以先注释掉 while(1) { Key_Proc(); Seg_Proc(); Led_Proc(); // key_valueKey_Read();//测试按键按下的状态 // if(key_value4) // { // Led_Disp(1,1); // } // else // { // Led_Disp(1,0); // }
// for(i0;i8;i)//测试数码管状态 // { // Seg_Disp(i,i,1); // } // for(i0;i8;i)//测试LED状态 // { // Led_Disp(i,1);Delay500ms();//LED亮起延时500ms // Led_Disp(i,0);Delay500ms();//LED灭掉延时500ms // }//1L1闪烁2L2闪烁3L3闪烁 } }