📄 powercontrol.c
字号:
/******************************************************************************************
** 文 件: Power.C (包含文件为IAP.C)
** 功 能: 稳压电源控制程序
** 作 者:
** 创建时间: 2006.3.23
** 修 改:
** 修改时间: 2006.5.9 键盘+LCD功能实现,(仅串行口没调)
*******************************************************************************************/
#include "reg51.h"
#include "intrins.h" //C51库函数
#include "iap.c"
#define uint8 unsigned char
#define uint16 unsigned int
sbit Lcd_RS = P1^2; //开漏 LCD_RS
sbit Lcd_RW = P1^1; //开漏 LCD_RW
sbit Lcd_E = P1^0; //开漏 LCD_E
uint8 code Welcome[32] ={" Welcome to YCIT Version 1.0 "};//开始菜单
uint8 idata disp[32] ={" 00.00V 0.000A 00.00V 0.000A "};//显示缓存=在高端内存
uint8 code Power_Off[32] ={" ALL OUTPUT OFF YB3202 2006.5 "};//待机界面
uint8 code disp_err[14] ={"--Set Error--"}; //出错界面-(上一行)
uint8 code disp_save[16] ={"-- Save... -- "}; //出错界面-(上一行)
uint8 code restore_sys[32]={" RESTORE Num=1 (1-9) "};//系统参数恢复界面
uint8 code store_sys[32]={" STORE Num=1 (1-9) "};//系统参数存贮界面
uint16 code EEprom=0x1f00; //EEPROM 存贮首地址
uint8 code Cgram[32] ={ //自定义字符
0x00,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00, //上点
0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0e, //下点
0x00,0x0e,0x0e,0x0e,0x00,0x0e,0x0e,0x0e, //上下点
} ;
uint8 code Key_Num[16] ={14,6,5,4,15,9,8,7,12,11,10,0,13, 3, 2, 1,} ; // 键位表
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 键值
uint8 code set_disp[7]={"CH1-U ="}; //设定菜单
uint8 idata com,Run_Flag; //当前运行参数
uint8 Lcd_add,Lcd_data,i,i1,i2,t,k1; //Lcd地址,数据,全局变量
uint8 bdata Z_bit; //全局可位寻址的变量
uint8 code *zhou_dptr; //程序存贮器指针(000H-1fffH)
uint16 idata CH1_I,CH1_U,CH2_I,CH2_U; //参数-测量值
uint16 idata CH1I_set,CH1U_set,CH2I_set,CH2U_set; //参数-设定值
uint16 idata CH1I_set1,CH1U_set1,CH2I_set1,CH2U_set1; //参数-设定值
uint8 idata Buf_Rxd;
sfr Lcd_port = 0x80; //LCD端口==P0(0x80)
sbit err = Z_bit^0; //
sbit CH12_On = Z_bit^1; //主电源开关标志 0=CH1/2 OFF 1=CH1/2 ON
sbit CH3_On = Z_bit^2; //辅助电源开关标志 0=3.3V 1=5V
sbit U5_33 = Z_bit^3; //0=CH3关闭
sbit track = Z_bit^4; //1=跟踪 0=不跟踪
sbit track_add= Z_bit^5; //串/并输出标志 =0/1
sbit EA_flag = Z_bit^6; //中断标志
sbit Set_Flag = Z_bit^7; //参数修改标志(如果为1则说明修改了参数要存贮)
uint8 zhou,set_set,system_set;
//******************************************************************************
//
// 延 时: Ys10ms(uint8 t)
//
// 2006.3.23
//
//******************************************************************************
void DelayNS(uint8 t)
{
uint16 d1,d2;
for(d2=0; d2<t; d2++)
for (d1=0;d1<500;d1++);
}
/*
***********************************************************************************
** 函数名称:Wait5us()
** 函数功能:延时
** 入口参数:定时时间长度:8位
** 出口参数:无
**
** 修改时间: 2006.4.3
**
**
*********************************************************************************************************
*/
void Wait5us(uint16 dly){for(;dly>0;dly--);}
/*=================================================================
** 函数名称:uint8 WaitForEnable( void )
** 函数功能:等LCD空闲
** 入口参数:NO
** 出口参数:NO
** 说明: 正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
** DB7= 0 LCD控制器空闲; DB7= 1 LCD控制器忙
** 创建时间:2006.3.28
** 修改时间:2006.4.29
==================================================================*/
uint8 Lcd_Busy( void )
{
uint8 Lcd1;
Lcd_RS=0; //RS=0,RW=1
Lcd_RW=1;
Wait5us(5);
Lcd_E=1;
Wait5us(5);
Lcd1=Lcd_port; //从LCD读状态
Lcd_E=0; //读数据,操作允许脉冲信号
if(( Lcd1 & 0x80 )==0) return 0 ; //LCD不忙,返回0
return 1; //LCD忙,返回1
}
/*=======================================================
** 函数名称:void LcdWriteCommand( uint8 comm )
** 函数功能:写控制字符子程序: E=1 RS=0 RW=0
** 入口参数:NO
** 出口参数:NO
** 创建时间:2006.4.3
** 修改时间:2006.4.3
=======================================================*/
void LcdWriteCommand( uint8 comm)
{
while(Lcd_Busy()==1); //等LCD空闲
Lcd_RS=0; //Lcd_RS=0,Lcd_RW=0
Lcd_RW=0;
Wait5us(2);
Lcd_E=1;
Wait5us(5);
Lcd_port=comm; // 送控制字到LCD
Wait5us(5);
Lcd_E=0; // 下降沿打入数据,操作允许脉冲信号
Wait5us(2);
}
/*
*********************************************************************************************************
** 函数名称:void Lcd_Ram_Write(uint8 Lcd_data)
** 函数功能:送一个字节到LCD-RAM
** 入口参数:NO
** 出口参数:NO
** 创建时间:2006.4.3
** 修改时间:2006.4.25
*********************************************************************************************************
*/
void Lcd_Ram_Write(uint8 Lcd_a,uint8 Lcd_d)
{
if(Lcd_a > 0xf) Lcd_a=Lcd_a+0x30;
if(Lcd_a!=0xf0) LcdWriteCommand( 0x80+Lcd_a); //置AC
while (Lcd_Busy()==1); // 检测LCD忙信号,等LCD不忙
Lcd_RS=1; //RS=1,RW=0 数据写入LCD
Lcd_RW=0;
Lcd_E=1;
Wait5us(5);
Lcd_port=Lcd_d; //向LCD写数据
Lcd_E=0; // 下降沿打入数据
}
/*
**********************************************************************************
** 函数名称:void Lcd_reset(void)
** 函数功能:初始化LCD,2*16(2行) 8位数据宽度
** 入口参数:NO
** 出口参数:NO
** 创建时间:2006.4.6
** 修改时间:2006.4.6
**********************************************************************************
*/
void Lcd_reset()
{
uint8 idata i,addr=0;
LcdWriteCommand( 0x38); //写命令字0x38,8位数据宽度,2行/16 5*8
LcdWriteCommand( 0x01); //写命令字0x01,清显示
LcdWriteCommand( 0x06); //输入方式设定 AC自动加1
LcdWriteCommand( 0x0d); //开显示,光标+闪动 D2,D1(0=无光标),D0(1=闪动)
LcdWriteCommand( 0x80); //送地址:00H 一行:(00-27H) 二行:(40-67H)
for(i=0;i<16;i++) Lcd_Ram_Write(addr+i,0x20); //消显示
LcdWriteCommand( 0x80); //置AC=0
}
/*
*********************************************************************************************************
** 函数名称:void disp_flash(uint8)
** 函数功能:LCD刷新
** 入口参数:显示内容 0=welcome;1=disp;2=err
** 出口参数:NO
**
** 创建时间: 2006.3.19
**
** 修改时间: 2006.4.5
**
*********************************************************************************************************
*/
void disp_flash(uint8 t)
{
uint8 i;
if(t==0)
{
Lcd_add=0;
i=0;
while(i<32)
{
Lcd_Ram_Write(Lcd_add,Welcome[i]); //写入 LCD_RAM
if(Lcd_add==0x0f) LcdWriteCommand( 0xc0); //置AC=0x40 (第二行首位)
if(Lcd_add==0x1f) LcdWriteCommand( 0x80); //置AC=0x00 (第一行首位)
Lcd_add++;i++;
}
}
else if(t==1)
{
Lcd_add=0;
i=0;
while(i<32)
{
Lcd_Ram_Write(Lcd_add,disp[i]); //写入 LCD_RAM
if(Lcd_add==0x0f) LcdWriteCommand( 0xc0); //置AC=0x40 (第二行首位)
if(Lcd_add==0x1f) LcdWriteCommand( 0x80); //置AC=0x00 (第一行首位)
Lcd_add++;i++;
}
}
else if(t==2)
{
Lcd_add=0;
i=0;
while(i<32)
{
Lcd_Ram_Write(Lcd_add,Power_Off[i]); //写入 LCD_RAM
if(Lcd_add==0x0f) LcdWriteCommand( 0xc0); //置AC=0x40 (第二行首位)
if(Lcd_add==0x1f) LcdWriteCommand( 0x80); //置AC=0x00 (第一行首位)
Lcd_add++;i++;
}
}
}
/*
*********************************************************************************************************
** 函数名称:void Lcd_Cg_Write(uint8 Lcd_a,uint8 Lcd_d)
** 函数功能:向CG RAM写一个行自定义字符字模
** 入口参数:CG_RAM地址,字模数据
** 出口参数:NO
** 创建时间:2006.4.3
** 修改时间:2007.7.19
*********************************************************************************************************
*/
void Lcd_Cg_Write(uint8 Lcd_a,uint8 Lcd_d)
{
uint8 Lcd_z,z1;
z1=1;
while(z1==1)
{
LcdWriteCommand(0x40+Lcd_a); //置 CG RAM 地址
while (Lcd_Busy()==1); // 检测LCD忙信号,等LCD不忙
Wait5us(10);
Lcd_RS=1; //RS=1,RW=0 16个数据写入LCD 的CG_RAM
Lcd_RW=0;
Lcd_E=1;
Lcd_port=Lcd_d; //向LCD写数据
Wait5us(10);
Lcd_E=0; // 下降沿打入数据
while (Lcd_Busy()==1); // 检测LCD忙信号,等LCD不忙
Lcd_E=1;
Lcd_RS=1; //RS=1,RW=1 数据读到D0-D7
Lcd_RW=1;
Wait5us(10);
Lcd_z=Lcd_port;
if(Lcd_z!=Lcd_d) z1=1;
else z1=0; //退出
}
}
/*
*********************************************************************************************************
** 函数名称:
** 函数功能:
** 入口参数:NO
** 出口参数:NO
** 创建时间:2006.4.3
** 修改时间:2006.4.25
*********************************************************************************************************
*/
void Lcd_set_CG(void)
{
for(i=0;i<24;i++)
{
Lcd_Cg_Write(i,Cgram[i]); //向CG RAM 地址set_i中写入Cgram[set_i]
}
}
/******************************************************
**
** 主程序开始
**
**
**
** 2006年5月1日
** 修改: 2006.9.6
**
******************************************************/
void main(void)
{
while (Lcd_Busy()==1); // 检测LCD忙信号,等LCD不忙
Lcd_reset();
LcdWriteCommand( 0x0c); //消光标并不闪
DelayNS(50);
disp_flash(0); /* 0=刷新WELCOME 1=刷新set 2=刷新 OFF */
/*----------------------- 主程序循环体开始 ----------------------------------*/
while(1)
{
DelayNS(5); //延时---!!!!不能过长,否则会复位
} //主程序循环体结束
} //主程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -