当前位置: 首页 > article >正文

STC8H8K32U按键控制OLED显示

手动按键按下,OLED显示对应键值 气缸前进后退电机正反转本文实现了一个基于STC8H单片机的按键检测与OLED显示系统。系统通过8个独立按键输入信号采用消抖算法检测有效按键并在OLED屏幕上实时显示对应按键编号。程序包含OLED初始化、I2C通信协议实现、按键状态检测及显示功能模块。按键检测采用计数器消抖机制当按键状态标志超过阈值时判定为有效输入随后调用显示函数在OLED指定位置输出对应数字。系统还实现了待机状态的中文字符显示功能展示了完整的硬件接口驱动和显示控制流程。排列显示顺序表1 2 3 45 6 7 8外部输入端子自右向左分别显示10---2525 23 21 19 17 15 13 1124 22 20 18 16 14 12 10/******************************************/#include stc8h.h //包含此头文件后不需要再包含reg51.h头文件#include stdio.h#include intrins.h#define high 1#define low 0#define OPEN 1#define OFF 0typedef unsigned char u8;typedef unsigned int u16;typedef unsigned long u32;sbit 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_Ina1 P1 ^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_1P0^5; //sbit KEY_2P4^7; //sbit KEY_3P1^6; //sbit KEY_4P1^7; //sbit KEY_5P1^3; //sbit KEY_6P5^4; //sbit KEY_7P4^0; //sbit KEY_8P0^7; ////按键u8 Counter; //步进计数器u8 kcounter,kstatus; //按键计数标志 按键状态标志bit Auto_Flag;#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[]{0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x20,0x10,0x48,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,/*左,0*/0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,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,0x04,0x84,0x84,0x94,0xE4,0x85,0x86,0x84,0xC4,0xB4,0x84,0x84,0x84,0x80,0x00,0x80,0x60,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*产,6*/0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00,0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00,/*量,7*/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,/*进,8*/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,/*退,9*/0x00,0x00,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,/*刀,10*/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,/*待,11*/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,/*机,12*/0x20,0x10,0x4C,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00,/*气,13*/0x50,0x48,0x47,0x44,0xFC,0x44,0x44,0x44,0x00,0x04,0x04,0xFC,0x04,0x04,0x04,0x00,0x00,0x3E,0x20,0x20,0x3F,0x10,0x10,0x7E,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x00,/*缸,14*/0x80,0x80,0x88,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0x88,0x80,0x80,0x00,0x20,0x20,0x10,0x08,0x04,0x02,0x01,0xFF,0x01,0x02,0x04,0x08,0x10,0x20,0x20,0x00,/*未,15*/};//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); //延时}/***************自动运行******************/void Auto_Run(){bit Cylinder_11,Cylinder_21; //气缸进标志位bit Motor_11,Motor_21; //电机进标志位OUT_10; //前气缸进OUT_30; //后气缸进do{do{key_reset();for(;kcounter10;) //输入端口循环5次{if(~!KEY_2) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(!KEY_2) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(1);Cylinder_10;OUT_11; //关前气缸}}//前气缸进停止key_reset();for(;kcounter10;) //输入端口循环5次{if(~!KEY_3) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(!KEY_3) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(2);Cylinder_20;OUT_31; //关后气缸}}//后气缸进停止}while( Cylinder_1||Cylinder_2); //或循环Motora_Ina10; // 电机前信号Motora_Ina21; // 电机前信号Motorb_Ina10; // 电机后信号Motorb_Ina21; // 电机后信号Motor_11; //Motor_21; //do{key_reset();for(;kcounter10;) //输入端口循环5次{if(~!KEY_5) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(!KEY_5) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(3);Motor_10;Motora_Ina11; // 电机前信号Motora_Ina21; // 电机前信号}}//前电机进停止key_reset();for(;kcounter10;) //输入端口循环5次{if(~!KEY_6) //输入端口低电平{Key_ValAdd(); //输入端口低电平 计数器加一状态标志加一}else if(!KEY_6) //输入端口高电平{ //Key_Clear(); //按键计数器加一 状态标志归零}if(kstatus8) /*按键状态标志大于等于3为有效值*/{dis_Val(2);Motor_20;Motorb_Ina11; // 电机后信号Motorb_Ina21; // 电机后信号}}//后电机进停止}while(Motor_1||Motor_2); //或循环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);}/******************** 主函数 **************************/void main(void){IO_int();Initial_LY096BG30();cleardisp();Diswait();Counter0;dis_Val1(0X12); //第三行显示十进制数18while(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}}

