📄 mc041210.c
字号:
/****************************************************************************
* 梁小樑为明康冷媒加注控制器作
* 2004年11月21日
*ICC-AVR application builder : 2004-12-3 0:55:29
*Target : M48
*Crystal: 1.0000Mhz
*2004年6月2日改作菜单提示内容为缩写方式的24档4行LCD模式。
*****************************************************************************/
//ICC-AVR application builder : 2004-12-19 21:14:02
// Target : M8
// Crystal: 1.0000Mhz
#include <iom8v.h>
#include <macros.h>
/*#include <iom48v.h>
#include <macros.h>
//ICC-AVR application builder : 2004-12-7 14:51:21
// Target : M48
// Crystal: 8.0000Mhz(可校准内部RC振荡器)
// FUSE:0xFF,0xFF,0x32:(预分频得1MHZ系统时钟,禁止PB0时钟输出)*/
//定义定时器0 的重装值 100ms
#define RELOAD_HIGH 0x3C //0xD8//0x3C//4B
#define RELOAD_LOW 0xB0 //0xEF//0xB0//FF
#define ON 1 //不可为0,否则暂停时三极管热。
#define OFF 0 //不可为1,否则暂停时三极管热。
#define LEDON 0
#define S60 60 //定义60秒钟时间常数
#define S10 10 //定义10秒钟时间常数
#define M60 60 //定义60分钟时间常数
#define M5 5 //定义5分钟时间常数
#define M15 3 //定义15分钟时间常数,每3次5分钟检查一次。
#define M25 5 //定义25分钟时间常数,每5次5分钟检查一次。
#define M30 6 //定义30分钟时间常数,每6次5分钟检查一次。
#define H24 24 //定义24小时时间常数
#define osccal 0xFF //定义24小时时间常数
//定义按键弹跳时间
#define DB_VAL 1
//定义设置模式的最大时间间隔(秒)
#define TIMEOUT 30
//定义显示状态常数
#define DISP_BUSY 0x80
//定义显示命令常数
//#define DISP_FUNC 0x38 //功能:00111000(8线2行5X7光标)
#define DISP_FUNC 0x28 //功能:00101000(4线2行5X7光标)
#define DISP_ENTRY 0x06 //输入方式:00000110(光标右移、禁止屏滚)
//#define DISP_CURSOR 0x0E //光标控制显码:00001110(开显示、开光标、光标不闪)
#define DISP_CURSOR 0x0F //光标控制显码:00001111(开显示、开光标、光标闪)
//定义控制命令常数
#define DISP_OFF 0x08 //显示控制:00001000(关显示)
#define DISP_ON 0x0C //显示控制:00001000(开显示)
#define DISP_CLEAR 0x01 //清屏:00000001
#define DISP_HOME 0x02 //光标回HOME:00000010
#define DISP_POS 0x80 //DDRAM置地址控制码:10000000
//TG12864DDRAM行址定义
#define DISP_LINE1 0x00 //DDRAM第一行首址:00000000
#define DISP_LINE2 0x10 //DDRAM第二行首址:01000000
#define DISP_LINE3 0x08 //DDRAM第三行首址:00010000
#define DISP_LINE4 0x18 //DDRAM第四行首址:01010000
//TG1604DDRAM行址定义
//#define DISP_LINE1 0x00 //DDRAM第一行首址:00000000
//#define DISP_LINE2 0x40 //DDRAM第二行首址:01000000
//#define DISP_LINE3 0x10 //DDRAM第三行首址:00010000
//#define DISP_LINE4 0x50 //DDRAM第四行首址:01010000
/*M48定义LCD控制及在线汇编命令
#define DISPDATA PORTB //显示8位数据总线:B端口,I/O地址为0x05。
#define LCD_RS_SET asm("sbi 0x05,2") //PB2重定义:显示寄存器选择输出1,接LCD_P4->P16
#define LCD_RS_CLR asm("cbi 0x05,2") //PB2重定义:显示寄存器选择输出0,接LCD_P4->IC-P16
#define LCD_E_SET asm("sbi 0x05,3") //PB3重定义:显示使能输出,接LCD_P6->P17
#define LCD_E_CLR asm("cbi 0x05,3") //PB3重定义:显示禁止输出,接LCD_P6->P17
/*#define LCD_RS_SET PORTD |= 0x04 //PB2重定义:显示寄存器选择输出1,接LCD_P4->P16
#define LCD_RS_CLR PORTD &= ~0x04 //PB2重定义:显示寄存器选择输出0,接LCD_P4->IC-P16
#define LCD_E_SET PORTD |= 0x08 //PB3重定义:显示使能输出,接LCD_P6->P17
#define LCD_E_CLR PORTD &= ~0x08 //PB3重定义:显示禁止输出,接LCD_P6->P17
#define WAIT asm("nop\n nop") //空操作延时
/*M48定义各电磁阀控制及在线汇编命令
#define OPEN_V6 asm("sbi 0x08,3") //PORTC3操作定义:输出1,开V6。
#define CLOSE_V6 asm("cbi 0x08,3") //PORTC3操作定义:输出0,关V6。
#define OPEN_V1 asm("sbi 0x08,4") //PORTC4操作定义:输出1,开V1。
#define CLOSE_V1 asm("cbi 0x08,4") //PORTC4操作定义:输出0,关V1。
#define OPEN_V2 asm("sbi 0x08,5") //PORTC5操作定义:输出1,开V2。
#define CLOSE_V2 asm("cbi 0x08,5") //PORTC5操作定义:输出0,关V2。
#define OPEN_V3 asm("sbi 0x0B,0") //PORTD0操作定义:输出1,开V3。
#define CLOSE_V3 asm("cbi 0x0B,0") //PORTD0操作定义:输出0,关V3。
#define OPEN_V4 asm("sbi 0x0B,1") //PORTD1操作定义:输出1,开V4。
#define CLOSE_V4 asm("cbi 0x0B,1") //PORTD1操作定义:输出0,关V4。
#define OPEN_V5 asm("sbi 0x0B,2") //PORTD2操作定义:输出1,开V5。
#define CLOSE_V5 asm("cbi 0x0B,2") //PORTD2操作定义:输出0,关V5。
*/
/*M8定义LCD控制及在线汇编命令*/
#define DISPDATA PORTB //显示8位数据总线:B端口,I/O地址为0x18。
#define LCD_RS_SET asm("sbi 0x18,2") //PB2重定义:显示寄存器选择输出1,接LCD_P4->P16
#define LCD_RS_CLR asm("cbi 0x18,2") //PB2重定义:显示寄存器选择输出0,接LCD_P4->IC-P16
#define LCD_E_SET asm("sbi 0x18,3") //PB3重定义:显示使能输出,接LCD_P6->P17
#define LCD_E_CLR asm("cbi 0x18,3") //PB3重定义:显示禁止输出,接LCD_P6->P17
/*#define LCD_RS_SET PORTD |= 0x04 //PB2重定义:显示寄存器选择输出1,接LCD_P4->P16
#define LCD_RS_CLR PORTD &= ~0x04 //PB2重定义:显示寄存器选择输出0,接LCD_P4->IC-P16
#define LCD_E_SET PORTD |= 0x08 //PB3重定义:显示使能输出,接LCD_P6->P17
#define LCD_E_CLR PORTD &= ~0x08 //PB3重定义:显示禁止输出,接LCD_P6->P17*/
#define WAIT asm("nop\n nop") //空操作延时
/*M8定义各电磁阀控制及在线汇编命令*/
#define OPEN_V6 asm("sbi 0x15,3") //PORTC3操作定义:输出1,开V6。
#define CLOSE_V6 asm("cbi 0x15,3") //PORTC3操作定义:输出0,关V6。
#define OPEN_V1 asm("sbi 0x15,4") //PORTC4操作定义:输出1,开V1。
#define CLOSE_V1 asm("cbi 0x15,4") //PORTC4操作定义:输出0,关V1。
#define OPEN_V2 asm("sbi 0x15,5") //PORTC5操作定义:输出1,开V2。
#define CLOSE_V2 asm("cbi 0x15,5") //PORTC5操作定义:输出0,关V2。
#define OPEN_V3 asm("sbi 0x12,0") //PORTD0操作定义:输出1,开V3。
#define CLOSE_V3 asm("cbi 0x12,0") //PORTD0操作定义:输出0,关V3。
#define OPEN_V4 asm("sbi 0x12,1") //PORTD1操作定义:输出1,开V4。
#define CLOSE_V4 asm("cbi 0x12,1") //PORTD1操作定义:输出0,关V4。
#define OPEN_V5 asm("sbi 0x12,2") //PORTD2操作定义:输出1,开V5。
#define CLOSE_V5 asm("cbi 0x12,2") //PORTD2操作定义:输出0,关V5。
//#pragma data:code
const unsigned char screen[7][32]=
{
59,59,15,42,21,32,59,59,59,59,59,59,59,59,59,59,59,23,25,18,49,40,38,59,30,20,4,46,22,1,43,27,
59,59,55,31,52,11,59,59,59,41,56,23,25,17,35,59,59,45,57,7,46,22,59,59,59,59,58,23,25,18,49,59,
2,53,54,23,25,17,35,59,50,36,54,47,44,17,35,59,13,48,54,59,59,59,59,59,17,35,54,59,59,59,59,59,
2,53,54,7,46,22,59,59,50,36,54,47,44,7,46,22,46,22,54,59,59,59,59,59,34,19,54,59,59,59,12,59,
2,53,54,29,26,20,3,59,50,36,54,47,44,20,3,59,46,22,54,59,59,59,59,59,34,19,54,59,59,59,59,59,
2,53,54,23,25,18,49,59,50,36,54,47,44,18,49,59,13,48,54,59,59,59,59,59,49,32,54,59,59,59,59,59,
23,25,18,49,33,10,59,59,13,48,54,59,59,59,59,59,28,49,54,59,59,59,59,59,49,32,54,59,59,59,59,59
};
const unsigned char hsb[60]=
{
0xB1,0xB1,0xB2,0xB2,0xB2,0xB3,0xB3,0xB3,0xB4,0xB5,
0xB6,0xB6,0xB7,0xB9,0xB9,0xBB,0xBB,0xBB,0xBC,0xBC,
0xBC,0xBD,0xBF,0xC0,0xC2,0xC3,0xC3,0xC3,0xC4,0xC6,
0xC7,0xC8,0xC8,0xC9,0xCA,0xCA,0xCC,0xCD,0xCD,0xCD,
0xCF,0xD1,0xD3,0xD3,0xD4,0xD4,0xD5,0xD5,0xD6,0xD7,
0xD7,0xD7,0xD7,0xD7,0xA1,0xA2,0xA2,0xA2,0xA2,0xA1
};
const unsigned char lsb[60]=
{
0xB8,0xC3,0xD9,0xE2,0xE9,0xAC,0xC9,0xE9,0xFD,0xC8,
0xA8,0xAF,0xD6,0xDE,0xFD,0xB6,0xBB,0xD8,0xD3,0xE4,
0xEC,0xF8,0xD5,0xE4,0xA9,0xBD,0xDC,0xE6,0xE2,0xF8,
0xEB,0xAB,0xEB,0xE8,0xB1,0xD5,0xAC,0xA8,0xB3,0xEA,
0xB5,0xA1,0xAD,0xCD,0xDA,0xF1,0xE6,0xFD,0xD8,0xA2,
0xB4,0xBC,0xD4,0xF7,0xC3,0xB1,0xB2,0xB3,0xB4,0xA0
};
//#pragma data:data
unsigned char segment=0; //定义运行状态显示字符指针0,7,14
unsigned char statu; //定义运行状态显示字符指针0,7,14
unsigned char line=0; //定义被选档显示字符指针
unsigned char min_line=3; //最小行号,用于菜单显示计算。根据不同菜单层和菜单段取值3、7、15、23。
unsigned char max_line=3; //最大行号,用于菜单显示计算。根据不同菜单层和菜单段取值3、7、15、23。
unsigned char sel_mode=0; //=1时,选择键进入TOP/SUB切换模式;=2时,选择键进入待选择模式;=3时,选择键进入待启动模式。
unsigned char sel_mode_to=0; //为每次按键操作后的时间间隔计时器,软时间狗,控制恢复显示的执行。
unsigned char cur_session=0; //运行次数显示计数器,减到1后维持不变。
unsigned char cur_line=1; //屏幕光标指示当前行号
unsigned char sel_line=1; //由选择键选定的行号
unsigned char dir=0; //运行方向
unsigned char tmpdir=1; //恢复现场。
unsigned char runnum; //当前档运行次数记数缓存,用于向runnum1赋值。
unsigned char tmprunnum=6; //恢复现场。
unsigned char nowruning=0; //当前运行行号,用于确认选定行号更新
unsigned char second_cnt=20; //10 6M 20 12M
unsigned char sec=S60; //秒计时基数60
unsigned char sec10=S10; //10秒计时基数
unsigned char min5=M5; //5分钟计时基数
unsigned char min15=M15; //15分钟计时基数
unsigned char min25=M25; //25分钟计时基数
unsigned char min30=M30; //30分钟计时基数
unsigned char min=M60; //分计时基数
unsigned char hour=H24; //时计时基数
unsigned char disp_update=1;
long del;
char beingo[16]={"ABCDEFGHIJKLMNOP"};
#define xtal 8
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(xtal*143-2);i++);
}
void delay_ms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
delay_1ms();
i++;
}
}
/****************************************************************************
名称:M8-IO口初始化。原函数
功能:读入各功能初始值。
调用:main,T0服务子程
参数:无
返回:无
*****************************************************************************/
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00; //m103 output only
DDRC = 0x38;
PORTD = 0x00;
DDRD = 0x07;
}
//ADC initialize
// Conversion time: 832uS
void adc_init(void)
{
ADCSR = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSR = 0xC6;
}
//call this routine to initialise all peripherals
/****************************************************************************
名称:M8外设初始化。原函数
功能:读入各功能初始值。
调用:main,T0服务子程
参数:无
返回:无
*****************************************************************************/
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
// adc_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
/****************************************************************************
名称:M48-IO口初始化。原函数
功能:读入各功能初始值。
调用:main,T0服务子程
参数:无
返回:无
*****************************************************************************
void port_init(void) //IO口初始化
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00; //m103 output only
DDRC = 0x38;
PORTD = 0x00;
DDRD = 0x07;
}
/****************************************************************************
名称:M48外设初始化。原函数
功能:读入各功能初始值。
调用:main,T0服务子程
参数:无
返回:无
*****************************************************************************
//call this routine to initialize all peripherals
void init_devices(void) //外设初始化
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
//watchdog_init();
//timer1_init();
//adc_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x01; //timer 1 interrupt sources
TIMSK2 = 0x00; //timer 2 interrupt sources
PCMSK0 = 0x00; //pin change mask 0
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PCICR = 0x00; //pin change enable
PRR = 0x01; //power controller
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -