//* 输出: date - 返回的数据
//**********************************// uchar Read_Date(void) {
uchar date;
while(Busy()); //忙 RS = 1; RW = 1; E = 0; _nop_(); _nop_(); _nop_(); E = 1;
Delay_ms(1); date = P2; Delay_ms(1); E = 0; _nop_(); return date; }
//**********************************// //* 名称: Init_LCD() //* 功能: 初始化LCD //* 输入: 无 //* 输出: 无
//**********************************// void Init_LCD(void) {
Delay_ms(4);
PSB = 1;//并行方式 Delay_ms(4);
Write_Cmd(0x0c);//开显示关游标 Delay_ms(4);
Clear_Screen();//清屏 }
//**********************************// //* 名称: Location() //* 功能: 设定显示位置
//* 输入: x,y --X轴点 --Y轴点 //* x 只能是1-4中的一个数 //* Y 只能是0-7中的一个数 //* 输出: 无
//**********************************// void Location( uchar x, uchar y )
{
uchar position; if( x == 1 ) x = 0x80; else if( x == 2 ) x = 0x90; else if( x == 3 ) x = 0x88; else if( x == 4 ) x = 0x98; position = x + y;
Write_Cmd(position); Delay_ms(2); }
//**********************************// //* 名称: Clear_Screen() //* 功能: 清屏 //* 输入: 无 //* 输出: 无
//**********************************// void Clear_Screen(void) {
Write_Cmd(0x34); //扩充指令 Delay_ms(11); //10ms
Write_Cmd(0x30); //基本指令 Delay_ms(1);
Write_Cmd(0x01);//清屏 Delay_ms(10); }
//**********************************// //* 名称: Write_str()
//* 功能: 向12864里写字符串 //* 输入: *p -- 字符串地址 //* 输出: 无
//**********************************// void Write_str( uchar *p ) {
while( *p != '\\0' ) {
Write_Date(*p); p++; } }
//*********************************//
//* 名称:Printf_Decimal() //* 功能:打印浮点类型数据
//* 输入:double Num --要打印的数据 //* 输出:无
//*********************************// void Printf_Decimal(double Num) {
uchar s[6] = {0,0,46,0,0}; uint t;
t = (uint)(Num * 1000); s[0] = t/10000+48;
s[1] = t000/1000+48; s[3] = t00/100+48; s[4] = t0/10+48; s[5] = t+48; Location(1,2); Write_str(s); SendData(s[0]); SendData(s[1]); SendData(s[2]); SendData(s[3]); SendData(s[4]); SendData(s[5]); SendData('\\t'); }
//****************************************************************************//
// STC12C5A60S2 PCA/PWM模块 // //
// 说明: STC12C5A60S2单片机有两路可编程计数器阵列(PCA)模块,可用于软件
// 定时器,外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出 //
// 涉及寄存器:CMOD(PCA工作模式寄存器) CCON(PCA控制寄存器) // CCAPM0,CCAPM1(PCA比较/捕获寄存器)
// CH,CL(PCA的16位计数器)、CCAPnL,CCAPnH(PCA捕捉/比较寄存器)
// PCA_PWM0,PCA_PWM1(PCA模块PWM寄存器) // AUXR1(辅助寄存器1) // //
// 程序说明: 本程序实现对PCA/PWM模块的四种工作模式的测试。 //
// 注意:当选择相应的模式时,需在主函数内和中断服务内更改相应模式的初始
化
// 和相应的中断服务程序。去掉注释即可,若要更改相应模式的功能,需在相应
// 的初始化函数里更改相应的参数,脉宽调制(PWM)默认设置为无中断方式
////****************************************************************************//
#include
#define uchar unsigned char #define uint unsigned int
/*******高速模式变量更改*********/ #define FOSC 12000000
#define T100KHz (FOSC/2/100000) //高速脉冲输出频率计算: f = PCA模块的时钟源/(2*CCAP0L)
//CCAP0L = PCA时钟源/2/f /*******定时模式变量更改*********/
#define T5ms (0.005*FOSC) //定时计数值=T/(1/PCA的时钟源) /*******PWM模式变量更改**********/ #define DR_50 0x7f //50%占空比 #define DR_10 0x19 //10%占空比
/*******时钟源选择*******/ #define CLK_0 0x00 //Sysclk/12 #define CLK_1 0x02 //Sysclk/2
#define CLK_2 0x04 //定时器0的溢出脉冲
#define CLK_3 0x06 //ECI/P1.2(P4.1)输入的外部时钟 #define CLK_4 0x08 //Sysclk #define CLK_5 0x0a //Sysclk/4 #define CLK_6 0x0d //Sysclk/6 #define CLK_8 0x0e //Sysclk/8 /********模式选择********/
#define H_model 0x4d //高速输出模式,中断模式 #define T_model 0x49 //定时模式
#define P_model 0x42 //无中断PWM模式
#define PL_model 0x63 //由低变高可中断PWM模式 #define PH_model 0x53 //由高变低可中断PWM模式 #define PHL_model 0x73 //高低都可中断PWM模式 #define CU_model 0x61 //16位捕获,上升触发中断模式 #define CD_model 0x51 //16位捕获,下降触发中断模式 #define CUD_model 0x71 //16位捕获,跳变触发中断模式
uint value = T100KHz; //100kHz时的CCAP0L值
uint time = T5ms; //5ms时的CCAP0L和CCAP0H值
相关推荐: