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

📄 avr单片机的嵌入式开发-照片显影机控制及显示程序.c

📁 avr单片机的嵌入式开发-照片显影机控制及显示程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************
ICC-AVR application builder : 2006-1-8 14:49:27
             胶片扩印机电机控制程序(ICCAVR6.31)
email:suming8341@163.com
Target : M128
Crystal: 8.0000Mhz

*****************************************************/


#include <iom128v.h>
#include <slavr.h>
#include <macros.h>

//各键管脚定义
//启动键PD.6
#define  start_key (PIND&0x40)
//清零键PD.7
#define  cls_key   (PIND&0x80)
//PC.7~PC.2电机步数调整键
#define  mt1_up   (PINC&0x80)
#define  mt1_down (PINC&0x40)
#define  mt2_up   (PINC&0x20)
#define  mt2_down (PINC&0x10)
#define  mt3_up   (PINC&0x08)
#define  mt3_down (PINC&0x04)
unsigned char mt3_adsb=0;
unsigned int  mt3_count=2500;//计数1初值,200hz启动,中断中改到250,2k hz
unsigned int  mt2_count=125;//计数器0初值,2khz
// #define steps2_ready 140
//unsigned int mt2_count=156 ;//计数0初值,200hz启动中断中改到2k hz,如用过渡须改分频值

//曝光结束信号PC.1
#define end_ack (PINC&0x02)
//电机2方向信号控制脚PORTB.0
#define set_dir2 asm("sbi 0x18,2")
#define clr_dir2 asm("cbi 0x18,2")
///////////////////////////////////////////////////////
/*纸张尺寸选择
按键引脚:
5寸——PE2
6寸---PE3
7寸---PE4
8寸---PE5*/

#define s5 (PINE&0x04)
#define s6 (PINE&0x08)
#define s7 (PINE&0x10)
#define s8 (PINE&0x20)
////////////////////////////////////////////////////
//密度设定值按键PD.4,PD.5
#define key_add (PIND&0x10)
#define key_sub (PIND&0x20)
//////////////////////////////////////////////	
//时钟8M
#define xtal 8
///////////电机步数的初始值,选择尺寸影响步数,在select_key()中实现/////

unsigned int step_num1=8000;
unsigned int step_inc1=0;
unsigned int step_count1=0;
#define steps1 (step_num1+step_inc1)
/////////////
unsigned int step_num3=24000;
unsigned int step_inc3=0;
unsigned int step_count3=0;
#define steps3 (step_num3+step_inc3)
#define steps3_1 (steps3/3)
#define steps3_2 ((steps3/3)*2)
#define step3_ready 400
////////////
unsigned int step_num2=3200;
unsigned int step_inc2=0;
unsigned int step_count2=0;
#define steps2 (step_num2+step_inc2)

//////////////////////////////////////////////////////
unsigned int i=1;//延时用
unsigned int MD=8;//全局变量,密度初值
unsigned char count=0;//计张数
unsigned char keynum=5;//纸型初值
/////////////////////////////////////////////////////
/*   定义液晶OCMJ4X8端口   */
//DATA_PORT=PORTA
#define data_port PORTA
//ASK=PORTE.6
#define ask (PINE&0x40) 
//ANSWER=PORTE.7
#define set_answer asm("sbi 0x03,7")
#define clr_answer asm("cbi 0x03,7")
//RESTE=PORTC.3
#define set_reset asm("sbi 0x18,7")
#define clr_reset asm("cbi 0x18,7") 
#define wait  asm("nop\n nop")
///////////////////////////////////////////////////////////
///////////////////////////////////////////////