相关文章:

STC8H8K32U按键控制OLED显示

手动按键按下,OLED显示对应键值 气缸前进后退电机正反转本文实现了一个基于STC8H单片机的按键检测与OLED显示系统。系统通过8个独立按键输入信号,采用消抖算法检测有效按键,并在OLED屏幕上实时显示对应按键编号。程序包含OLED初始化、I2C通信协议实现、按…...

流形优化实战:从特征值问题到Grassmann流形的算法探索

1. 流形优化与特征值问题的奇妙碰撞 第一次听说"流形优化"这个词时,我正被一个工程项目的振动分析问题困扰。当时需要计算大型结构矩阵的前几个最小特征值,传统算法要么收敛太慢,要么内存消耗惊人。直到一位数学系的朋友建议我试试…...

Vivado时序报错排查与跨时钟域处理实战指南

1. Vivado时序报错排查基础 遇到Vivado时序报错时,很多开发者第一反应是直接修改约束文件,这其实是个误区。我建议先从代码层面入手排查,因为大多数时序问题根源都在RTL设计上。打开Vivado的时序报告,你会看到类似"Setup/Hol…...

反激电源设计(9)——补偿器参数优化实战

1. 从理论到实战:为什么补偿器参数优化如此重要? 做过反激电源设计的朋友都知道,补偿器就像是电源系统的"大脑",它决定了整个电源的稳定性和动态响应。但很多工程师在设计时都会遇到这样的困境:明明按照理论…...

HunyuanVideo-Foley部署教程:NVIDIA Container Toolkit集成最佳实践

HunyuanVideo-Foley部署教程:NVIDIA Container Toolkit集成最佳实践 1. 环境准备与快速部署 在开始部署HunyuanVideo-Foley之前,我们需要确保硬件和软件环境满足要求。本教程将指导您完成从零开始的完整部署流程。 1.1 硬件要求检查 显卡&#xff1a…...

Embedded Coder vs Simulink Coder:如何为你的项目选择正确的代码生成工具?

Embedded Coder与Simulink Coder深度对比:从项目需求出发的选型指南 在嵌入式系统开发领域,代码生成工具的选择往往决定了项目的成败。当工程师面对MathWorks提供的两款核心代码生成工具——Embedded Coder和Simulink Coder时,如何做出明智决…...

新手必看!Qwen3-4B-Instruct-2507从部署到对话:vLLM+Chainlit全步骤解析

新手必看!Qwen3-4B-Instruct-2507从部署到对话:vLLMChainlit全步骤解析 1. 模型介绍与准备工作 1.1 Qwen3-4B-Instruct-2507核心优势 Qwen3-4B-Instruct-2507是阿里巴巴推出的轻量级大语言模型,专为指令跟随任务优化。相比前代版本&#x…...

Hunyuan模型支持蒙古语吗?少数民族语言翻译案例

Hunyuan模型支持蒙古语吗?少数民族语言翻译案例 1. 引言 随着全球化进程的加速,语言多样性保护和文化交流变得愈发重要。对于蒙古族同胞、语言学研究者和跨文化交流工作者来说,一个关键问题常常被提及:当前主流的大语言模型是否…...

OpenClaw+千问3.5-9B智能搜索:快速定位本地文件

OpenClaw千问3.5-9B智能搜索:快速定位本地文件 1. 为什么需要智能文件搜索 作为一个长期与代码和文档打交道的开发者,我经常陷入"文件存在但找不到"的困境。传统的文件名搜索在面对以下场景时显得力不从心: 只记得文档内容关键词…...

