⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mc041210.c

📁 C语言开发使LCD显示汉字程序,采用自带汉字库的LCD模块.
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
*			        梁小樑为明康冷媒加注控制器作
*					       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 + -