《8051单片机C语言编程模板》
1.函数头文件 .............................................................................................................................................................................................................. 2 2.毫秒级CPU延时函数 ............................................................................................................................................................................................ 4 3.定时/计数器初始化函数 ......................................................................................................................................................................................... 5 4.定时/计数器1中断处理函数 ................................................................................................................................................................................. 6 5.定时/计数器0中断处理函数 ................................................................................................................................................................................. 7 6.PWM初始化函数 ................................................................................................................................................................................................... 8 7.PWM0占空比设置函数 ......................................................................................................................................................................................... 9 8.UART串口初始化函数 ........................................................................................................................................................................................ 10 9.UART串口接收中断处理函数 ............................................................................................................................................................................ 11 10.UART串口发送函数 .......................................................................................................................................................................................... 12 11.UART串口发送字符串函数 .............................................................................................................................................................................. 13 12.外部中断INT初始化函数 ................................................................................................................................................................................. 15 13.外部中断INT1中断处理程序 ........................................................................................................................................................................... 15 14.外部中断INT0中断处理程序 ........................................................................................................................................................................... 16 15.普通I/O口模拟PWM生成程序 ...................................................................................................................................................................... 16 16.LCD驱动 ............................................................................................................................................................................................................. 17 17.DS18B20温度传感器驱动 .................................................................................................................................................................................. 19 18.LCM2402(1602也适用)驱动程序 ................................................................................................................................................................ 22 19.主函数 .................................................................................................................................................................................................................. 26 20. 8个独立式键盘驱动程序 .................................................................................................................................................................................. 28 21. 16个阵列式键盘驱动程序 ................................................................................................................................................................................ 29
\\\\
1.函数头文件
/****************************************************************************** 程序名: 编写人:
编写时间: 20 年 月 日 硬件支持: 接口说明: 修改日志: NO.1-
/****************************************************************************** 说明:
/*****************************************************************************/ #include //通用89C51头文件(只留下实际使用的单片机所对应的头文件) #include #include #include #include #include #include \\\\ #include sfr [自定义名] = [SFR地址] ; //按字节定义SFR中的存储器名。例:sfr P1 = 0x90; sbit [自定义名] = [系统位名] ; //按位定义SFR中的存储器名。例:sbit Add_Key = P3 ^ 1; bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED; #define [代替名] [原名] #define KEY P1 sbit SPEAKER = P3^7; sbit DQ = P2 ^ 5; sbit RS = P1^0; sbit RW = P1^1; sbit E = P1^2; #define Lcd_Bus P0 unsigned char [自定义名] ; unsigned int [自定义名] ; data 字节寻址片内RAM,片内RAM的128字节 bdata 可位寻址片内RAM,16字节,从0x20到0x2F idata 所有片内RAM,256字节,从0x00到0xFF pdata 片外RAM,256字节,从0x00到0xFF xdata 片外RAM,64K字节,从0x00到0xFFFF code ROM存储器,64K字节,从0x00到0xFFFF //用代替名代替原名。例:#define LED P1 / #define TA 0x25 //键盘所连接的I/O接口组定义 //扬声器连接定义 //ds18B20 //模式位,为0输入指令,为1输入数据 //读写位,为0读,为1写 //使能位 //数据总线 //定义一个0~255的整数变量。 //定义一个0~65535的整数变量。 data unsigned char a;) bdata unsigned char a;) idata unsigned char a;) pdata unsigned char a;) xdata unsigned char a;) code unsigned char a;) (例: (例: (例: (例: (例: (例:\\\\ 2.毫秒级CPU延时函数 /****************************************************************************** 函数名:毫秒级CPU延时函数 调 用:DELAY_MS (?); 参 数:1~65535(参数不可为0) 返回值:无 结 果:占用CPU方式延时与参数数值相同的毫秒时间 备 注:应用于1T单片机时i<600,应用于12T单片机时i<125(在此预为1T单片机数值) /*****************************************************************************/ void DELAY_MS ( unsigned int a ) { unsigned int i; while ( --a != 0) { for(i = 0; i < 600; i++); } } /*****************************************************************************/ ----------------------------------------------------------------------------- M1 M0 方式 说明 0 0 0 13位T/C,由TL低5位和TH的8位组成13位计数器 0 1 1 16位T/C,TL和TH共16位计数器 1 0 2 8位T/C,TL用于计数,当TL溢出时将TH中的值自动写入TL 1 1 3 两组8位T/C ----------------------------------------------------------------------------- \\\\ 3.定时/计数器初始化函数 /****************************************************************************** 函数名:定时/计数器初始化函数 调 用:T_C_init(); 参 数:无 返回值:无 结 果:设置SFR中T/C1和(或)T/C0相关参数 备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽 /*****************************************************************************/ void T_C_init (void) { TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ] EA = 1; //中断总开关 TH1 = 0xFF; //16位计数寄存器T1高8位(写入初值) TL1 = 0xFF; //16位计数寄存器T1低8位 ET1 = 1; //T/C1中断开关 TR1 = 1; //T/C1启动开关 //TH0 = 0x3C; //16位计数寄存器T0高8位 //TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时) //ET0 = 1; //T/C0中断开关 //TR0 = 1; //T/C0启动开关 } /*****************************************************************************/ \\\\ 4.定时/计数器1中断处理函数 /****************************************************************************** 函数名:定时/计数器1中断处理函数 调 用:[T/C1溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /*****************************************************************************/ void T_C1 (void) interrupt 3 using 3 //切换寄存器组到3 { TH1 = 0x3C; //16位计数寄存器T1高8位(重新写入初值) TL1 = 0xB0; //16位计数寄存器T1低8位(0x3CB0 = 50mS延时) //函数内容 } /*****************************************************************************/ \\\\ 5.定时/计数器0中断处理函数 /****************************************************************************** 函数名:定时/计数器0中断处理函数 调 用:[T/C0溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /*****************************************************************************/ void T_C0 (void) interrupt 1 using 1 //切换寄存器组到1 { TH0 = 0x3C; //16位计数寄存器T0高8位(重新写入初值) TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时) //函数内容 } /*****************************************************************************/ \\\\ 6.PWM初始化函数 /****************************************************************************** 函数名:PWM初始化函数 调 用:PWM_init(); 参 数:无 返回值:无 结 果:将PCA初始化为PWM模式,初始占空比为0 备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可 /*****************************************************************************/ void PWM_init (void) { CMOD=0x02; //设置PCA定时器 CL=0x00; CH=0x00; CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010) CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同 CCAP0H=0x00; // PWM0初始时为0 //CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//) \\\\ //CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同 //CCAP1H=0x00; // PWM1初始时为0 //CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式 //CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同 //CCAP2H=0x00; // PWM2初始时为0 //CCAPM3=0x42; //PWM3设置PCA工作方式为PWM方式 //CCAP3L=0x00; //设置PWM3初始值与CCAP0H相同 //CCAP3H=0x00; // PWM3初始时为0 CR=1; //启动PCA定时器 } /*****************************************************************************/ 7.PWM0占空比设置函数 /****************************************************************************** 函数名:PWM0占空比设置函数 \\\\ 调 用:PWM0_set(); 参 数:0x00~0xFF(亦可用0~255) 返回值:无 结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平 备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可 /*****************************************************************************/ void PWM0_set (unsigned char a) { CCAP0L= a; //设置值直接写入CCAP0L CCAP0H= a; //设置值直接写入CCAP0H } /*****************************************************************************/ 8.UART串口初始化函数 /****************************************************************************** 函数名:UART串口初始化函数 调 用:UART_init(); 参 数:无 返回值:无 结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用) 备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ] /*****************************************************************************/ void UART_init (void) { EA = 1; //允许总中断(如不使用中断,可用//屏蔽) ES = 1; //允许UART串口的中断 //TMOD = 0x20; //定时器T/C1工作方式2 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) \\\\ //TH1 = 0xF3; //定时器初值高8位设置 //TL1 = 0xF3; //定时器初值低8位设置 PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) //TR1 = 1; //定时器启动 } /*****************************************************************************/ 9.UART串口接收中断处理函数 /****************************************************************************** 函数名:UART串口接收中断处理函数 调 用:[SBUF收到数据后中断处理] 参 数:无 返回值:无 结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去) 备 注:过长的处理程序会影响后面数据的接收 /*****************************************************************************/ void UART_R (void) interrupt 4 using 1 //切换寄存器组到1 { unsigned char UART_data; //定义串口接收数据变量(需要对接受到的数据进行处理时,可将其定义为全局变量) RI = 0; //令接收中断标志位为0(软件清零) UART_data = SBUF; //将接收到的数据送入变量 UART_data \\\\ //用户函数内容(用户可使用UART_data做数据处理) //SBUF = UART_data; //将接收的数据发送回去(删除//即生效) //while(TI == 0); //检查发送中断标志位 //TI = 0; //令发送中断标志位为0(软件清零) } /*****************************************************************************/ 10.UART串口发送函数 /****************************************************************************** 函数名:UART串口发送函数 调 用:UART_T (?); 参 数:需要UART串口发送的数据(8位/1字节) 返回值:无 结 果:将参数中的数据发送给UART串口,确认发送完成后退出 备 注: /*****************************************************************************/ void UART_T (unsigned char UART_data) //定义串口发送数据变量 { SBUF = UART_data; //将接收的数据发送回去 \\\\ while(TI == 0); //检查发送中断标志位 TI = 0; //令发送中断标志位为0(软件清零) } /*****************************************************************************/ 11.UART串口发送字符串函数 /****************************************************************************** 函数名:UART串口发送字符串函数 调 用:UART_TC (?); 参 数:需要UART串口发送的数据(8位/1字节) 返回值:无 结 果:向串口发送一个字符串,长度不限。 备 注:例:UART_TC(\"d9887321\"); 此函数需要#include /*****************************************************************************/ void UART_TC (unsigned char *str) \\\\ { } /*****************************************************************************/ 中断入口说明 [中断入口说明] interrupt 0 外部中断0(ROM入口地址:0x03) interrupt 1 定时/计数器中断0(ROM入口地址:0x0B) interrupt 2 外部中断1(ROM入口地址:0x13) interrupt 3 定时/计数器中断1(ROM入口地址:0x1B) interrupt 4 UART串口中断(ROM入口地址:0x23) (更多的中断依单片机型号而定,ROM中断入口均相差8个字节) using 0 使用寄存器组0 using 1 使用寄存器组1 using 2 使用寄存器组2 using 3 使用寄存器组3 while(*str != '\\0') { UART_T(*str); *str++; } *str = 0; \\\\ 12.外部中断INT初始化函数 /****************************************************************************** 函数名:外部中断INT初始化函数 调 用:INT_init(); 参 数:无 返回值:无 结 果:启动外部中断INT1、INT0中断,设置中断方式 备 注: /*****************************************************************************/ void INT_init (void) { EA = 1; //中断总开关 EX1 = 1; //允许外部中断1中断 EX0 = 1; //允许外部中断0中断 IT1 = 1; //1:下沿触发 0:低电平触发 IT0 = 1; //1:下沿触发 0:低电平触发 } /*****************************************************************************/ 13.外部中断INT1中断处理程序 /****************************************************************************** 函数名:外部中断INT1中断处理程序 调 用:[外部引脚INT1中断处理] 参 数:无 返回值:无 结 果:用户处理外部中断信号 \\\\ 备 注: /*****************************************************************************/ void INT_1 (void) interrupt 2 using 2 //切换寄存器组到2 { //用户函数内容 } /*****************************************************************************/ 14.外部中断INT0中断处理程序 /****************************************************************************** 函数名:外部中断INT0中断处理程序 调 用:[外部引脚INT0中断处理] 参 数:无 返回值:无 结 果:用户处理外部中断信号 备 注: /*****************************************************************************/ void INT_0 (void) interrupt 0 using 2 //切换寄存器组到2 { //用户函数内容 } /*****************************************************************************/ 15.普通I/O口模拟PWM生成程序 /****************************************************************************** 函数名:普通I/O口模拟PWM生成程序 调 用:display (?) 备 注: \\\\ /*****************************************************************************/ void display (unsigned int a) //显示程序(50ms的PWM宽度) { DY_PORT = 0x00; //LED小灯亮 delay (a); //延时a的长度 DY_PORT = 0xff; //LED小灯灭 delay (DY_PWM-a); //延时总PWM长度减a } /*****************************************************************************/ 16.LCD驱动 /*****************************************************************************/ //LCD驱动(DY12864CBL液晶显示屏并口驱动程序) /*****************************************************************************/ void chk_busy() //检查忙位(底层) { RS=0; RW=1; E=1; Lcd_Bus=0xff; while((Lcd_Bus&0x80)==0x80); E=0; } /*****************************************************************************/ void write_com(unsigned char cmdcode) //写命令到LCD(底层) \\\\ { chk_busy(); RS=0; RW=0; E=1; Lcd_Bus=cmdcode; E=0; } /*****************************************************************************/ void write_data(unsigned char Dispdata) //写数据到LCD(底层) { chk_busy(); RS=1; RW=0; E=1; Lcd_Bus=Dispdata; E=0; } /*****************************************************************************/ void lcm_init() //初始化LCD屏(被调用层) { write_com(0x30); //选择8bit数据流 write_com(0x0c); //开显示(无游标、不反白) write_com(0x01); //清除显示,并且设定地址指针为00H } /*****************************************************************************/ void lcm_w_word(unsigned char *s) //向LCM发送一个字符串,长度64字符之内。(被调用层) { while(*s>0) //应用:lcm_w_word(\"您好!\"); { write_data(*s); \\\\ s++; } } /*****************************************************************************/ void lcm_w_test(bit i,unsigned char word) //写指令或数据(被调用层) { if(i == 0) { write_com(word); //写指令或数据(0,指令) } else { write_data(word); //写指令或数据(1,数据) } } /*****************************************************************************/ void lcm_clr(void) //清屏函数 { lcm_w_test(0,0x01); } /*****************************************************************************/ 17.DS18B20温度传感器驱动 /*****************************************************************************/ //DS18B20温度传感器驱动(显示0至60度) \\\\ /*****************************************************************************/ void Delay(int num) //延时函数 { while(num--) ; } /*****************************************************************************/ void Init_DS18B20(void) //初始化ds1820 { unsigned char x=0; DQ = 1; //DQ复位 Delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 Delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 Delay(20); } /*****************************************************************************/ unsigned char ReadOneChar(void) //读一个字节 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay(4); \\\\ } return(dat); } /*****************************************************************************/ void WriteOneChar(unsigned char dat) //写一个字节 { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay(5); DQ = 1; dat>>=1; } } /*****************************************************************************/ unsigned int ReadTemperature(void) //读取温度 { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 \\\\ t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); } /*****************************************************************************/ 18.LCM2402(1602也适用)驱动程序 /*****************************************************************************/ // 以下是LCM2402(1602也适用)驱动程序 // /*****************************************************************************/ /****************************************************************************** // 引脚定义 // (使用者根据实际更改) /*****************************************************************************/ #define LCM2402_DB0_DB7 P1 // 定义LCM2402的数据总线 sbit LCM2402_RS = P3 ^ 2; // 定义LCM2402的RS控制线 sbit LCM2402_RW = P3 ^ 3; // 定义LCM2402的RW控制线 sbit LCM2402_E = P3 ^ 4; // 定义LCM2402的E控制线 sbit LCM2402_Busy = P1 ^ 7; // 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联) /****************************************************************************** // 定义LCM2402指令集 // (详细请见技术手册) /*****************************************************************************/ #define CMD_clear 0x01 // 清除屏幕 \\\\ #define CMD_back 0x02 // DDRAM回零位 #define CMD_dec1 0x04 // 读入后AC(指针)减1,向左写 #define CMD_add1 0x06 // 读入后AC(指针)加1,向右写 #define CMD_dis_gb1 0x0f // 开显示_开光标_开光标闪烁 #define CMD_dis_gb2 0x0e // 开显示_开光标_关光标闪烁 #define CMD_dis_gb3 0x0c // 开显示_关光标_关光标闪烁 #define CMD_OFF_dis 0x08 // 关显示_关光标_关光标闪烁 #define CMD_set82 0x38 // 8位总线_2行显示 #define CMD_set81 0x30 // 8位总线_1行显示(上边行) #define CMD_set42 0x28 // 4位总线_2行显示 #define CMD_set41 0x20 // 4位总线_1行显示(上边行) #define lin_1 0x80 // 4位总线_1行显示(上边行) #define lin_2 0xc0 // 4位总线_1行显示(上边行) /****************************************************************************** // 读LCM忙程序 [底层协议] // (所有底层协议都无需关注) // LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态 // /*****************************************************************************/ void LCM2402_TestBusy(void) { LCM2402_DB0_DB7 = 0xff; //设备读状态 LCM2402_RS = 0; LCM2402_RW = 1; LCM2402_E = 1; while(LCM2402_Busy); //等待LCM不忙 LCM2402_E = 0; } /****************************************************************************** // 写指令程序 // // 向LCM2402写命令 本函数需要1个指令集的入口参数 // /*****************************************************************************/ \\\\ void LCM2402_WriteCMD(uint8 LCM2402_command) { LCM2402_TestBusy(); LCM2402_DB0_DB7 = LCM2402_command; LCM2402_RS = 0; LCM2402_RW = 0; LCM2402_E = 1; LCM2402_E = 0; } /****************************************************************************** // 写数据程序 // // 向LCM2402写数据 // /*****************************************************************************/ void LCM2402_WriteData(uint8 LCM2402_data) { LCM2402_TestBusy(); LCM2402_DB0_DB7 = LCM2402_data; LCM2402_RS = 1; LCM2402_RW = 0; LCM2402_E = 1; LCM2402_E = 0; } /****************************************************************************** // 打印字符串程序 // (本函数调用指针函数) // 向LCM发送一个字符串,长度48字符之内 // 第一行位置 0x00~0x17 第二行位置 0x40~0x57 // 应用举例:print(0x80,\"doyoung.net\"); //在第一行第一位处从左向右打印doyoung.net字符串 /*****************************************************************************/ void print(uint8 a,uint8 *str) { LCM2402_WriteCMD(a | 0x80); \\\\ } /****************************************************************************** // 打印单字符程序 // // 第一行位置 0x00~0x17 第二行位置 0x40~0x57 // 向LCM发送一个字符,以十六进制(0x00)表示 // 应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0” /*****************************************************************************/ void print2(uint8 a,uint8 t) { LCM2402_WriteCMD(a | 0x80); LCM2402_WriteData(t); } /****************************************************************************** // LCM2402初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改) /*****************************************************************************/ void LCM2402_Init(void) { LCM2402_WriteCMD(CMD_set82); //* 显示模式设置:显示2行,每个字符为5*7个像素 LCM2402_WriteCMD(CMD_clear); // 显示清屏 LCM2402_WriteCMD(CMD_back); //* 数据指针指向第1行第1个字符位置 LCM2402_WriteCMD(CMD_add1); // 显示光标移动设置:文字不动,光标右移 LCM2402_WriteCMD(CMD_dis_gb3); // 显示开及光标设置:显示开,光标开,闪烁开 } /*****************************************************************************/ while(*str != '\\0') { LCM2402_WriteData(*str++); } *str = 0; \\\\ 19.主函数 /****************************************************************************** 函数名:主函数 调 用:无 参 数:无 返回值:无 结 果:程序开始处,无限循环 备 注: /*****************************************************************************/ void main (void) { /****************************************************************************** 函数名:扬声器驱动 备 注: /*****************************************************************************/ unsigned char MUSIC; unsigned char STH0; unsigned char STL0; unsigned int code tab[]={ 64021,64103,64260,64400,//低音3开始 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178 }; void main(void) { TMOD=0x01; ET0=1; EA=1; \\\\ KEY = 0xff; while(1) { STH0=tab[MUSIC]/256; STL0=tab[MUSIC]%256; TR0=1; } else { SPEAKER = 1; TR0=0; } } } void t0(void) interrupt 1 using 0 { TH0=STH0; TL0=STL0; SPEAKER=~SPEAKER; } /*****************************************************************************/ \\\\ 20. 8个独立式键盘驱动程序 /****************************************************************************** 函数名:8个独立式键盘驱动程序 调 用:? = Key (); 参 数:无 返回值:unsigned char 键值0~8 结 果:有键按下时返回值为键值1~8,无键按下时返回值为0 备 注:在主函数中不断调用 /*****************************************************************************/ unsigned char Key ( ) //8个独立键盘处理程序 { unsigned char a,b; KEY = 0xff; //设定键盘初始电平状态 if (KEY != 0xff) //读取键盘状态是否改变 { Delay (20); //延时20ms去抖动 if (KEY != 0xff) //重新读取 { a = KEY; //寄存状态值到a } switch(a){ //键盘状态查表 case 0xfe: b = 1; break; case 0xfd: b = 2; break; case 0xfb: b = 3; break; case 0xf7: b = 4; break; case 0xef: b = 5; break; case 0xdf: b = 6; break; case 0xbf: b = 7; break; case 0x7f: b = 8; break; default: b = 0 ; break; \\\\ } } return (b); //将b中的键值代号送入函数返回值 } /*****************************************************************************/ 21. 16个阵列式键盘驱动程序 /****************************************************************************** 函数名:16个阵列式键盘驱动程序 调 用:? = Key (); 参 数:无 返回值:unsigned char 键值0~16 结 果:有键按下时返回值为键值1~16,无键按下时返回值为0 备 注:在主函数中不断调用 /*****************************************************************************/ unsigned char Key (void) //4*4阵列键盘处理程序 { unsigned char a,b,c; KEY = 0x0f; //设定键盘初始电平状态 if (KEY != 0x0f) //读取键盘状态是否改变 { Delay (20); //延时20ms去抖动 if (KEY != 0x0f) //重新读取 { a = KEY; //寄存状态值到a \\\\ } KEY = 0xf0; //设定键盘反向电平状态 c = KEY; //读取反向电平状态值到c a = a|c; //a与c相或 switch(a) //键盘状态查表 { case 0xee: b = 1; break; case 0xed: b = 2; break; case 0xeb: b = 3; break; case 0xe7: b = 4; break; case 0xde: b = 5; break; case 0xdd: b = 6; break; case 0xdb: b = 7; break; case 0xd7: b = 8; break; case 0xbe: b = 9; break; case 0xbd: b = 10; break; case 0xbb: b = 11; break; case 0xb7: b = 12; break; case 0x7e: b = 13; break; case 0x7d: b = 14; break; case 0x7b: b = 15; break; case 0x77: b = 16; break; default: b = 0 ; break; } } return (b); //将b中的键值代号送入函数返回值 } /*****************************************************************************/ T_C_init(); UART_init(); \\\\ INT_init(); LCM2402_Init(); //P1M0 = 0xff; //将P1接口设置为高阻态输入 (去掉“//”解除屏蔽) //P1M1 = 0x00; //触摸按键启用 //DELAY_MS (200); //延时等待I/O接口电平状态稳定 PWM_init(); //PWM初始化 //初始程序 while(1) { //无限循环程序 } } /*****************************************************************************/ 因篇幅问题不能全部显示,请点此查看更多更全内容