STC8H8K32U工控板OLED 显示加PWM输出

张开发
2026/4/19 9:57:56 15 分钟阅读

分享文章

STC8H8K32U工控板OLED 显示加PWM输出
PWM电机正反转本文介绍了一种基于STC8H单片机的PWM电机正反转控制系统。系统通过硬件PWM模块控制两个电机的正反转和调速使用定时器中断实现PWM占空比动态调整。主程序初始化I/O口、PWM参数和OLED显示模块通过按键检测和状态机处理用户输入实现电机控制、气缸动作及状态显示功能。系统支持手动操作和自动控制模式具有输入信号检测和输出控制功能可应用于工业自动化场景。/******************************************/#include stc8h.h //包含此头文件后不需要再包含reg51.h头文件#include stdio.h#include ../comm/usb.h //USB调试及复位所需头文件#include intrins.h#define high 1#define low 0#define OPEN 1#define OFF 0#define PWM1_1 0x00 //P:P1.0 N:P1.1#define PWM3_1 0x00 //P:P1.4 N:P1.5#define PWM_PERIOD 1023 //设置周期值#define MAIN_Fosc 24000000L //定义主时钟#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒/************* 本地变量声明 **************/bit B_1ms; //1ms标志u16 PWM1_Duty;u16 PWM3_Duty;bit PWM1_Flag;bit PWM3_Flag;#define ENO1P 0x01#define ENO1N 0x02#define ENO3P 0x10#define ENO3N 0x20sbit OLED_SCLP2^7; //sbit OLED_SDAP2^6; //sbit OUT_AP6^0; //sbit OUT_BP6^1; //sbit OUT_CP6^2; //sbit OUT_DP6^3; //sbit Motora_Ina1P1^0; // 电机前信号sbit Motora_Ina2P1^1; // 电机前信号sbit Motorb_Ina1P1^4; // 电机后信号sbit Motorb_Ina2P1^5; // 电机后信号sbit INT_1P3^2; // 自动启动sbit INT_2P3^3; // 开模信号sbit INT_3P3^4; // 机械手到位sbit INT_4P3^5; // 气缸前到位sbit INT_5P3^6; // 气缸后到位sbit INT_6P3^7; // 气缸前退停sbit INT_7P4^1; // 气缸后退停sbit INT_8P4^2; // 电机前到位sbit INT_9P4^3; // 电机后到位sbit INT_10P4^4; // 电机前退停sbit INT_11P2^0; // 电机后退停sbit INT_12P2^1; // 手动气缸进sbit INT_13P2^2; // 手动气缸退sbit INT_14P2^3; // 手动电机进sbit INT_15P2^4; // 手动电机退sbit INT_16P2^5; ////输入信号sbit OUT_1P0^6; // 气缸前进sbit OUT_2P0^4; // 气缸前退sbit OUT_3P0^3; // 气缸后进sbit OUT_4P0^2; // 气缸后退sbit OUT_5P0^1; //sbit OUT_6P0^0; //sbit OUT_7P4^6; // 警报sbit OUT_8P4^5; // 动作完成//输出信号sbit KEY_1P1^7; //sbit KEY_2P1^6; //sbit KEY_3P1^3; //sbit KEY_4P5^4; //sbit KEY_5P4^0; //sbit KEY_6P4^7; //sbit KEY_7P0^5; //sbit KEY_8P0^7; ////按键u8 Counter; //步进计数器u8 kcounter,kstatus; //按键计数标志 按键状态标志void UpdatePwm(void);// #define MAIN_Fosc 24000000ULu8 code show1[]{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*0,0*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*1,1*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*2,2*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*3,3*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*4,4*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*5,5*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*6,6*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7,7*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*8,8*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*9,9*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*A,10*/0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*D,11*/0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*W,12*/0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*O,13*/0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*N,14*/};u8 code show2[]{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,/*电,0*/0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*机,1*/0x80,0x60,0xF8,0x07,0x00,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x00,0x00,0x00,0x00,0xFF,0x00,0x03,0x01,0x05,0x45,0x85,0x7D,0x05,0x05,0x05,0x01,0x03,0x00,/*停,2*/0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*止,3*/0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,/*启,4*/0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*动,5*/0x00,0x80,0x60,0xF8,0x07,0x40,0x30,0x0F,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*作,6*/0x40,0x40,0x42,0xCC,0x00,0x80,0x88,0x88,0xFF,0x88,0x88,0xFF,0x88,0x88,0x80,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x40,0x5F,0x40,0x40,0x40,0x00,/*进,7*/0x40,0x40,0x42,0xCC,0x00,0x00,0xFF,0x49,0x49,0xC9,0x49,0x49,0x7F,0x80,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x5F,0x48,0x44,0x40,0x41,0x42,0x45,0x58,0x40,0x00,/*退,8*/0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,/*待,9*/0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*机,10*/0x10,0x0C,0x04,0x24,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x24,0x04,0x14,0x0C,0x00,0x00,0x81,0x81,0x41,0x31,0x0F,0x01,0x01,0x01,0x7F,0x81,0x81,0x81,0xF1,0x00,0x00,/*完,11*/0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x08,0x00,0x80,0x60,0x1F,0x00,0x10,0x20,0x1F,0x80,0x40,0x21,0x16,0x18,0x26,0x41,0xF8,0x00,/*成,12*/};//void delay_ms(u8 ms){u16 i;do{iMAIN_Fosc/1000;while(--i);}while(--ms);}/************按键计数器状态寄存器归零************/void key_reset(){kcounter0; //计数器归零kstatus0; //状态计数器归零}/************按键计数器状态寄存器加一************/void Key_ValAdd(){kcounter; //按键计数器加一kstatus; //按键状态标志加一}/***********按键计数器加一状态寄存器归零*********/void Key_Clear(){kcounter; //按键计数器加一kstatus0; //按键状态标志归零}/*************Pin Define***************/void Oled_delay(u16 ms){u16 i,j;for(i0;ims;i)for(j0;j20;j);}/*************Pin Define***************/void Initial_LY096BG30();void Delay_50ms(u16 Del_50ms);void fill_picture(u8 fill_Data);void IIC_Start();void IIC_Stop();void Write_IIC_Command(u8 IIC_Command);void Write_IIC_Data(u8 IIC_Data);bit Write_IIC_Byte(u8 IIC_Byte);/*******************IIC Start******************/void IIC_Start(){OLED_SCLhigh;Oled_delay(2);OLED_SDAhigh;Oled_delay(2);OLED_SDAlow;Oled_delay(2);OLED_SCLlow;}/*************IIC Stop*************************/void IIC_Stop(){OLED_SDAlow;Oled_delay(2);OLED_SCLhigh;Oled_delay(2);OLED_SDAhigh;}/*****************IIC Write byte***************/bit Write_IIC_Byte(u8 IIC_Byte){unsigned char i;bit Ack_Bit; //应答信号for(i0;i8;i){if(IIC_Byte 0x80) //1?0?OLED_SDAhigh;elseOLED_SDAlow;OLED_SCLhigh;Oled_delay(2);OLED_SCLlow;IIC_Byte1; //loop}OLED_SDAhigh; //释放IIC SDA总线为主器件接收从器件产生应答信号Oled_delay(2);OLED_SCLhigh; //第9个时钟周期Oled_delay(2);Ack_BitOLED_SDA; //读取应答信号OLED_SCLlow;return Ack_Bit;}/*************IIC Write Command*****************/void Write_IIC_Command(u8 IIC_Command){IIC_Start();Write_IIC_Byte(0x78); //Slave address,SA00Write_IIC_Byte(0x00); //write commandWrite_IIC_Byte(IIC_Command);IIC_Stop();}/****************IIC Write Data*****************/void Write_IIC_Data(u8 IIC_Data){IIC_Start();Write_IIC_Byte(0x78);Write_IIC_Byte(0x40); //write dataWrite_IIC_Byte(IIC_Data);IIC_Stop();}/***********************Initial code*********************/void Initial_LY096BG30(){Write_IIC_Command(0xAE); //display offWrite_IIC_Command(0x20); //Set Memory Addressing ModeWrite_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,InvalidWrite_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7Write_IIC_Command(0xc8); //Set COM Output Scan DirectionWrite_IIC_Command(0x00); //---set low column addressWrite_IIC_Command(0x10); //---set high column addressWrite_IIC_Command(0x40); //--set start line addressWrite_IIC_Command(0x81); //--set contrast control registerWrite_IIC_Command(0x7f);Write_IIC_Command(0xa1); //--set segment re-map 0 to 127Write_IIC_Command(0xa6); //--set normal displayWrite_IIC_Command(0xa8); //--set multiplex ratio(1 to 64)Write_IIC_Command(0x3F); //Write_IIC_Command(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM contentWrite_IIC_Command(0xd3); //-set display offsetWrite_IIC_Command(0x00); //-not offsetWrite_IIC_Command(0xd5); //--set display clock divide ratio/oscillator frequencyWrite_IIC_Command(0xf0); //--set divide ratioWrite_IIC_Command(0xd9); //--set pre-charge periodWrite_IIC_Command(0x22); //Write_IIC_Command(0xda); //--set com pins hardware configurationWrite_IIC_Command(0x12);Write_IIC_Command(0xdb); //--set vcomhWrite_IIC_Command(0x20); //0x20,0.77xVccWrite_IIC_Command(0x8d); //--set DC-DC enableWrite_IIC_Command(0x14); //Write_IIC_Command(0xaf); //--turn on oled panel}/***************设置参数显示******************/void dis_Val1(u8 s){u8 x,y;u16 i0;u8 A1,A2,A3;A1s/100;A2(s-A1*100)/10;A3s-A1*100-A2*10;for(y0;y2;y) //百位显示{Write_IIC_Command((u8)(0XB4y)); //纵向页 1011Write_IIC_Command(0X00); //横向离左部边缘开始的距离Write_IIC_Command(0X10); //横向第四个字for(x0;x8;x) //横向像素{Write_IIC_Data(show1[xy*8A1*16]); //0--A字符表}for(x0;x8;x) //横向像素{Write_IIC_Data(show1[xy*8A2*16]);Oled_delay(2);}}for(y0;y2;y) //十位显示{Write_IIC_Command((u8)(0XB4y)); //纵向页Write_IIC_Command(0X00); //横向离左部边缘开始的距离Write_IIC_Command(0X11); //横向第五个字for(x0;x8;x) //横向像素{Write_IIC_Data(show1[xy*8A3*16]);Oled_delay(2);}}}/********************显示待机**********************/void Diswait(){u8 x,y;u16 Cnt32;for(y0;y2;y){Write_IIC_Command((u8)(0XB0y)); //竖向第一行 待Write_IIC_Command(0x00);Write_IIC_Command(0x10); //横向第一个字for(x0;x16;x) //横向像素{Write_IIC_Data(show2[xy*16Cnt*11]); //字符表第7个字}}//for(y0;y2;y){Write_IIC_Command((u8)(0XB0y)); //竖向第一行 机Write_IIC_Command(0x00);Write_IIC_Command(0x11); //横向第二个字for(x0;x16;x) //横向像素{Write_IIC_Data(show2[xy*16Cnt*12]); //字符表第8个字}}}/********************IO_rst**********************/void IO_int(){P_SW2 | 0x80; //扩展寄存器(XFR)访问使能P0M1 0x00; P0M0 0x00; //设置为推挽输出P1M1 0x00; P1M0 0x00; //设置为准双向口P2M1 0x00; P2M0 0x00; //设置为准双向口P3M1 0x00; P3M0 0x00; //设置为准双向口P4M1 0x00; P4M0 0x00; //设置为准双向口P5M1 0x00; P5M0 0x00; //设置为准双向口}/********************picture**********************/void cleardisp(){u8 x,y;for(y0;y8;y){Write_IIC_Command((u8)(0xb0y));Write_IIC_Command(0x00);Write_IIC_Command(0x10);for(x0;x128;x) //横向像素{Write_IIC_Data(0X00);}}}/***************显示计数器值******************/void dis_Val(u8 s){u8 x,y;u16 i0;u8 A1,A2;A1s/10;A2s-A1*10;for(y0;y2;y) //百位显示{Write_IIC_Command((u8)(0XB2y)); //纵向页 1011Write_IIC_Command(0X00); //横向离左部边缘开始的距离Write_IIC_Command(0X10); //横向第四个字for(x0;x8;x) //横向像素{Write_IIC_Data(show1[xy*8A1*16]); //0--A字符表}for(x0;x8;x) //横向像素{Write_IIC_Data(show1[xy*8A2*16]); //0--A字符表}}delay_ms(150); //延时}//// 函数: UpdatePwm(void)// 描述: 更新PWM占空比.// 参数: none.// 返回: none.// 版本: V1.0, 2012-11-22//void UpdatePwm(void){PWMA_CCR1H (u8)(PWM1_Duty 8); //设置占空比时间PWMA_CCR1L (u8)(PWM1_Duty);PWMA_CCR3H (u8)(PWM3_Duty 8); //设置占空比时间PWMA_CCR3L (u8)(PWM3_Duty);}/********************** Timer0 1ms中断函数 ************************/void timer0(void) interrupt 1{if(!PWM1_Flag){PWM1_Duty;if(PWM1_Duty PWM_PERIOD) PWM1_Flag 1;}else{PWM1_Duty--;if(PWM1_Duty 0)PWM1_Flag 0;}if(!PWM3_Flag){PWM3_Duty;if(PWM3_DutyPWM_PERIOD)PWM3_Flag 1;}else{PWM3_Duty--;if(PWM3_Duty 0)PWM3_Flag 0;}UpdatePwm();}/******************** 主函数 **************************/void main(void){RSTFLAG | 0x04; //设置硬件复位后需要检测P3.2的状态选择运行区域否则硬件复位后进入USB下载模式PWM1_Flag 0;PWM3_Flag 0;PWM1_Duty 0;PWM3_Duty 512;IO_int();Initial_LY096BG30();cleardisp();Diswait();Counter0;dis_Val1(0X12); //第三行显示十进制数18// Timer0初始化TMOD 0xf0;//16 bits timer auto-reloadAUXR | 0x80;//Timer0 set as 1TTH0 (u8)(Timer0_Reload / 256);TL0 (u8)(Timer0_Reload % 256);ET0 1; //Timer0 interrupt enableTR0 1; //Tiner0 runPWMA_CCER1 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道PWMA_CCER2 0x00;PWMA_CCMR1 0x68; //通道模式配置PWMA_CCMR3 0x68;PWMA_CCER1 0x55; //配置通道输出使能和极性PWMA_CCER2 0x55;PWMA_ARRH (u8)(PWM_PERIOD 8); //设置周期时间PWMA_ARRL (u8)PWM_PERIOD;PWMA_ENO 0x00;PWMA_ENO | ENO1P; //使能输出PWMA_ENO | ENO1N; //使能输出PWMA_ENO | ENO3P; //使能输出PWMA_ENO | ENO3N; //使能输出PWMA_PS 0x00; //高级 PWM 通道输出脚选择位PWMA_BKR 0x80; //使能主输出PWMA_CR1 | 0x81; //ARR预装载开始计时IE2 | 0x80; //IE2相关的中断位操作使能后需要重新设置EUSBEA1; //打开总中断while(1){//key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_1) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_1) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(1);Motora_Ina11; //电机旋转初始化方向Motora_Ina20; //Motorb_Ina11; //电机旋转初始化方向Motorb_Ina20; //delay_ms(150); //延时Motora_Ina11; //电机旋转初始化方向Motora_Ina21; //Motorb_Ina11; //电机旋转初始化方向Motorb_Ina21; //}}//按键1key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_2) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_2) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(2);Motora_Ina10; //电机旋转初始化方向Motora_Ina21; //Motorb_Ina10; //电机旋转初始化方向Motorb_Ina21; //delay_ms(150); //延时Motora_Ina11; //电机旋转初始化方向Motora_Ina21; //Motorb_Ina11; //电机旋转初始化方向Motorb_Ina21; //}}//按键2key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_3) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_3) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(3);}}//按键3key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_4) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_4) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(4);}}//按键4key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_5) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_5) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(5);}}//按键5key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_6) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_6) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(6);OUT_20; //气缸前退OUT_40; //气缸后退delay_ms(50); //延时OUT_21; //气缸前退关OUT_41; //气缸后退关}}//按键6key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_7) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_7) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(7);OUT_10; //气缸前进OUT_30; //气缸后进delay_ms(50); //延时OUT_11; //气缸前进关OUT_31; //气缸后进关}}//按键7key_reset();for(;kcounter10;) //输入端口循环5次{if(!KEY_8) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!KEY_8) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(8);}}//按键8 INT_1key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_1) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_1) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(10);}}//输入1key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_2) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_2) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(11);}}//按键2key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_3) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_3) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(12);}}//输入3key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_4) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_4) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(13);}}//输入4key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_5) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_5) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(14);}}//输入5key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_6) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_6) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(15);}}//输入6key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_7) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_7) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(16);}}//输入7key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_8) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_8) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(17);}}//输入8key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_9) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_9) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(18);}}//输入9key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_10) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_10) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(19);}}//输入10key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_11) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_11) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(20);}}//输入11key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_12) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_12) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(21);}}//输入12key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_13) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_13) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(22);}}//输入13key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_14) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_14) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(23);}}//输入14key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_15) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_15) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(24);}}//输入15key_reset();for(;kcounter10;) //输入端口循环5次{if(!INT_16) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(~!INT_16) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(25);}}//输入16}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////按键开进入自动运行子程序按键关子程序返回主程序/***************自动运行******************/void Auto_Run(){do{P00XFE;delay_ms(50); //延时P00XFD;delay_ms(50); //延时P00XFB;delay_ms(50); //延时P00XF7;delay_ms(50); //延时P00XEF;delay_ms(50); //延时P00XDF;delay_ms(50); //延时key_reset();for(;kcounter10;) //输入端口循环5次{if(~!KEY_1) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(!KEY_1) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(0);Auto_Flag0;}}}while(Auto_Flag);}

更多文章