MacBook Pro运行OpenClaw与百川2-13B-4bits量化版:性能实测与调优

MacBook Pro运行OpenClaw与百川2-13B-4bits量化版:性能实测与调优 1. 为什么选择这个组合? 去年底换了M2 Max芯片的MacBook Pro后,我一直在寻找能充分利用本地算力的AI工作流。直到发现OpenClaw这个开源自动化框架,配合百川2-13…...

若依框架单体应用版:从建表到增删改查,代码生成器实战指南

1. 若依框架单体应用版快速上手 第一次接触若依框架时,我被它的代码生成器功能惊艳到了。作为一个长期奋战在业务开发一线的程序员,最头疼的就是重复编写那些千篇一律的增删改查代码。若依的单体应用版(前后端不分离)特别适合中小…...

Phi-4-mini-reasoning助力C语言项目:代码逻辑分析与缺陷检测

Phi-4-mini-reasoning助力C语言项目:代码逻辑分析与缺陷检测 1. 为什么C语言开发者需要AI辅助 在嵌入式系统、操作系统内核等对性能要求极高的领域,C语言依然是无可替代的选择。但随之而来的是复杂的内存管理、指针操作和并发控制带来的挑战。一个看似…...

seo快速优化软件使用教程_seo快速优化软件有哪些特点

SEO快速优化软件使用教程:SEO快速优化软件有哪些特点 在当今数字化时代,SEO(搜索引擎优化)已成为网站提升流量、提高曝光度的关键手段。而在SEO领域,使用SEO快速优化软件可以大大提高效率,让你在短时间内看…...

SEO排名推广软件如何选择_SEO排名推广软件如何监控排名

SEO排名推广软件如何选择 在当今数字营销的世界中,选择合适的SEO排名推广软件是每一个企业和个人网站成功的关键。无论你是初创企业还是已有一段时间在网络上站稳脚跟的品牌,了解如何选择SEO排名推广软件,并有效利用它们来提升你的网站排名&…...

Nanobot与Kubernetes集成:云原生部署方案

Nanobot与Kubernetes集成:云原生部署方案 1. 引言 在云原生时代,如何高效部署和管理AI应用成为开发者面临的重要挑战。Nanobot作为一个超轻量级的AI助手框架,以其仅4000行代码的精简设计和强大功能吸引了广泛关注。但当我们需要在生产环境中…...

LoongArch CPU设计中的内存接口实战:conver_ram.v模块详解与inout端口避坑指南

LoongArch CPU内存接口实战:conver_ram.v模块设计与三态总线控制精要 在CPU微架构设计中,内存子系统如同城市交通枢纽,其效率直接影响整体性能。本文将深入剖析LoongArch架构中BaseRAM/ExtRAM接口模块conver_ram.v的设计要点,特别…...

seo网络公司如何进行外链建设

SEO网络公司如何进行外链建设 在当今数字营销的世界里,外链建设是一个至关重要的环节。对于SEO网络公司来说,如何高效、合规地进行外链建设,不仅能提升网站的权重,还能带来更多的流量和业务机会。本文将深入探讨SEO网络公司如何进…...

SEO优化工作总结对网站的品牌推广有何影响_SEO优化工作总结如何推动网站排名的提升

SEO优化工作总结对网站的品牌推广有何影响 在当前的数字化时代,网站的SEO优化工作不仅仅是为了提升网站在搜索引擎中的排名,更是对整个品牌推广的重要支撑。SEO优化工作总结能够帮助企业深刻理解自己的优势和不足,从而制定更有效的品牌推广策…...

做seo网站优化大概需要多少钱

SEO网站优化的费用:一个详细的解析 在当今数字化时代,搜索引擎优化(SEO)已成为企业网站推广和品牌建设的重要手段。做SEO网站优化大概需要多少钱呢?这不仅是企业决策者关心的问题,也是许多网站运营者需要深…...

短视频 seo 自动推广工具有哪些_短视频 seo 自动推广的效果评估指标有哪些

