、STC单片机C语言通用万能编程模板
———————————————————————————————— 作者:
———————————————————————————————— 日期:
2
个人收集整理,勿做商业用途
《8051单片机C语言编程模板》
1.函数头文件 .............................................................................................................................................................................................................................................. 4 2.毫秒级CPU延时函数 ............................................................................................................................................................................................................................ 9 3.定时/计数器初始化函数 ...................................................................................................................................................................................................................... 12 4.定时/计数器1中断处理函数 .............................................................................................................................................................................................................. 15 5.定时/计数器0中断处理函数 .............................................................................................................................................................................................................. 17 6.PWM初始化函数 ................................................................................................................................................................................................................................. 19 7.PWM0占空比设置函数 ...................................................................................................................................................................................................................... 22 8.UART串口初始化函数 ......................................................................................................................................................................................................................... 24 9.UART串口接收中断处理函数 ............................................................................................................................................................................................................. 26 10.UART串口发送函数 .......................................................................................................................................................................................................................... 28 11.UART串口发送字符串函数 .............................................................................................................................................................................................................. 30 12.外部中断INT初始化函数 ................................................................................................................................................................................................................. 33 13.外部中断INT1中断处理程序 ........................................................................................................................................................................................................... 35 14.外部中断INT0中断处理程序 ........................................................................................................................................................................................................... 37 15.普通I/O口模拟PWM生成程序 ..................................................................................................................................................................................................... 39 16.LCD驱动 ............................................................................................................................................................................................................................................. 40 17.DS18B20温度传感器驱动 ................................................................................................................................................................................................................ 48 18.LCM2402(1602也适用)驱动程序 .............................................................................................................................................................................................. 56 19.主函数 .................................................................................................................................................................................................................................................. 68 20. 8个式键盘驱动程序 ................................................................................................................................................................................................................. 73 21. 16个阵列式键盘驱动程序 ............................................................................................................................................................................................................... 77
3
个人收集整理,勿做商业用途
1.函数头文件
/******************************************************************************
程序名: 编写人: 编写时间:硬件支持:接口说明:修改日志:NO.1-
20 年
月 日
4
个人收集整理,勿做商业用途
/******************************************************************************
说明:
/*****************************************************************************/
#include //通用C51头文件(只留下实际使用的单片机所对应的头文件) #include #include #include #include 5 个人收集整理,勿做商业用途 #include #include #include //数据流输入/输出 //定义各种数据类型最值常量 //定义本地化函数 //定义数学函数 //定义输入/输出函数 //定义杂项函数及内存分配函数 //字符串处理 个人收集整理,勿做商业用途 #include #include #include sbit [自定义名] = [系统位名] ; sbit Add_Key = P3 ^ 1; bit [自定义名] ; 例:bit LED; 7 //宽字符处理及输入/输出 //宽字符分类 //51基本运算(包括_nop_空函数) //按字节定义SFR中的存储器名。例://按位定义SFR中的存储器名。例://定义一个位(位的值只能是0或1) 个人收集整理,勿做商业用途 #define [代替名] [原名] //用代替名代替原名。例:#define LED P1 / #define TA 0x25 #define KEY P1 //键盘所连接的I/O接口组定义 sbit SPEAKER = P3^7; sbit DQ = P2 ^ 5; sbit RS = P1^0; 入数据 sbit RW = P1^1; sbit E = P1^2; #define Lcd_Bus P0 8 //扬声器连接定义 //ds18B20 //模式位,为0输入指令,为1输 //读写位,为0读,为1写 //使能位 //数据总线 个人收集整理,勿做商业用途 unsigned char [自定义名] ; //定义一个0~255的整数变量。 unsigned int [自定义名] ; //定义一个0~65535的整数变量。 data 字节寻址片内RAM,片内RAM的128字节 (例:data unsigned char a;) bdata 可位寻址片内RAM,16字节,从0x20到0x2F (例:bdata unsigned char a;) idata 所有片内RAM,256字节,从0x00到0xFF (例:idata unsigned char a;) pdata 片外RAM,256字节,从0x00到0xFF (例:pdata unsigned char a;) xdata 片外RAM,K字节,从0x00到0xFFFF (例:xdata unsigned char a;) code ROM存储器,K字节,从0x00到0xFFFF (例:code unsigned char a;) 2.毫秒级CPU延时函数 9 个人收集整理,勿做商业用途 /****************************************************************************** 函数名:毫秒级CPU延时函数 调 用:DELAY_MS (?); 参 数:1~65535(参数不可为0) 返回值:无 结 果:占用CPU方式延时与参数数值相同的毫秒时间 备 注:应用于1T单片机时i<600,应用于12T单片机时i<125(在此预为1T单片机数值) /*****************************************************************************/ void DELAY_MS ( unsigned int a ) 10 个人收集整理,勿做商业用途 { unsigned int i; while ( --a != 0) { for(i = 0; i < 600; i++); } } /*****************************************************************************/ ----------------------------------------------------------------------------- 11 个人收集整理,勿做商业用途 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.定时/计数器初始化函数 /****************************************************************************** 函数名:定时/计数器初始化函数 12 个人收集整理,勿做商业用途 调 用: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 ] 13 个人收集整理,勿做商业用途 EA = 1; //中断总开关 TH1 = 0xFF; //16位计数寄存器T1高8位(写入初值) TL1 = 0xFF; ET1 = 1; TR1 = 1; //TH0 = 0x3C; //TL0 = 0xB0; 50mS延时) //ET0 = 1; //TR0 = 1; 14 //16位计数寄存器T1低8位 //T/C1中断开关 //T/C1启动开关 //16位计数寄存器T0高8位 //16位计数寄存器T0低8位(0x3CB0 = //T/C0中断开关 //T/C0启动开关 个人收集整理,勿做商业用途 } /*****************************************************************************/ 4.定时/计数器1中断处理函数 /****************************************************************************** 函数名:定时/计数器1中断处理函数 调 用:[T/C1溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 15 个人收集整理,勿做商业用途 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /*****************************************************************************/ void T_C1 (void) interrupt 3 { TH1 = 0x3C; 初值) TL1 = 0xB0; 50mS延时) } 16 //切换寄存器组到3 //16位计数寄存器T1高8位(重新写入 //16位计数寄存器T1低8位(0x3CB0 = //函数内容 using 3 个人收集整理,勿做商业用途 /*****************************************************************************/ 5.定时/计数器0中断处理函数 /****************************************************************************** 函数名:定时/计数器0中断处理函数 调 用:[T/C0溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 17 个人收集整理,勿做商业用途 /*****************************************************************************/ void T_C0 (void) interrupt 1 using 1 //切换寄存器组到1 { TH0 = 0x3C; //16位计数寄存器T0高8位(重新写入初值) TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时) //函数内容 } /*****************************************************************************/ 18 个人收集整理,勿做商业用途 6.PWM初始化函数 /****************************************************************************** 函数名:PWM初始化函数 调 用:PWM_init(); 参 数:无 返回值:无 结 果:将PCA初始化为PWM模式,初始占空比为0 备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可 /*****************************************************************************/ 19 个人收集整理,勿做商业用途 void PWM_init (void) { CMOD=0x02; CL=0x00; CH=0x00; CCAPM0=0x42; 0100 0010) CCAP0L=0x00; CCAP0H=0x00; //CCAPM1=0x42; 20 //设置PCA定时器 //PWM0设置PCA工作方式为PWM方式//设置PWM0初始值与CCAP0H相同 // PWM0初始时为0 //PWM1设置PCA工作方式为PWM方 ( 个人收集整理,勿做商业用途 式(使用时删除//) //CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同 //CCAP1H=0x00; //CCAPM2=0x42; //CCAP2L=0x00; //CCAP2H=0x00; //CCAPM3=0x42; //CCAP3L=0x00; //CCAP3H=0x00; 21 // PWM1初始时为0 //PWM2设置PCA工作方式为PWM方式//设置PWM2初始值与CCAP0H相同 // PWM2初始时为0 //PWM3设置PCA工作方式为PWM方式//设置PWM3初始值与CCAP0H相同 // PWM3初始时为0 个人收集整理,勿做商业用途 CR=1; //启动PCA定时器 } /*****************************************************************************/ 7.PWM0占空比设置函数 /****************************************************************************** 函数名:PWM0占空比设置函数 调 用:PWM0_set(); 参 数:0x00~0xFF(亦可用0~255) 返回值:无 22 个人收集整理,勿做商业用途 结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平 备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可 /*****************************************************************************/ void PWM0_set (unsigned char a) { CCAP0L= a; //设置值直接写入CCAP0L CCAP0H= a; //设置值直接写入CCAP0H } /*****************************************************************************/ 23 个人收集整理,勿做商业用途 8.UART串口初始化函数 /****************************************************************************** 函数名:UART串口初始化函数 调 用:UART_init(); 参 数:无 返回值:无 结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用) 备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ] /*****************************************************************************/ 24 个人收集整理,勿做商业用途 void UART_init (void) { EA = 1; 蔽) ES = 1; //TMOD = 0x20; SCON = 0x50; 0x40 时禁止串口接收) //TH1 = 0xF3; //TL1 = 0xF3; 25 //允许总中断(如不使用中断,可用//屏 //允许UART串口的中断 //定时器T/C1工作方式2 //串口工作方式1,允许串口接收(SCON = //定时器初值高8位设置 //定时器初值低8位设置 个人收集整理,勿做商业用途 PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) //TR1 = 1; //定时器启动 } /*****************************************************************************/ 9.UART串口接收中断处理函数 /****************************************************************************** 函数名:UART串口接收中断处理函数 调 用:[SBUF收到数据后中断处理] 参 数:无 26 个人收集整理,勿做商业用途 返回值:无 结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去) 备 注:过长的处理程序会影响后面数据的接收 /*****************************************************************************/ void UART_R (void) interrupt 4 using 1 //切换寄存器组到1 { unsigned char UART_data; //定义串口接收数据变量(需要对接受到的数据进行处理时,可将其定义为全局变量) RI = 0; //令接收中断标志位为0(软件清零) UART_data = SBUF; //将接收到的数据送入变量 UART_data 27 个人收集整理,勿做商业用途 //用户函数内容(用户可使用UART_data做数据处理) //SBUF = UART_data; //将接收的数据发送回去(删除//即生效) //while(TI == 0); //检查发送中断标志位 //TI = 0; //令发送中断标志位为0(软件清零) } /*****************************************************************************/ 10.UART串口发送函数 /****************************************************************************** 函数名:UART串口发送函数 28 个人收集整理,勿做商业用途 调 用:UART_T (?); 参 数:需要UART串口发送的数据(8位/1字节) 返回值:无 结 果:将参数中的数据发送给UART串口,确认发送完成后退出 备 注: /*****************************************************************************/ void UART_T (unsigned char UART_data) //定义串口发送数据变量 { SBUF = UART_data; //将接收的数据发送回去 29 个人收集整理,勿做商业用途 while(TI == 0); //检查发送中断标志位 TI = 0; //令发送中断标志位为0(软件清零) } /*****************************************************************************/ 11.UART串口发送字符串函数 /****************************************************************************** 函数名:UART串口发送字符串函数 调 用:UART_TC (?); 参 数:需要UART串口发送的数据(8位/1字节) 30 个人收集整理,勿做商业用途 返回值:无 结 果:向串口发送一个字符串,长度不限。 备 注:例:UART_TC(\"d9887321\"); 此函数需要#include /*****************************************************************************/ void UART_TC (unsigned char *str) { while(*str != '\\0') { UART_T(*str); 31 个人收集整理,勿做商业用途 *str++; } *str = 0; } /*****************************************************************************/ 中断入口说明 [中断入口说明] interrupt 0 外部中断0(ROM入口地址:0x03) interrupt 1 定时/计数器中断0(ROM入口地址:0x0B) 32 个人收集整理,勿做商业用途 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 12.外部中断INT初始化函数 33 个人收集整理,勿做商业用途 /****************************************************************************** 函数名:外部中断INT初始化函数 调 用:INT_init(); 参 数:无 返回值:无 结 果:启动外部中断INT1、INT0中断,设置中断方式 备 注: /*****************************************************************************/ void INT_init (void) 34 个人收集整理,勿做商业用途 { EA = 1; //中断总开关 EX1 = 1; //允许外部中断1中断 EX0 = 1; //允许外部中断0中断 IT1 = 1; //1:下沿触发 0:低电平触发 IT0 = 1; //1:下沿触发 0:低电平触发 } /*****************************************************************************/ 13.外部中断INT1中断处理程序 35 个人收集整理,勿做商业用途 /****************************************************************************** 函数名:外部中断INT1中断处理程序 调 用:[外部引脚INT1中断处理] 参 数:无 返回值:无 结 果:用户处理外部中断信号 备 注: /*****************************************************************************/ void INT_1 (void) interrupt 2 using 2 //切换寄存器组到2 36 个人收集整理,勿做商业用途 { //用户函数内容 } /*****************************************************************************/ 14.外部中断INT0中断处理程序 /****************************************************************************** 函数名:外部中断INT0中断处理程序 调 用:[外部引脚INT0中断处理] 参 数:无 37 个人收集整理,勿做商业用途 返回值:无 结 果:用户处理外部中断信号 备 注: /*****************************************************************************/ void INT_0 (void) interrupt 0 using 2 //切换寄存器组到2 { //用户函数内容 } /*****************************************************************************/ 38 个人收集整理,勿做商业用途 15.普通I/O口模拟PWM生成程序 /****************************************************************************** 函数名:普通I/O口模拟PWM生成程序 调 用:display (?) 备 注: /*****************************************************************************/ void display (unsigned int a) //显示程序(50ms的PWM宽度) { DY_PORT = 0x00; //LED小灯亮 39 个人收集整理,勿做商业用途 delay (a); //延时a的长度 DY_PORT = 0xff; //LED小灯灭 delay (DY_PWM-a); //延时总PWM长度减a } /*****************************************************************************/ 16.LCD驱动 /*****************************************************************************/ //LCD驱动(DY128CBL液晶显示屏并口驱动程序) /*****************************************************************************/ 40 个人收集整理,勿做商业用途 void chk_busy() //检查忙位(底层) { RS=0; RW=1; E=1; Lcd_Bus=0xff; while((Lcd_Bus&0x80)==0x80); E=0; } 41 个人收集整理,勿做商业用途 /*****************************************************************************/ void write_com(unsigned char cmdcode) //写命令到LCD(底层) { chk_busy(); RS=0; RW=0; E=1; Lcd_Bus=cmdcode; E=0; 42 个人收集整理,勿做商业用途 } /*****************************************************************************/ void write_data(unsigned char Dispdata) { chk_busy(); RS=1; RW=0; E=1; Lcd_Bus=Dispdata; 43 //写数据到LCD(底层) 个人收集整理,勿做商业用途 E=0; } /*****************************************************************************/ void lcm_init() //初始化LCD屏(被调用层) { write_com(0x30); //选择8bit数据流 write_com(0x0c); //开显示(无游标、不反白) write_com(0x01); //清除显示,并且设定地址指针为00H } 44 个人收集整理,勿做商业用途 /*****************************************************************************/ void lcm_w_word(unsigned char *s) //向LCM发送一个字符串,长度字符之内。(被调用层) { while(*s>0) { write_data(*s); s++; } } //应用:lcm_w_word(\"您好!\"); 45 个人收集整理,勿做商业用途 /*****************************************************************************/ void lcm_w_test(bit i,unsigned char word) //写指令或数据(被调用层) { if(i == 0) { write_com(word); } else { 46 //写指令或数据(0,指令) 个人收集整理,勿做商业用途 write_data(word); //写指令或数据(1,数据) } } /*****************************************************************************/ void lcm_clr(void) //清屏函数 { lcm_w_test(0,0x01); } /*****************************************************************************/ 47 个人收集整理,勿做商业用途 17.DS18B20温度传感器驱动 /*****************************************************************************/ //DS18B20温度传感器驱动(显示0至60度) /*****************************************************************************/ void Delay(int num) //延时函数 { while(num--) ; } /*****************************************************************************/ 48 个人收集整理,勿做商业用途 void Init_DS18B20(void) //初始化ds1820 { unsigned char x=0; DQ = 1; Delay(8); DQ = 0; Delay(80); DQ = 1; Delay(14); 49 //DQ复位 //稍做延时 //单片机将DQ拉低 //精确延时 大于 480us //拉高总线 个人收集整理,勿做商业用途 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--) 50 个人收集整理,勿做商业用途 { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; if(DQ) dat|=0x80; Delay(4); } return(dat); 51 // 给脉冲信号 个人收集整理,勿做商业用途 } /*****************************************************************************/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; 52 //写一个字节 个人收集整理,勿做商业用途 Delay(5); DQ = 1; dat>>=1; } } /*****************************************************************************/ unsigned int ReadTemperature(void) //读取温度 { unsigned char a=0; 53 个人收集整理,勿做商业用途 unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0x44); Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE); 54 // 跳过读序号列号的操作// 启动温度转换 //跳过读序号列号的操作 //读取温度寄存器 个人收集整理,勿做商业用途 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; return(t); } 55 //放大10倍输出并四舍五入 个人收集整理,勿做商业用途 /*****************************************************************************/ 18.LCM2402(1602也适用)驱动程序 /*****************************************************************************/ // 以下是LCM2402(1602也适用)驱动程序 // /*****************************************************************************/ /****************************************************************************** // 引脚定义 // (使用者根据实际更改) /*****************************************************************************/ #define LCM2402_DB0_DB7 P1 // 定义LCM2402的数据总线 56 个人收集整理,勿做商业用途 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回零位 57 与 (个人收集整理,勿做商业用途 #define CMD_dec1 0x04 // 读入后AC(指针)减1,向左写 #define CMD_add1 0x06 // 读入后AC(指针)加1,向右写 #define #define #define #define #define #define #define CMD_dis_gb1 CMD_dis_gb2 CMD_dis_gb3 CMD_OFF_dis CMD_set82 CMD_set81 CMD_set42 0x0f 0x0e 0x0c 0x08 0x38 0x30 0x28 58 // 开显示_开光标_开光标闪烁 // 开显示_开光标_关光标闪烁 // 开显示_关光标_关光标闪烁 // 关显示_关光标_关光标闪烁 // 8位总线_2行显示 // 8位总线_1行显示(上边行) // 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) { 59 个人收集整理,勿做商业用途 LCM2402_DB0_DB7 = 0xff; //设备读状态 LCM2402_RS = 0; LCM2402_RW = 1; LCM2402_E = 1; while(LCM2402_Busy); //等待LCM不忙 LCM2402_E = 0; } /****************************************************************************** // 写指令程序 // 60 个人收集整理,勿做商业用途 // 向LCM2402写命令 本函数需要1个指令集的入口参数 // /*****************************************************************************/ void LCM2402_WriteCMD(uint8 LCM2402_command) { LCM2402_TestBusy(); LCM2402_DB0_DB7 = LCM2402_command; LCM2402_RS = 0; LCM2402_RW = 0; LCM2402_E = 1; 61 个人收集整理,勿做商业用途 LCM2402_E = 0; } /****************************************************************************** // 写数据程序 // // 向LCM2402写数据 // /*****************************************************************************/ void LCM2402_WriteData(uint8 LCM2402_data) { LCM2402_TestBusy(); 62 个人收集整理,勿做商业用途 LCM2402_DB0_DB7 = LCM2402_data; LCM2402_RS = 1; LCM2402_RW = 0; LCM2402_E = 1; LCM2402_E = 0; } /****************************************************************************** // 打印字符串程序 // (本函数调用指针函数) // 向LCM发送一个字符串,长度48字符之内 63 个人收集整理,勿做商业用途 // 第一行位置 0x00~0x17 第二行位置 0x40~0x57 // 应用举例:print(0x80,\"doyoung.net\"); //在第一行第一位处从左向右打印doyoung.net字符串 /*****************************************************************************/ void print(uint8 a,uint8 *str) { LCM2402_WriteCMD(a | 0x80); while(*str != '\\0') { LCM2402_WriteData(*str++); 个人收集整理,勿做商业用途 } *str = 0; } /****************************************************************************** // 打印单字符程序 // // 第一行位置 0x00~0x17 第二行位置 0x40~0x57 // 向LCM发送一个字符,以十六进制(0x00)表示 // 应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0” /*****************************************************************************/ 65 个人收集整理,勿做商业用途 void print2(uint8 a,uint8 t) { LCM2402_WriteCMD(a | 0x80); LCM2402_WriteData(t); } /****************************************************************************** // LCM2402初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改) /*****************************************************************************/ void LCM2402_Init(void) 66 个人收集整理,勿做商业用途 { 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); // 显示开及光标设置:显示开,光标开,闪烁开 } /*****************************************************************************/ 67 个人收集整理,勿做商业用途 19.主函数 /****************************************************************************** 函数名:主函数 调 用:无 参 数:无 返回值:无 结 果:程序开始处,无限循环 备 注: /*****************************************************************************/ 68 个人收集整理,勿做商业用途 void main (void) { /****************************************************************************** 函数名:扬声器驱动 备 注: /*****************************************************************************/ unsigned char MUSIC; unsigned char STH0; unsigned char STL0; 69 个人收集整理,勿做商业用途 unsigned int code tab[]={ 021,103,260,400,//低音3开始 524,580,684,777, 820,8,968,65030, 65058,65110,65157,65178 }; void main(void) { TMOD=0x01; 70 个人收集整理,勿做商业用途 ET0=1; EA=1; KEY = 0xff; while(1) { STH0=tab[MUSIC]/256; STL0=tab[MUSIC]%256; TR0=1; } 71 个人收集整理,勿做商业用途 else { SPEAKER = 1; TR0=0; } } } void t0(void) interrupt 1 using 0 { 72 个人收集整理,勿做商业用途 TH0=STH0; TL0=STL0; SPEAKER=~SPEAKER; } /*****************************************************************************/ 20. 8个式键盘驱动程序 /****************************************************************************** 函数名:8个式键盘驱动程序 调 用:? = Key (); 73 个人收集整理,勿做商业用途 参 数:无 返回值:unsigned char 键值0~8 结 果:有键按下时返回值为键值1~8,无键按下时返回值为0 备 注:在主函数中不断调用 /*****************************************************************************/ unsigned char Key ( ) //8个键盘处理程序 { unsigned char a,b; KEY = 0xff; //设定键盘初始电平状态 74 个人收集整理,勿做商业用途 if (KEY != 0xff) //读取键盘状态是否改变 { Delay (20); if (KEY != 0xff) { a = KEY; } switch(a){ //键盘状态查表 case 0xfe: b = 1; break; 75 //延时20ms去抖动 //重新读取 //寄存状态值到a 个人收集整理,勿做商业用途 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; } 76 个人收集整理,勿做商业用途 } return (b); //将b中的键值代号送入函数返回值 } /*****************************************************************************/ 21. 16个阵列式键盘驱动程序 /****************************************************************************** 函数名:16个阵列式键盘驱动程序 调 用:? = Key (); 参 数:无 77 个人收集整理,勿做商业用途 返回值:unsigned char 键值0~16 结 果:有键按下时返回值为键值1~16,无键按下时返回值为0 备 注:在主函数中不断调用 /*****************************************************************************/ unsigned char Key (void) //4*4阵列键盘处理程序 { unsigned char a,b,c; KEY = 0x0f; //设定键盘初始电平状态 if (KEY != 0x0f) //读取键盘状态是否改变 78 个人收集整理,勿做商业用途 { Delay (20); //延时20ms去抖动 if (KEY != 0x0f) { a = KEY; } KEY = 0xf0; c = KEY; a = a|c; 79 //重新读取 //寄存状态值到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; 80 个人收集整理,勿做商业用途 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; 81 个人收集整理,勿做商业用途 default: b = 0 ; break; } } return (b); //将b中的键值代号送入函数返回值 } /*****************************************************************************/ T_C_init(); UART_init(); INT_init(); 82 个人收集整理,勿做商业用途 LCM2402_Init(); //P1M0 = 0xff; //将P1接口设置为高阻态输入 (去掉“//”解除屏蔽) //P1M1 = 0x00; //DELAY_MS (200); PWM_init(); while(1) { //触摸按键启用 //延时等待I/O接口电平状态稳定 //PWM初始化 //初始程序 //无限循环程序 83 个人收集整理,勿做商业用途 } } /*****************************************************************************/ 84
因篇幅问题不能全部显示,请点此查看更多更全内容