华佗养生网
您的当前位置:首页STC单片机C语言通用万能编程模板

STC单片机C语言通用万能编程模板

来源:华佗养生网


、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 #include #include #include 6

//数据流输入/输出

//定义各种数据类型最值常量

//定义本地化函数

//定义数学函数

//定义输入/输出函数

//定义杂项函数及内存分配函数

//字符串处理

个人收集整理,勿做商业用途

#include //基于数组的输入/输出

#include //定义关于时间的函数

#include #include #include sfr [自定义名] = [SFR地址] ; sfr P1 = 0x90;

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

因篇幅问题不能全部显示,请点此查看更多更全内容