短视频 seo 自动推广工具有哪些 在当今数字时代,短视频平台已经成为了人们获取信息、娱乐和学习的重要途径。无论是年轻人还是中年人,短视频都有着广泛的用户基础。因此,如何通过短视频 seo 自动推广工具来提升自己的内容曝光度成为了众多内…...

霜儿-汉服-造相Z-Turbo镜像5分钟上手:零基础生成古风汉服少女图

霜儿-汉服-造相Z-Turbo镜像5分钟上手:零基础生成古风汉服少女图 1. 镜像简介:一键生成古风汉服少女 想快速生成唯美的古风汉服少女图片,却苦于复杂的AI模型部署?霜儿-汉服-造相Z-Turbo镜像为你提供了开箱即用的解决方案。这个预…...

终极Reloaded-II完全指南:如何轻松打造你的游戏模组世界 [特殊字符]

终极Reloaded-II完全指南:如何轻松打造你的游戏模组世界 🎮 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II 还在为复杂的…...

Ubuntu 上安装 ComfyUI(NVIDIA GPU / Conda / CUDA 12.1)

这份教程适用于:UbuntuNVIDIA 显卡使用 Conda 管理环境使用 PyTorch CUDA 12.1从源码启动 ComfyUI一、准备条件开始前请确认:已安装 Anaconda 或 Miniconda电脑已正确安装 NVIDIA 驱动终端里执行 nvidia-smi 能看到显卡信息系统可以正常访问 GitHub二、安…...

Typescript interface

我来详细展开 接口(Interface) 的具体用法,配合实际例子:---1. 基础对象接口 // 定义用户接口 interface User {id: number;name: string;email: string; }// 使用接口 const user: User {id: 1,name: "张三",email: &…...

StructBERT中文句子匹配效果展示:AI客服对话中用户多轮提问语义连贯性分析

StructBERT中文句子匹配效果展示:AI客服对话中用户多轮提问语义连贯性分析 1. 项目背景与工具介绍 StructBERT中文句子相似度分析工具是基于阿里达摩院开源的先进预训练模型开发的本地化语义匹配解决方案。这个工具专门针对中文语言特点进行了深度优化&#xff0c…...

Qwen3-14B大模型推理部署教程:支持对话/生成/推理多任务实战

Qwen3-14B大模型推理部署教程:支持对话/生成/推理多任务实战 1. 快速了解Qwen3-14B镜像 Qwen3-14B是通义千问推出的大语言模型,支持对话、文本生成和逻辑推理等多种任务。这个私有部署镜像经过专门优化,让你能在自己的硬件上快速运行这个强…...

文墨共鸣功能全解析:StructBERT双塔/单塔架构怎么选?

文墨共鸣功能全解析:StructBERT双塔/单塔架构怎么选? 1. 理解文墨共鸣的核心功能 文墨共鸣是一个融合深度学习技术与传统美学的语义相似度分析系统。它能够判断两段中文文本在语义层面的相似程度,并以独特的水墨风格界面呈现结果。这个系统…...

OpenClaw飞书机器人进阶:Qwen3.5-9B-AWQ-4bit实现图片自动分析

OpenClaw飞书机器人进阶:Qwen3.5-9B-AWQ-4bit实现图片自动分析 1. 为什么需要图片自动分析助手 上周整理项目资料时,我发现自己电脑里堆满了会议白板照片、产品截图和手写笔记。手动整理这些图片不仅耗时,还经常漏掉关键信息。直到发现Open…...

一口气读懂 PCA 主成分分析:从原理到代码,本科生/研究生都能彻底学会

一口气读懂 PCA 主成分分析:从原理到代码,本科生/研究生都能彻底学会 大家好,今天我们用最通俗、最详细、最不绕弯子的方式,把 PCA(主成分分析) 讲明白。 不管你是刚接触机器学习的本科生,还是做…...

最通俗的 LDA 线性判别分析教程

🔥 最通俗的 LDA 线性判别分析教程(本科生/研究生都能懂) 大家好,今天我们来彻底吃透LDA(线性判别分析)。 这是机器学习、模式识别、数据降维里必考、必用、必懂的算法,面试、比赛、写论文都高频…...