const unsigned char num0[]={
/*--  文字:  0  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x03,0xF0,0x06,0x38,
0x0E,0x18,0x0E,0x18,0x0C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,
0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x0C,0x1C,0x0E,0x1C,0x0E,0x18,
0x06,0x38,0x07,0x70,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num1[]={
/*--  文字:  1  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x0F,0x80,
0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
0x01,0x80,0x1F,0xF0,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num2[]={
/*--  文字:  2  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xE0,0x1C,0xF0,
0x18,0x70,0x18,0x78,0x10,0x38,0x10,0x38,0x00,0x38,0x00,0x70,0x00,0x70,0x00,0x70,
0x00,0xE0,0x00,0xE0,0x01,0xC0,0x01,0x80,0x03,0x80,0x07,0x00,0x0E,0x08,0x0E,0x18,
0x1F,0xF8,0x3F,0xF8,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num3[]={
/*--  文字:  3  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0xF0,0x06,0x78,
0x0C,0x38,0x0C,0x18,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0xE0,0x03,0xF0,
0x01,0xF8,0x00,0x3C,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x0C,0x00,0x1C,0x0C,0x18,
0x1E,0x38,0x1F,0xE0,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num4[]={
/*--  文字:  4  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x70,0x00,0xF0,
0x00,0xF0,0x01,0xF0,0x01,0xF0,0x03,0x70,0x06,0x70,0x06,0x70,0x0C,0x70,0x0C,0x70,
0x18,0x70,0x38,0x70,0x3F,0xFC,0x3F,0xFC,0x3F,0xFC,0x00,0x70,0x00,0x70,0x00,0x70,
0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num5[]={
/*--  文字:  5  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x03,0xF8,0x03,0xF8,
0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0F,0x80,0x1F,0xE0,0x03,0xF0,0x00,0xF0,
0x00,0x38,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,
0x1C,0x60,0x1F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num6[]={
/*--  文字:  6  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xF0,0x01,0xC0,
0x03,0x00,0x07,0x00,0x0E,0x00,0x0E,0x00,0x0C,0x00,0x1C,0xC0,0x1F,0xF0,0x1F,0xF0,
0x1C,0x38,0x38,0x18,0x38,0x18,0x38,0x18,0x38,0x18,0x18,0x18,0x1C,0x18,0x1C,0x38,
0x1E,0x38,0x0F,0xF0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num7[]={
/*--  文字:  7  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x0F,0xF8,0x1F,0xF8,
0x18,0x38,0x10,0x38,0x10,0x30,0x00,0x30,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,
0x00,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x03,0x80,
0x03,0x80,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num8[]={
/*--  文字:  8  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xF0,0x1C,0x30,
0x1C,0x38,0x18,0x38,0x1C,0x38,0x1C,0x38,0x1E,0x38,0x0E,0x70,0x0F,0xE0,0x07,0xC0,
0x07,0xC0,0x0F,0xE0,0x1C,0xF0,0x1C,0x78,0x18,0x38,0x38,0x38,0x38,0x18,0x18,0x18,
0x1C,0x38,0x0F,0xF0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num9[]={
/*--  文字:  9  --*/
/*--  楷体_GB231224;  此字体下对应的点阵为:宽x高=16x33   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xE0,0x0C,0x70,
0x1C,0x38,0x18,0x38,0x38,0x38,0x38,0x18,0x38,0x18,0x38,0x18,0x18,0x18,0x1C,0x38,
0x1C,0x78,0x0F,0xF8,0x07,0xB8,0x00,0x78,0x00,0x70,0x00,0x70,0x00,0xE0,0x01,0xC0,
0x03,0xC0,0x07,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char *base[10]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9};

//********************延时函数**************************************************
//xtal:  宏定义,为晶振频率,单位为MHz
void Delay_ms(unsigned int n)
{
	unsigned int i,j;
	
	for (i=0;i<n;i++)
		for (j=1; j< (unsigned int)(xtal*143-2); j++);
}	
/////////////////////////////////////////////////////////////////////////////////

void delay()//延时15ms
{
Delay_ms(15);
}
//////////////////////////////////////////////////////
//液晶操作子函数
////////////////////////////////////////////////////////
/*     OCMJ4X8LCD初始化     */
void ocmj_init(void)
    {
	 MCUCR=0;
	 DDRA=0xff;
	 PORTA=0xff;
	 DDRE=0b10000000;
	 PORTE=0xff;
	 clr_reset;//LCD复位
	 delay_ms(10);
	 set_reset;
	 clr_answer;
	 delay_ms(10);
	 }
/*            写数据到LCD        */
void ocmj_write(unsigned char data)
    {
	 while(ask!=0)
	      ;
     data_port=data;
   	 wait;
	 set_answer;
	 wait;
	 while(ask==0)
	      ;		  
	 clr_answer; 
    }
/*         传送32*32ICO点阵数据到LCD       */
/*         x:0~15(字节为单位)  y:0~64      */
/*         ico_p:指向图形数据的指针        */	
void ico_tran(unsigned char x,unsigned char y,const unsigned char *ico_p)
     {
	  unsigned char i,j;
	  x+=4;
	  for(j=0;j<32;j++)
	     {
		  for(i=0;i<4;i++)
		    {
			 ocmj_write(0xf3);
			 ocmj_write(x);
			 ocmj_write(y);
			 ocmj_write(*ico_p);
			 ico_p++;
			 x++;
			}
		  x-=4;
		  y++;	
		 }
	 }
/*         传送bmp点阵数据到LCD            */
/*         x:0~15(字节为单位)  y:0~64      */
/*         bmp_p:指向图形数据的指针        */	
/*         high:位图高度(点阵行为单位)     */
/*         width:位图宽度(以字节为单位)?  */
void bmp_tran(unsigned char x,unsigned char y,unsigned char high,unsigned char width,const unsigned char *bmp_p)
     {
	  unsigned char i,j;
	  x+=4;
	  for(j=0;j<high;j++)
	     {
		  for(i=0;i<width;i++)
		    {
			 ocmj_write(0xf3);
			 ocmj_write(x);
			 ocmj_write(y);
			 ocmj_write(*bmp_p);
			 bmp_p++;
			 x++;
			}
		  x-=width;
		  y++;	
		 }
	 }	 
/*       传送LCD内部汉字数据到LCD         */
/*       x:0x00~0x07 y:0x00~0x03          */
void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p)
    {
	 x+=2;
     while((*hz_p)!=0)
	    {
		 ocmj_write(0xf0);
		 ocmj_write(x);
		 ocmj_write(y);
		 ocmj_write(*hz_p-0xa0);
		 hz_p++;
		 ocmj_write(*hz_p-0xa0);
		 hz_p++;
		 if(x<0x09)
 		    x++;
		 else
		    {
			 x=0x02;
			 y++;
			}	
		}
	}
/*          传送ASCII字母到LCD            */
/*          x:0x00~0x0f y:0~64            */	
void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p)
    {
	 x+=4;
	 while((*asc_p)!=0)
	    {
		 ocmj_write(0xf1);
		 ocmj_write(x);
		 ocmj_write(y);
		 ocmj_write(*asc_p);
		 asc_p++;
		 if (x<0x13) 
		    x++;
		 else
		   {
		    x=0x04;
			y+=8;		    
		   }	
		}	
	 }
////-----------------数字转asc码显示--------------------///
void number(unsigned char x,unsigned char y,unsigned int num)
{
 unsigned int box;
 unsigned char i;
 unsigned char temp[4];
 unsigned char *char_p;
   for(i=0;i<5;i++)
	    {
		 box=num%10+0x30;
		 temp[4-i]=(unsigned char)box;
		  num=num/10;
		}
		char_p=temp;
asc_tran( x,y,char_p);
}
/*---------------------数字传输--------------------------------------*/

 void num_tran(unsigned char x,unsigned char y,unsigned char num)
 {
  unsigned char num1,num2;
  if (num<10)
   bmp_tran(x,y,32,2,base[num]);
  else
   {
   num1=num/10;
   num2=num%10;
   bmp_tran(x,y,32,2,base[num1]);
   bmp_tran(x+2,y,32,2,base[num2]);
   }
 }
//*********************************液晶显示子程序*****************
 //-----------待机与扩印张数显示画面-------------------//
void wcount_lcd(void)
{

  ocmj_write(0xf4);//清屏
   //显示 待机中,您已印制 张
   hz_tran(0,0,"待机中");
   hz_tran(0,1,"您已印制");
   hz_tran(6,1,"张");
   hz_tran(0,3,"纸型");
   hz_tran(3,3,"寸");
   num_tran(4,36,keynum);
   num_tran(8,9,count);
   
}
/*----------------设定步数画面------------------------------------*/
void send_lcd(unsigned int i)
{
 ocmj_write(0xf4);//清屏
 hz_tran(1,0,"号电机设定步为");
 hz_tran(1,2,"调整步数为");

 switch (i)
 {
 case 1:/*显示一,step_num1,step_inc1;*/
           hz_tran(0,0,"一"); 
		   number(6,20,step_num1);
		   number(6,50,step_inc1);
		   break;
 case 2:/*显示二,step_num2,step_inc2;*/
           hz_tran(0,0,"二");
		   number(2,20,step_num2);
		   number(2,50,step_inc2);
           break;
 case 3:/*显示三,step_num3,step_inc3;*/
           hz_tran(0,0,"三"); 
		   number(2,20,step_num3);
		   number(2,50,step_inc3);
           break;
 default: break;
 }

}
//--------------开机画面------------------------------//
void  welcome(void)
{
 ocmj_write(0xf4);//清屏
 hz_tran(0,0,"欢迎您使用本设备");
 hz_tran(0,1,"某某公司");
 hz_tran(2,3,"竭诚为您服务");
}
//------------启动时界面-------------------//
void start_lcd(void)
{
 
 //启动备纸中
 ocmj_write(0xf4);//清屏
 hz_tran(1,1,"启动备纸中");
 
}
//------------曝光时界面--------------------//
void  exposal_lcd(void)
{
  ocmj_write(0xf4);//清屏
  hz_tran(2,0,"显影中");
  hz_tran(1,2,"请不要按键");// 曝光中,请不要按键

}

//-----------纸张选型时界面--------------//
void  selec_lcd(unsigned char i)
{

    ocmj_write(0xf4);//清屏
   hz_tran(0,1,"您选的纸型为");
   hz_tran(7,1,"寸");//您选的纸型为 寸
   num_tran(12,8,i);
  // delay_ms(3000);
}
//*****************************************************************
///////////////////////////////////////////////////////
//128初始化函数
///////////////////////////////////////////////////////
/*
void timer1_init(void)
{
 TCNT1H = 0x00; //setup
 TCNT1L = 0x00;
 OCR1AH = 0x00;
 OCR1AL = 0x3f;
 OCR1BH = 0x00;
 OCR1BL = 0x3f;
 TCCR1A = 0xb9;
 TCCR1B = 0x02; //start Timer
 TIMSK = 0x05; //timer interrupt sources
 SEI();
}
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 if(step_count3<=steps3)
   step_count3++;
 else
 step_count3=0;
 TCCR1B = 0x00; 
}

															  
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT0 = 0x00; //set count
 OCR0  = 0x7f;
 //TCCR0 = 0x7a;//快速pwm,64分频。
}

#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
 if(step_count2<=steps2)
   step_count2++;
 else
 step_count2=0;
 TCCR0= 0x00; 
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -